diff --git a/src/config.rs b/src/config.rs index ef57d67..d711ae5 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,6 +5,7 @@ use crate::Message; // Makes key binding definitions simpler const CTRL: Modifiers = Modifiers::CTRL; +const ALT: Modifiers = Modifiers::ALT; const SHIFT: Modifiers = Modifiers::SHIFT; #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] @@ -38,6 +39,7 @@ impl KeyBind { bind!(CTRL, O, OpenFileDialog); bind!(CTRL, S, Save); bind!(CTRL, Q, Quit); + bind!(ALT, Z, ToggleWrap); keybinds } diff --git a/src/main.rs b/src/main.rs index 4dbda6c..bf042a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -86,7 +86,7 @@ pub enum Message { TabActivate(segmented_button::Entity), TabClose(segmented_button::Entity), Todo, - Wrap(bool), + ToggleWrap, } impl App { @@ -539,8 +539,8 @@ impl cosmic::Application for App { Message::Todo => { log::warn!("TODO"); } - Message::Wrap(wrap) => { - self.config.wrap = wrap; + Message::ToggleWrap => { + self.config.wrap = !self.config.wrap; //TODO: provide iterator over data let entities: Vec<_> = self.tab_model.iter().collect(); for entity in entities { diff --git a/src/menu.rs b/src/menu.rs index 42a4770..6505783 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -39,14 +39,19 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> { let menu_folder = |label| menu_button!(widget::text(label), horizontal_space(Length::Fill), ">"); - let menu_item = |label, message| { + let find_key = |message: &Message| -> String { let mut key = String::new(); for (config_key_bind, config_message) in config.keybinds.iter() { - if config_message == &message { + if config_message == message { key = config_key_bind.to_string(); break; } } + key + }; + + let menu_item = |label, message| { + let key = find_key(&message); MenuTree::new( menu_button!( widget::text(label), @@ -57,6 +62,29 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> { ) }; + //TODO: support key lookup? + let menu_checkbox = |label, value, message| { + let check: Element<_> = if value { + widget::icon::from_name("object-select-symbolic") + .size(16) + .icon() + .into() + } else { + widget::Space::with_width(Length::Fixed(16.0)).into() + }; + let key = find_key(&message); + MenuTree::new( + menu_button!( + check, + widget::Space::with_width(Length::Fixed(8.0)), + widget::text(label), + horizontal_space(Length::Fill), + widget::text(key) + ) + .on_press(message), + ) + }; + let menu_key = |label, key, message| { MenuTree::new( menu_button!(widget::text(label), horizontal_space(Length::Fill), key) @@ -124,9 +152,9 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> { ], ), MenuTree::new(horizontal_rule(1)), - menu_item(fl!("word-wrap"), Message::Todo), - menu_item(fl!("show-line-numbers"), Message::Todo), - menu_item(fl!("highlight-current-line"), Message::Todo), + menu_checkbox(fl!("word-wrap"), config.wrap, Message::ToggleWrap), + menu_checkbox(fl!("show-line-numbers"), false, Message::Todo), + menu_checkbox(fl!("highlight-current-line"), false, Message::Todo), menu_item(fl!("syntax-highlighting"), Message::Todo), MenuTree::new(horizontal_rule(1)), menu_key(fl!("settings"), "Ctrl + ,", Message::Todo),