From c84a25637646a48f94d642ca97e47ff14175ba39 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 13 Nov 2023 13:31:46 -0700 Subject: [PATCH] Undo/redo support --- Cargo.lock | 41 +++++++++++++++++++++++++++++++++++++++-- src/config.rs | 6 ++++++ src/main.rs | 16 ++++++++++++++++ src/menu.rs | 4 ++-- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d29338..0440c45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -878,7 +878,7 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.10.0" -source = "git+https://github.com/pop-os/cosmic-text?branch=vi-editor#d001e5c09eef98ee0c3b1f549132924d32aa63ec" +source = "git+https://github.com/pop-os/cosmic-text?branch=vi-editor#5352fdee940ef009ea978837afdfc44c468f7be8" dependencies = [ "fontdb 0.15.0", "libm", @@ -891,6 +891,7 @@ dependencies = [ "swash", "syntect", "sys-locale", + "undo_2", "unicode-bidi", "unicode-linebreak", "unicode-script", @@ -2764,7 +2765,7 @@ dependencies = [ [[package]] name = "modit" version = "0.1.0" -source = "git+https://github.com/pop-os/modit.git#94896d457c31079b9d6c19e592984c4262e4774e" +source = "git+https://github.com/pop-os/modit.git#add73b87f02db213b74a8f03ad24a691e9b2446b" dependencies = [ "log", ] @@ -3844,6 +3845,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.37.27" @@ -3981,6 +3991,21 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6" +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "serde" version = "1.0.192" @@ -4634,6 +4659,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "undo_2" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9355dd2f470d984344735b95ac12d8da371ac662f68bfecf7f05f3b4fd5416c3" +dependencies = [ + "cfg-if", + "derivative", + "rustc_version", + "serde", +] + [[package]] name = "unic-langid" version = "0.9.1" diff --git a/src/config.rs b/src/config.rs index db58c83..00cfcfa 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,10 +23,12 @@ pub enum Action { OpenProjectDialog, Paste, Quit, + Redo, Save, SelectAll, ToggleSettingsPage, ToggleWordWrap, + Undo, } impl Action { @@ -42,10 +44,12 @@ impl Action { Self::OpenProjectDialog => Message::OpenProjectDialog, Self::Paste => Message::Paste, Self::Quit => Message::Quit, + Self::Redo => Message::Redo, Self::Save => Message::Save, Self::SelectAll => Message::SelectAll, Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings), Self::ToggleWordWrap => Message::ToggleWordWrap, + Self::Undo => Message::Undo, } } } @@ -107,10 +111,12 @@ impl KeyBind { bind!([Ctrl], O, OpenFileDialog); bind!([Ctrl, Shift], O, OpenProjectDialog); bind!([Ctrl], Q, Quit); + bind!([Ctrl, Shift], Z, Redo); bind!([Ctrl], S, Save); bind!([Ctrl], A, SelectAll); bind!([Ctrl], Comma, ToggleSettingsPage); bind!([Alt], Z, ToggleWordWrap); + bind!([Ctrl], Z, Undo); keybinds } diff --git a/src/main.rs b/src/main.rs index 59d0a15..fa480b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -120,6 +120,7 @@ pub enum Message { Paste, PasteValue(String), Quit, + Redo, Save, SelectAll, SyntaxTheme(usize, bool), @@ -128,6 +129,7 @@ pub enum Message { Todo, ToggleContextPage(ContextPage), ToggleWordWrap, + Undo, VimBindings(bool), } @@ -689,6 +691,13 @@ impl Application for App { //TODO: prompt for save? return window::close(); } + Message::Redo => match self.active_tab() { + Some(tab) => { + let mut editor = tab.editor.lock().unwrap(); + editor.redo(); + } + None => {} + }, Message::Save => { let mut title_opt = None; @@ -785,6 +794,13 @@ impl Application for App { self.config.word_wrap = !self.config.word_wrap; return self.save_config(); } + Message::Undo => match self.active_tab() { + Some(tab) => { + let mut editor = tab.editor.lock().unwrap(); + editor.undo(); + } + None => {} + }, Message::VimBindings(vim_bindings) => { self.config.vim_bindings = vim_bindings; return self.save_config(); diff --git a/src/menu.rs b/src/menu.rs index d62ed3f..40d3fb1 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -132,8 +132,8 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> { MenuTree::with_children( menu_root(fl!("edit")), vec![ - menu_key(fl!("undo"), "Ctrl + Z", Message::Todo), - menu_key(fl!("redo"), "Ctrl + Shift + Z", Message::Todo), + menu_item(fl!("undo"), Message::Undo), + menu_item(fl!("redo"), Message::Redo), MenuTree::new(horizontal_rule(1)), menu_item(fl!("cut"), Message::Cut), menu_item(fl!("copy"), Message::Copy),