Undo/redo support

This commit is contained in:
Jeremy Soller 2023-11-13 13:31:46 -07:00
parent f76f83565c
commit c84a256376
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
4 changed files with 63 additions and 4 deletions

41
Cargo.lock generated
View file

@ -878,7 +878,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-text" name = "cosmic-text"
version = "0.10.0" 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 = [ dependencies = [
"fontdb 0.15.0", "fontdb 0.15.0",
"libm", "libm",
@ -891,6 +891,7 @@ dependencies = [
"swash", "swash",
"syntect", "syntect",
"sys-locale", "sys-locale",
"undo_2",
"unicode-bidi", "unicode-bidi",
"unicode-linebreak", "unicode-linebreak",
"unicode-script", "unicode-script",
@ -2764,7 +2765,7 @@ dependencies = [
[[package]] [[package]]
name = "modit" name = "modit"
version = "0.1.0" 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 = [ dependencies = [
"log", "log",
] ]
@ -3844,6 +3845,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 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]] [[package]]
name = "rustix" name = "rustix"
version = "0.37.27" version = "0.37.27"
@ -3981,6 +3991,21 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6" 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]] [[package]]
name = "serde" name = "serde"
version = "1.0.192" version = "1.0.192"
@ -4634,6 +4659,18 @@ dependencies = [
"winapi", "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]] [[package]]
name = "unic-langid" name = "unic-langid"
version = "0.9.1" version = "0.9.1"

View file

@ -23,10 +23,12 @@ pub enum Action {
OpenProjectDialog, OpenProjectDialog,
Paste, Paste,
Quit, Quit,
Redo,
Save, Save,
SelectAll, SelectAll,
ToggleSettingsPage, ToggleSettingsPage,
ToggleWordWrap, ToggleWordWrap,
Undo,
} }
impl Action { impl Action {
@ -42,10 +44,12 @@ impl Action {
Self::OpenProjectDialog => Message::OpenProjectDialog, Self::OpenProjectDialog => Message::OpenProjectDialog,
Self::Paste => Message::Paste, Self::Paste => Message::Paste,
Self::Quit => Message::Quit, Self::Quit => Message::Quit,
Self::Redo => Message::Redo,
Self::Save => Message::Save, Self::Save => Message::Save,
Self::SelectAll => Message::SelectAll, Self::SelectAll => Message::SelectAll,
Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings), Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings),
Self::ToggleWordWrap => Message::ToggleWordWrap, Self::ToggleWordWrap => Message::ToggleWordWrap,
Self::Undo => Message::Undo,
} }
} }
} }
@ -107,10 +111,12 @@ impl KeyBind {
bind!([Ctrl], O, OpenFileDialog); bind!([Ctrl], O, OpenFileDialog);
bind!([Ctrl, Shift], O, OpenProjectDialog); bind!([Ctrl, Shift], O, OpenProjectDialog);
bind!([Ctrl], Q, Quit); bind!([Ctrl], Q, Quit);
bind!([Ctrl, Shift], Z, Redo);
bind!([Ctrl], S, Save); bind!([Ctrl], S, Save);
bind!([Ctrl], A, SelectAll); bind!([Ctrl], A, SelectAll);
bind!([Ctrl], Comma, ToggleSettingsPage); bind!([Ctrl], Comma, ToggleSettingsPage);
bind!([Alt], Z, ToggleWordWrap); bind!([Alt], Z, ToggleWordWrap);
bind!([Ctrl], Z, Undo);
keybinds keybinds
} }

View file

@ -120,6 +120,7 @@ pub enum Message {
Paste, Paste,
PasteValue(String), PasteValue(String),
Quit, Quit,
Redo,
Save, Save,
SelectAll, SelectAll,
SyntaxTheme(usize, bool), SyntaxTheme(usize, bool),
@ -128,6 +129,7 @@ pub enum Message {
Todo, Todo,
ToggleContextPage(ContextPage), ToggleContextPage(ContextPage),
ToggleWordWrap, ToggleWordWrap,
Undo,
VimBindings(bool), VimBindings(bool),
} }
@ -689,6 +691,13 @@ impl Application for App {
//TODO: prompt for save? //TODO: prompt for save?
return window::close(); return window::close();
} }
Message::Redo => match self.active_tab() {
Some(tab) => {
let mut editor = tab.editor.lock().unwrap();
editor.redo();
}
None => {}
},
Message::Save => { Message::Save => {
let mut title_opt = None; let mut title_opt = None;
@ -785,6 +794,13 @@ impl Application for App {
self.config.word_wrap = !self.config.word_wrap; self.config.word_wrap = !self.config.word_wrap;
return self.save_config(); 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) => { Message::VimBindings(vim_bindings) => {
self.config.vim_bindings = vim_bindings; self.config.vim_bindings = vim_bindings;
return self.save_config(); return self.save_config();

View file

@ -132,8 +132,8 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> {
MenuTree::with_children( MenuTree::with_children(
menu_root(fl!("edit")), menu_root(fl!("edit")),
vec![ vec![
menu_key(fl!("undo"), "Ctrl + Z", Message::Todo), menu_item(fl!("undo"), Message::Undo),
menu_key(fl!("redo"), "Ctrl + Shift + Z", Message::Todo), menu_item(fl!("redo"), Message::Redo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("cut"), Message::Cut), menu_item(fl!("cut"), Message::Cut),
menu_item(fl!("copy"), Message::Copy), menu_item(fl!("copy"), Message::Copy),