diff options
author | Joscha <joscha@plugh.de> | 2022-09-08 22:57:04 +0200 |
---|---|---|
committer | Joscha <joscha@plugh.de> | 2022-09-08 22:57:04 +0200 |
commit | d92c7cb98e5e24a942f18b8e57c838d299b96762 (patch) | |
tree | baabfeb655daa00a3abb18cd7346ac83edabc342 | |
parent | f49481cb103ad9bba4aca6fc70eb1288b991ce6b (diff) |
Add room deletion confirmation popup
-rw-r--r-- | CHANGELOG.md | 3 | ||||
-rw-r--r-- | src/ui/rooms.rs | 76 |
2 files changed, 68 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index af2ce3d..cd71660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ Procedure when bumping the version number: ## Unreleased +### Added +- Room deletion confirmation popup + ### Fixed - Cursor being visible through popups diff --git a/src/ui/rooms.rs b/src/ui/rooms.rs index 80c4b4c..686db4e 100644 --- a/src/ui/rooms.rs +++ b/src/ui/rooms.rs @@ -20,8 +20,8 @@ use super::widgets::editor::EditorState; use super::widgets::join::{HJoin, Segment, VJoin}; use super::widgets::layer::Layer; use super::widgets::list::{List, ListState}; -use super::widgets::padding::Padding; use super::widgets::popup::Popup; +use super::widgets::resize::Resize; use super::widgets::text::Text; use super::widgets::BoxedWidget; use super::{util, UiEvent}; @@ -30,6 +30,7 @@ enum State { ShowList, ShowRoom(String), Connect(EditorState), + Delete(String, EditorState), } enum Order { @@ -135,21 +136,52 @@ impl Rooms { Self::new_room_widget(editor), ]) .into(), + State::Delete(name, editor) => Layer::new(vec![ + self.rooms_widget().await, + Self::delete_room_widget(name, editor), + ]) + .into(), } } fn new_room_widget(editor: &EditorState) -> BoxedWidget { let room_style = ContentStyle::default().bold().blue(); let editor = editor.widget().highlight(|s| Styled::new(s, room_style)); - Popup::new( - Padding::new(HJoin::new(vec![ + Popup::new(HJoin::new(vec![ + Segment::new(Text::new(("&", room_style))), + Segment::new(editor).priority(0), + ])) + .title("Connect to") + .build() + } + + fn delete_room_widget(name: &str, editor: &EditorState) -> BoxedWidget { + let warn_style = ContentStyle::default().bold().red(); + let room_style = ContentStyle::default().bold().blue(); + let editor = editor.widget().highlight(|s| Styled::new(s, room_style)); + let text = Styled::new_plain("Are you sure you want to delete ") + .then("&", room_style) + .then(name, room_style) + .then_plain("?\n\n") + .then_plain("This will delete the entire room history from your vault. ") + .then_plain("To shrink your vault afterwards, run ") + .then("cove gc", ContentStyle::default().italic().grey()) + .then_plain(".\n\n") + .then_plain("To confirm the deletion, ") + .then_plain("enter the full name of the room and press enter:"); + Popup::new(VJoin::new(vec![ + // The HJoin prevents the text from filling up the entire available + // space if the editor is wider than the text. + Segment::new(HJoin::new(vec![Segment::new( + Resize::new(Text::new(text).wrap(true)).max_width(54), + )])), + Segment::new(HJoin::new(vec![ Segment::new(Text::new(("&", room_style))), Segment::new(editor).priority(0), - ])) - .left(1), - ) - .title("Connect to") - .inner_padding(false) + ])), + ])) + .title(("Delete room", warn_style)) + .border(warn_style) .build() } @@ -321,6 +353,12 @@ impl Rooms { bindings.binding("enter", "connect to room"); util::list_editor_key_bindings(bindings, Self::room_char, false); } + State::Delete(_, _) => { + bindings.heading("Rooms"); + bindings.binding("esc", "abort"); + bindings.binding("enter", "delete room"); + util::list_editor_key_bindings(bindings, Self::room_char, false); + } } } @@ -393,10 +431,8 @@ impl Rooms { } key!('n') => self.state = State::Connect(EditorState::new()), key!('X') => { - // TODO Check whether user wanted this via popup if let Some(name) = self.list.cursor() { - self.euph_rooms.remove(&name); - self.vault.euph(name.clone()).delete(); + self.state = State::Delete(name, EditorState::new()); } } key!('s') => { @@ -444,6 +480,24 @@ impl Rooms { ) } }, + State::Delete(name, editor) => match event { + key!(Esc) => self.state = State::ShowList, + key!(Enter) if editor.text() == *name => { + self.euph_rooms.remove(name); + self.vault.euph(name.clone()).delete(); + self.state = State::ShowList; + } + _ => { + return util::handle_editor_input_event( + editor, + terminal, + crossterm_lock, + event, + Self::room_char, + false, + ) + } + }, } true |