diff --git a/src/bin.rs b/src/bin.rs index 35acf63f7..d33722238 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -254,8 +254,12 @@ fn main() -> std::result::Result<(), std::io::Error> { UIMode::Normal => { match k { Key::Char('q') | Key::Char('Q') => { - drop(state); - break 'main; + if state.can_quit_cleanly() { + drop(state); + break 'main; + } else { + state.redraw(); + } }, Key::Char(' ') => { state.mode = UIMode::Execute; diff --git a/ui/src/components.rs b/ui/src/components.rs index 583c8e9c4..f19bcf998 100644 --- a/ui/src/components.rs +++ b/ui/src/components.rs @@ -90,6 +90,9 @@ pub trait Component: Display + Debug + Send { fn is_visible(&self) -> bool { true } + fn can_quit_cleanly(&mut self) -> bool { + true + } fn set_dirty(&mut self); fn kill(&mut self, _id: ComponentId, _context: &mut Context) {} fn set_id(&mut self, _id: ComponentId) {} diff --git a/ui/src/components/mail/compose.rs b/ui/src/components/mail/compose.rs index 0da317d75..3f6da8eb7 100644 --- a/ui/src/components/mail/compose.rs +++ b/ui/src/components/mail/compose.rs @@ -756,6 +756,13 @@ impl Component for Composer { fn set_id(&mut self, id: ComponentId) { self.id = id; } + + fn can_quit_cleanly(&mut self) -> bool { + /* Play it safe and ask user for confirmation */ + self.mode = ViewMode::Discard(self.id); + self.set_dirty(); + false + } } pub fn send_draft(context: &mut Context, account_cursor: usize, draft: Draft) -> bool { diff --git a/ui/src/components/utilities.rs b/ui/src/components/utilities.rs index 943468bcc..8fa945526 100644 --- a/ui/src/components/utilities.rs +++ b/ui/src/components/utilities.rs @@ -1066,6 +1066,10 @@ impl Component for StatusBar { fn set_id(&mut self, id: ComponentId) { self.id = id; } + + fn can_quit_cleanly(&mut self) -> bool { + self.container.can_quit_cleanly() + } } #[derive(Debug)] @@ -1530,6 +1534,17 @@ impl Component for Tabbed { fn set_id(&mut self, id: ComponentId) { self.id = id; } + + fn can_quit_cleanly(&mut self) -> bool { + for (i, c) in self.children.iter_mut().enumerate() { + if !c.can_quit_cleanly() { + self.cursor_pos = i; + self.set_dirty(); + return false; + } + } + true + } } type EntryIdentifier = Vec; diff --git a/ui/src/state.rs b/ui/src/state.rs index 326a906af..2764d6b17 100644 --- a/ui/src/state.rs +++ b/ui/src/state.rs @@ -514,6 +514,10 @@ impl State { } } + pub fn can_quit_cleanly(&mut self) -> bool { + self.components.iter_mut().all(|c| c.can_quit_cleanly()) + } + pub fn register_component(&mut self, component: Box) { self.components.push(component); }