Pipe events into subviews (#13)

and match only unhandled events afterwards
This commit is contained in:
Jens K. 2024-12-12 18:43:12 +01:00 committed by GitHub
parent 64300631c7
commit 6c7bedabe3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 41 additions and 64 deletions

View File

@ -71,13 +71,13 @@ impl App {
pub async fn run(&mut self, mut terminal: Terminal, mut events: Events) -> Result<()> { pub async fn run(&mut self, mut terminal: Terminal, mut events: Events) -> Result<()> {
while self.is_running() { while self.is_running() {
if let Some(event) = events.next().await { if let Some(event) = events.next().await {
// Pipe events into subviews and handle 'rest' events only // Pipe events into subviews and handle only 'unhandled' events afterwards
match self.content { if let Some(unhandled) = match self.content {
Content::Countdown => self.countdown.update(event.clone()), Content::Countdown => self.countdown.update(event.clone()),
Content::Timer => self.timer.update(event.clone()), Content::Timer => self.timer.update(event.clone()),
Content::Pomodoro => self.pomodoro.update(event.clone()), Content::Pomodoro => self.pomodoro.update(event.clone()),
}; } {
match event { match unhandled {
Event::Render | Event::Resize => { Event::Render | Event::Resize => {
self.draw(&mut terminal)?; self.draw(&mut terminal)?;
} }
@ -86,6 +86,7 @@ impl App {
} }
} }
} }
}
Ok(()) Ok(())
} }
@ -93,14 +94,6 @@ impl App {
self.mode != Mode::Quit self.mode != Mode::Quit
} }
fn is_edit_mode(&mut self) -> bool {
match self.content {
Content::Countdown => self.countdown.is_edit_mode(),
Content::Pomodoro => self.pomodoro.is_edit_mode(),
_ => false,
}
}
fn handle_key_event(&mut self, key: KeyEvent) { fn handle_key_event(&mut self, key: KeyEvent) {
debug!("Received key {:?}", key.code); debug!("Received key {:?}", key.code);
match key.code { match key.code {
@ -109,18 +102,8 @@ impl App {
KeyCode::Char('t') => self.content = Content::Timer, KeyCode::Char('t') => self.content = Content::Timer,
KeyCode::Char('p') => self.content = Content::Pomodoro, KeyCode::Char('p') => self.content = Content::Pomodoro,
KeyCode::Char('m') => self.show_menu = !self.show_menu, KeyCode::Char('m') => self.show_menu = !self.show_menu,
KeyCode::Up => { KeyCode::Up => self.show_menu = true,
// TODO: Pipe events into subviews properly KeyCode::Down => self.show_menu = false,
if !self.is_edit_mode() {
self.show_menu = true
}
}
KeyCode::Down => {
// TODO: Pipe events into subviews properly
if !self.is_edit_mode() {
self.show_menu = false
}
}
_ => {} _ => {}
}; };
} }

View File

@ -76,5 +76,5 @@ fn crossterm_stream() -> Pin<Box<dyn Stream<Item = Event>>> {
} }
pub trait EventHandler { pub trait EventHandler {
fn update(&mut self, _: Event); fn update(&mut self, _: Event) -> Option<Event>;
} }

View File

@ -22,14 +22,11 @@ impl Countdown {
pub const fn new(clock: Clock<clock::Countdown>) -> Self { pub const fn new(clock: Clock<clock::Countdown>) -> Self {
Self { clock } Self { clock }
} }
pub fn is_edit_mode(&mut self) -> bool {
self.clock.is_edit_mode()
}
} }
impl EventHandler for Countdown { impl EventHandler for Countdown {
fn update(&mut self, event: Event) { fn update(&mut self, event: Event) -> Option<Event> {
let edit_mode = self.clock.is_edit_mode();
match event { match event {
Event::Tick => { Event::Tick => {
self.clock.tick(); self.clock.tick();
@ -47,22 +44,23 @@ impl EventHandler for Countdown {
KeyCode::Char('e') => { KeyCode::Char('e') => {
self.clock.toggle_edit(); self.clock.toggle_edit();
} }
KeyCode::Left => { KeyCode::Left if edit_mode => {
self.clock.edit_next(); self.clock.edit_next();
} }
KeyCode::Right => { KeyCode::Right if edit_mode => {
self.clock.edit_prev(); self.clock.edit_prev();
} }
KeyCode::Up => { KeyCode::Up if edit_mode => {
self.clock.edit_up(); self.clock.edit_up();
} }
KeyCode::Down => { KeyCode::Down if edit_mode => {
self.clock.edit_down(); self.clock.edit_down();
} }
_ => {} _ => return Some(event),
}, },
_ => {} _ => return Some(event),
} }
None
} }
} }

View File

@ -72,14 +72,11 @@ impl Pomodoro {
Mode::Work => Mode::Pause, Mode::Work => Mode::Pause,
}; };
} }
pub fn is_edit_mode(&mut self) -> bool {
self.get_clock().is_edit_mode()
}
} }
impl EventHandler for Pomodoro { impl EventHandler for Pomodoro {
fn update(&mut self, event: Event) { fn update(&mut self, event: Event) -> Option<Event> {
let edit_mode = self.get_clock().is_edit_mode();
match event { match event {
Event::Tick => { Event::Tick => {
self.get_clock().tick(); self.get_clock().tick();
@ -91,35 +88,33 @@ impl EventHandler for Pomodoro {
KeyCode::Char('e') => { KeyCode::Char('e') => {
self.get_clock().toggle_edit(); self.get_clock().toggle_edit();
} }
KeyCode::Left => { KeyCode::Left if edit_mode => {
if self.get_clock().is_edit_mode() {
self.get_clock().edit_next(); self.get_clock().edit_next();
} else { }
KeyCode::Left if edit_mode => {
// `next` is acting as same as a `prev` function, we don't have // `next` is acting as same as a `prev` function, we don't have
self.next(); self.next();
} }
KeyCode::Right if edit_mode => {
self.get_clock().edit_prev();
} }
KeyCode::Right => { KeyCode::Right => {
if self.get_clock().is_edit_mode() {
self.get_clock().edit_prev();
} else {
self.next(); self.next();
} }
} KeyCode::Up if edit_mode => {
KeyCode::Up => {
self.get_clock().edit_up(); self.get_clock().edit_up();
} }
KeyCode::Down => { KeyCode::Down if edit_mode => {
self.get_clock().edit_down(); self.get_clock().edit_down();
} }
KeyCode::Char('r') => { KeyCode::Char('r') => {
self.get_clock().reset(); self.get_clock().reset();
} }
_ => {} _ => return Some(event),
}, },
_ => return Some(event),
_ => {}
} }
None
} }
} }

View File

@ -24,7 +24,7 @@ impl Timer {
} }
impl EventHandler for Timer { impl EventHandler for Timer {
fn update(&mut self, event: Event) { fn update(&mut self, event: Event) -> Option<Event> {
match event { match event {
Event::Tick => { Event::Tick => {
self.clock.tick(); self.clock.tick();
@ -35,8 +35,9 @@ impl EventHandler for Timer {
Event::Key(key) if key.code == KeyCode::Char('r') => { Event::Key(key) if key.code == KeyCode::Char('r') => {
self.clock.reset(); self.clock.reset();
} }
_ => {} _ => return Some(event),
} }
None
} }
} }