(pomodoro/countdown) Change initial value (#79)

- While editing, an user can apply changes as a new initial value (pomodoro/countdown only).
- New keybinding: `[^s]save initial value` 
- Update keybinding: `[s]ave changes` (instead of `[Enter]`)
- Refactor event handling to re-structure `edit` / `non-edit` modes.
- Refactor footer to reflect latest keybindings
This commit is contained in:
Jens Krause
2025-05-02 12:39:26 +02:00
committed by GitHub
parent 6b068bbd09
commit 52ed8267be
7 changed files with 263 additions and 167 deletions

View File

@@ -162,6 +162,96 @@ impl TuiEventHandler for CountdownState {
edit_time.set_max_time(max_time);
}
}
// EDIT CLOCK mode
TuiEvent::Key(key) if self.is_clock_edit_mode() => match key.code {
// skip editing
KeyCode::Esc => {
// Important: set current value first
self.clock.set_current_value(*self.clock.get_prev_value());
// before toggling back to non-edit mode
self.clock.toggle_edit();
}
// Apply changes and set new initial value
KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
// toggle edit mode
self.clock.toggle_edit();
// set initial value
self.clock
.set_initial_value(*self.clock.get_current_value());
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
// Apply changes
KeyCode::Char('s') => {
// toggle edit mode
self.clock.toggle_edit();
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
KeyCode::Right => {
self.clock.edit_prev();
}
KeyCode::Left => {
self.clock.edit_next();
}
KeyCode::Up => {
self.clock.edit_up();
}
KeyCode::Down => {
self.clock.edit_down();
}
_ => return Some(event),
},
// EDIT LOCAL TIME mode
TuiEvent::Key(key) if self.is_time_edit_mode() => match key.code {
// skip editing
KeyCode::Esc => {
self.edit_time = None;
}
// Apply changes and set new initial value
KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
if let Some(edit_time) = &mut self.edit_time.clone() {
// Order matters:
// 1. update current value
self.edit_time_done(edit_time);
// 2. set initial value
self.clock
.set_initial_value(*self.clock.get_current_value());
}
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
// Apply changes of editing by local time
KeyCode::Char('s') => {
if let Some(edit_time) = &mut self.edit_time.clone() {
self.edit_time_done(edit_time)
}
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
// move edit position to the left
KeyCode::Left => {
// safe unwrap because we are in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().next();
}
// move edit position to the right
KeyCode::Right => {
// safe unwrap because we are in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().prev();
}
// Value up
KeyCode::Up => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().up();
}
// Value down
KeyCode::Down => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().down();
}
_ => return Some(event),
},
// default mode
TuiEvent::Key(key) => match key.code {
KeyCode::Char('r') => {
// reset both clocks to use intial values
@@ -187,23 +277,8 @@ impl TuiEventHandler for CountdownState {
self.edit_time_done(edit_time);
}
}
// skip editing clock
KeyCode::Esc if self.is_clock_edit_mode() => {
// Important: set current value first
self.clock.set_current_value(*self.clock.get_prev_value());
// before toggling back to non-edit mode
self.clock.toggle_edit();
}
// skip editing by local time
KeyCode::Esc if self.is_time_edit_mode() => {
self.edit_time = None;
}
// Enter edit by local time mode
KeyCode::Char('e')
if key.modifiers.contains(KeyModifiers::CONTROL)
&& !self.is_time_edit_mode() =>
{
KeyCode::Char('e') if key.modifiers.contains(KeyModifiers::CONTROL) => {
// set `edit_time`
self.edit_time = Some(EditTimeState::new(EditTimeStateArgs {
time: self.time_to_edit(),
@@ -216,9 +291,8 @@ impl TuiEventHandler for CountdownState {
self.elapsed_clock.toggle_pause();
}
}
// Enter edit clock
KeyCode::Char('e') if !self.is_clock_edit_mode() => {
// Enter edit clock mode
KeyCode::Char('e') => {
// toggle edit mode
self.clock.toggle_edit();
@@ -227,53 +301,6 @@ impl TuiEventHandler for CountdownState {
self.elapsed_clock.toggle_pause();
}
}
// Apply changes of editing by local time
KeyCode::Enter if self.is_time_edit_mode() => {
if let Some(edit_time) = &mut self.edit_time.clone() {
self.edit_time_done(edit_time)
}
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
// Apply changes of editing clock
// Note: Using Ctrl+e is deprecated, use Enter instead
KeyCode::Enter if self.is_clock_edit_mode() => {
// toggle edit mode
self.clock.toggle_edit();
// always reset `elapsed_clock`
self.elapsed_clock.reset();
}
KeyCode::Left if self.is_clock_edit_mode() => {
self.clock.edit_next();
}
KeyCode::Left if self.is_time_edit_mode() => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().next();
}
KeyCode::Right if self.is_clock_edit_mode() => {
self.clock.edit_prev();
}
KeyCode::Right if self.is_time_edit_mode() => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().prev();
}
KeyCode::Up if self.is_clock_edit_mode() => {
self.clock.edit_up();
}
KeyCode::Up if self.is_time_edit_mode() => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().up();
}
KeyCode::Down if self.is_clock_edit_mode() => {
self.clock.edit_down();
}
KeyCode::Down if self.is_time_edit_mode() => {
// safe unwrap because of previous check in `is_time_edit_mode`
self.edit_time.as_mut().unwrap().down();
}
_ => return Some(event),
},
_ => return Some(event),