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]]
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"

View file

@ -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
}

View file

@ -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();

View file

@ -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),