summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2019-09-27 13:14:16 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2019-09-27 13:40:02 +0300
commitd44a68ec6950c533cf67ee2a34f9888a4ae569cc (patch)
tree53290428c5e295fcc6c0999dcbfd92fc54acfb13
parent713c4f73b991544259301d87fd2c79007e96db8f (diff)
ui: don't quit if editing a draft
Ask user to save draft or discard it.
-rw-r--r--src/bin.rs8
-rw-r--r--ui/src/components.rs3
-rw-r--r--ui/src/components/mail/compose.rs7
-rw-r--r--ui/src/components/utilities.rs15
-rw-r--r--ui/src/state.rs4
5 files changed, 35 insertions, 2 deletions
diff --git a/src/bin.rs b/src/bin.rs
index 35acf63f..d3372223 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 583c8e9c..f19bcf99 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 0da317d7..3f6da8eb 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 943468bc..8fa94552 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<u8>;
diff --git a/ui/src/state.rs b/ui/src/state.rs
index 326a906a..2764d6b1 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<dyn Component>) {
self.components.push(component);
}