allow selecting button in modal

This commit is contained in:
🪞👃🪞 2025-04-04 16:46:03 +03:00
parent 2e072cb51c
commit 1d1fc483ba
4 changed files with 37 additions and 15 deletions

View file

@ -31,8 +31,8 @@ impl Handle<TuiIn> for Taggart {
let event = &*input.event(); let event = &*input.event();
match &self.mode { match &self.mode {
Some(Mode::Edit { .. }) => self.mode_edit(event), Some(Mode::Edit { .. }) => self.mode_edit(event),
Some(Mode::Save { .. }) => self.mode_save(event), Some(Mode::Save { value }) => self.mode_save(event, *value),
Some(Mode::Quit { .. }) => self.mode_quit(event), Some(Mode::Quit { value }) => self.mode_quit(event, *value),
None => match event { None => match event {
press!(Char('q')) => { self.quit_begin(&input) }, press!(Char('q')) => { self.quit_begin(&input) },
press!(Char('w')) => { self.save_begin() }, press!(Char('w')) => { self.save_begin() },

View file

@ -8,10 +8,17 @@ impl Taggart {
self.mode = Some(Mode::Quit { value: 1 }) self.mode = Some(Mode::Quit { value: 1 })
} }
} }
pub fn mode_quit (&mut self, event: &Event) { pub fn mode_quit (&mut self, event: &Event, value: u8) {
match event { match event {
press!(Esc) => { self.mode = None }, press!(Esc) => { self.mode = None },
_ => todo!() press!(Left) => { self.mode = Some(Mode::Quit {
value: value.overflowing_sub(1).0.min(2)
}) },
press!(Right) => { self.mode = Some(Mode::Quit {
value: (value + 1) % 3
}) },
press!(Enter) => todo!(),
_ => {}
} }
} }
} }

View file

@ -6,10 +6,17 @@ impl Taggart {
self.mode = Some(Mode::Save { value: 1 }) self.mode = Some(Mode::Save { value: 1 })
} }
} }
pub fn mode_save (&mut self, event: &Event) { pub fn mode_save (&mut self, event: &Event, value: u8) {
match event { match event {
press!(Esc) => { self.mode = None }, press!(Esc) => { self.mode = None }
_ => todo!() press!(Left) => { self.mode = Some(Mode::Save {
value: value.overflowing_sub(1).0.min(2)
}) },
press!(Right) => { self.mode = Some(Mode::Save {
value: (value + 1) % 3
}) },
press!(Enter) => todo!(),
_ => {}
} }
} }
} }

View file

@ -24,10 +24,14 @@ impl Content<TuiOut> for Taggart {
Color::Rgb(48,48,48), Color::Rgb(48,48,48),
Modifier::DIM Modifier::DIM
); );
let message = Bsp::s(format!("Save {} change(s)?", self.tasks.len()), let options = [
Bsp::s("", if value == 0 { "[ Clear changes ]" } else { " Clear changes " },
Bsp::e(" Clear changes ", Bsp::e(" Continue editing ", " Save ")))); if value == 1 { "[ Continue editing ]" } else { " Continue editing " },
let modal = Self::modal(message); if value == 2 { "[ Write and continue ]" } else { " Write and continue " },
];
let modal = Self::modal(Bsp::s(
format!("Save {} change(s)?", self.tasks.len()),
Bsp::s("", Bsp::e(options[0], Bsp::e(options[1], options[2])))));
Content::render(&modal, to) Content::render(&modal, to)
}, },
Some(Mode::Quit { value }) => { Some(Mode::Quit { value }) => {
@ -36,10 +40,14 @@ impl Content<TuiOut> for Taggart {
Color::Rgb(48,48,48), Color::Rgb(48,48,48),
Modifier::DIM Modifier::DIM
); );
let message = Bsp::s(format!("Save {} change(s) before exiting?", self.tasks.len()), let options = [
Bsp::s("", if value == 0 { "[ Exit without saving ]" } else { " Exit without saving " },
Bsp::e(" Exit without saving ", Bsp::e(" Cancel ", " Save and exit ")))); if value == 1 { "[ Cancel ]" } else { " Cancel " },
let modal = Self::modal(message); if value == 2 { "[ Write and exit ]" } else { " Write and exit " },
];
let modal = Self::modal(Bsp::s(
format!("Save {} change(s) before exiting?", self.tasks.len()),
Bsp::s("", Bsp::e(options[0], Bsp::e(options[1], options[2])))));
Content::render(&modal, to) Content::render(&modal, to)
}, },
_ => {}, _ => {},