diff --git a/examples/select.rs b/examples/select.rs index c54df58..fdf7c61 100644 --- a/examples/select.rs +++ b/examples/select.rs @@ -211,6 +211,10 @@ impl Component for SelectAlfa { Event::Keyboard(KeyEvent { code: Key::Enter, .. }) => self.perform(Cmd::Submit), + Event::Keyboard(KeyEvent { + code: Key::Delete | Key::Backspace, + .. + }) => self.perform(Cmd::Cancel), Event::Keyboard(KeyEvent { code: Key::Tab, .. }) => return Some(Msg::SelectAlfaBlur), Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => return Some(Msg::AppClose), _ => CmdResult::None, @@ -261,6 +265,10 @@ impl Component for SelectBeta { Event::Keyboard(KeyEvent { code: Key::Enter, .. }) => self.perform(Cmd::Submit), + Event::Keyboard(KeyEvent { + code: Key::Delete | Key::Backspace, + .. + }) => self.perform(Cmd::Cancel), Event::Keyboard(KeyEvent { code: Key::Tab, .. }) => return Some(Msg::SelectBetaBlur), Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => return Some(Msg::AppClose), _ => CmdResult::None, diff --git a/src/components/select.rs b/src/components/select.rs index 9a67863..d1bcb9e 100644 --- a/src/components/select.rs +++ b/src/components/select.rs @@ -45,8 +45,12 @@ use tuirealm::{Frame, MockComponent, State, StateValue}; /// Component states #[derive(Default)] pub struct SelectStates { - pub choices: Vec, // Available choices + /// Available choices + pub choices: Vec, + /// Currently selected choice pub selected: usize, + /// Choice selected before opening the tab + pub previously_selected: usize, pub tab_open: bool, } @@ -110,9 +114,16 @@ impl SelectStates { /// /// Open tab pub fn open_tab(&mut self) { + self.previously_selected = self.selected; self.tab_open = true; } + /// Cancel tab open + pub fn cancel_tab(&mut self) { + self.close_tab(); + self.selected = self.previously_selected; + } + /// ### is_tab_open /// /// Returns whether the tab is open @@ -379,6 +390,12 @@ impl MockComponent for Select { self.states .select(value.unwrap_payload().unwrap_one().unwrap_usize()); } + Attribute::Focus if self.states.is_tab_open() => { + if let AttrValue::Flag(false) = value { + self.states.cancel_tab(); + } + self.props.set(attr, value); + } attr => { self.props.set(attr, value); } @@ -413,6 +430,10 @@ impl MockComponent for Select { true => CmdResult::Changed(State::One(StateValue::Usize(self.states.selected))), } } + Cmd::Cancel => { + self.states.cancel_tab(); + CmdResult::Submit(self.state()) + } Cmd::Submit => { // Open or close tab if self.states.is_tab_open() { @@ -503,6 +524,16 @@ mod test { assert_eq!(states.selected, 1); states.prev_choice(true); assert_eq!(states.selected, 0); + // Cancel tab + states.close_tab(); + states.select(2); + states.open_tab(); + states.prev_choice(true); + states.prev_choice(true); + assert_eq!(states.selected, 0); + states.cancel_tab(); + assert_eq!(states.selected, 2); + assert_eq!(states.is_tab_open(), false); } #[test]