Use actions for all menu items

This commit is contained in:
Jeremy Soller 2024-02-01 19:50:44 -07:00
parent 869999919c
commit f48ec227dd
2 changed files with 63 additions and 60 deletions

View file

@ -164,6 +164,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub enum Action { pub enum Action {
Todo,
CloseFile, CloseFile,
CloseProject, CloseProject,
Copy, Copy,
@ -190,7 +191,11 @@ pub enum Action {
TabActivate8, TabActivate8,
TabNext, TabNext,
TabPrev, TabPrev,
TabWidth(u16),
ToggleAutoIndent,
ToggleDocumentStatistics,
ToggleGitManagement, ToggleGitManagement,
ToggleLineNumbers,
ToggleProjectSearch, ToggleProjectSearch,
ToggleSettingsPage, ToggleSettingsPage,
ToggleWordWrap, ToggleWordWrap,
@ -200,6 +205,7 @@ pub enum Action {
impl Action { impl Action {
pub fn message(&self) -> Message { pub fn message(&self) -> Message {
match self { match self {
Self::Todo => Message::Todo,
Self::CloseFile => Message::CloseFile, Self::CloseFile => Message::CloseFile,
Self::CloseProject => Message::CloseProject, Self::CloseProject => Message::CloseProject,
Self::Copy => Message::Copy, Self::Copy => Message::Copy,
@ -226,7 +232,13 @@ impl Action {
Self::TabActivate8 => Message::TabActivateJump(8), Self::TabActivate8 => Message::TabActivateJump(8),
Self::TabNext => Message::TabNext, Self::TabNext => Message::TabNext,
Self::TabPrev => Message::TabPrev, Self::TabPrev => Message::TabPrev,
Self::TabWidth(tab_width) => Message::TabWidth(*tab_width),
Self::ToggleAutoIndent => Message::ToggleAutoIndent,
Self::ToggleDocumentStatistics => {
Message::ToggleContextPage(ContextPage::DocumentStatistics)
}
Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement), Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement),
Self::ToggleLineNumbers => Message::ToggleLineNumbers,
Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch), Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch),
Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings), Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings),
Self::ToggleWordWrap => Message::ToggleWordWrap, Self::ToggleWordWrap => Message::ToggleWordWrap,
@ -259,7 +271,7 @@ impl PartialEq for WatcherWrapper {
} }
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug)]
pub enum Message { pub enum Message {
AppTheme(AppTheme), AppTheme(AppTheme),
Config(Config), Config(Config),

View file

@ -16,7 +16,7 @@ use cosmic::{
}; };
use std::collections::HashMap; use std::collections::HashMap;
use crate::{fl, icon_cache_get, Action, Config, ContextPage, KeyBind, Message}; use crate::{fl, icon_cache_get, Action, Config, KeyBind, Message};
macro_rules! menu_button { macro_rules! menu_button {
($($x:expr),+ $(,)?) => ( ($($x:expr),+ $(,)?) => (
@ -91,10 +91,10 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
let menu_folder = let menu_folder =
|label| menu_button!(widget::text(label), horizontal_space(Length::Fill), ">"); |label| menu_button!(widget::text(label), horizontal_space(Length::Fill), ">");
let find_key = |message: &Message| -> String { let find_key = |action: &Action| -> String {
let mut key = String::new(); let mut key = String::new();
for (key_bind, action) in key_binds.iter() { for (key_bind, key_action) in key_binds.iter() {
if &action.message() == message { if action == key_action {
key = key_bind.to_string(); key = key_bind.to_string();
break; break;
} }
@ -102,26 +102,26 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
key key
}; };
let menu_item = |label, message| { let menu_item = |label, action| {
let key = find_key(&message); let key = find_key(&action);
MenuTree::new( MenuTree::new(
menu_button!( menu_button!(
widget::text(label), widget::text(label),
horizontal_space(Length::Fill), horizontal_space(Length::Fill),
widget::text(key) widget::text(key)
) )
.on_press(message), .on_press(action.message()),
) )
}; };
//TODO: support key lookup? //TODO: support key lookup?
let menu_checkbox = |label, value, message| { let menu_checkbox = |label, value, action| {
let check: Element<_> = if value { let check: Element<_> = if value {
icon_cache_get("object-select-symbolic", 16).into() icon_cache_get("object-select-symbolic", 16).into()
} else { } else {
widget::Space::with_width(Length::Fixed(16.0)).into() widget::Space::with_width(Length::Fixed(16.0)).into()
}; };
let key = find_key(&message); let key = find_key(&action);
MenuTree::new( MenuTree::new(
menu_button!( menu_button!(
check, check,
@ -130,14 +130,14 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
horizontal_space(Length::Fill), horizontal_space(Length::Fill),
widget::text(key) widget::text(key)
) )
.on_press(message), .on_press(action.message()),
) )
}; };
let menu_key = |label, key, message| { let menu_key = |label, key, action: Action| {
MenuTree::new( MenuTree::new(
menu_button!(widget::text(label), horizontal_space(Length::Fill), key) menu_button!(widget::text(label), horizontal_space(Length::Fill), key)
.on_press(message), .on_press(action.message()),
) )
}; };
@ -145,7 +145,7 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
menu_checkbox( menu_checkbox(
fl!("tab-width", tab_width = tab_width), fl!("tab-width", tab_width = tab_width),
config.tab_width == tab_width, config.tab_width == tab_width,
Message::TabWidth(tab_width), Action::TabWidth(tab_width),
) )
}; };
@ -153,62 +153,56 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
MenuTree::with_children( MenuTree::with_children(
menu_root(fl!("file")), menu_root(fl!("file")),
vec![ vec![
menu_item(fl!("new-file"), Message::NewFile), menu_item(fl!("new-file"), Action::NewFile),
menu_item(fl!("new-window"), Message::NewWindow), menu_item(fl!("new-window"), Action::NewWindow),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("open-file"), Message::OpenFileDialog), menu_item(fl!("open-file"), Action::OpenFileDialog),
MenuTree::with_children( MenuTree::with_children(
menu_folder(fl!("open-recent-file")), menu_folder(fl!("open-recent-file")),
vec![menu_item(fl!("todo"), Message::Todo)], vec![menu_item(fl!("todo"), Action::Todo)],
), ),
menu_item(fl!("close-file"), Message::CloseFile), menu_item(fl!("close-file"), Action::CloseFile),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("menu-open-project"), Message::OpenProjectDialog), menu_item(fl!("menu-open-project"), Action::OpenProjectDialog),
MenuTree::with_children( MenuTree::with_children(
menu_folder(fl!("open-recent-project")), menu_folder(fl!("open-recent-project")),
vec![menu_item(fl!("todo"), Message::Todo)], vec![menu_item(fl!("todo"), Action::Todo)],
), ),
menu_item(fl!("close-project"), Message::CloseProject), menu_item(fl!("close-project"), Action::CloseProject),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("save"), Message::Save), menu_item(fl!("save"), Action::Save),
menu_key(fl!("save-as"), "Ctrl + Shift + S", Message::Todo), menu_key(fl!("save-as"), "Ctrl + Shift + S", Action::Todo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("revert-all-changes"), Message::Todo), menu_item(fl!("revert-all-changes"), Action::Todo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item( menu_item(
fl!("menu-document-statistics"), fl!("menu-document-statistics"),
Message::ToggleContextPage(ContextPage::DocumentStatistics), Action::ToggleDocumentStatistics,
), ),
menu_item(fl!("document-type"), Message::Todo), menu_item(fl!("document-type"), Action::Todo),
menu_item(fl!("encoding"), Message::Todo), menu_item(fl!("encoding"), Action::Todo),
menu_item( menu_item(fl!("menu-git-management"), Action::ToggleGitManagement),
fl!("menu-git-management"), menu_item(fl!("print"), Action::Todo),
Message::ToggleContextPage(ContextPage::GitManagement),
),
menu_item(fl!("print"), Message::Todo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("quit"), Message::Quit), menu_item(fl!("quit"), Action::Quit),
], ],
), ),
MenuTree::with_children( MenuTree::with_children(
menu_root(fl!("edit")), menu_root(fl!("edit")),
vec![ vec![
menu_item(fl!("undo"), Message::Undo), menu_item(fl!("undo"), Action::Undo),
menu_item(fl!("redo"), Message::Redo), menu_item(fl!("redo"), Action::Redo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("cut"), Message::Cut), menu_item(fl!("cut"), Action::Cut),
menu_item(fl!("copy"), Message::Copy), menu_item(fl!("copy"), Action::Copy),
menu_item(fl!("paste"), Message::Paste), menu_item(fl!("paste"), Action::Paste),
menu_item(fl!("select-all"), Message::SelectAll), menu_item(fl!("select-all"), Action::SelectAll),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("find"), Message::Find(Some(false))), menu_item(fl!("find"), Action::Find),
menu_item(fl!("replace"), Message::Find(Some(true))), menu_item(fl!("replace"), Action::FindAndReplace),
menu_item( menu_item(fl!("find-in-project"), Action::ToggleProjectSearch),
fl!("find-in-project"),
Message::ToggleContextPage(ContextPage::ProjectSearch),
),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("spell-check"), Message::Todo), menu_item(fl!("spell-check"), Action::Todo),
], ],
), ),
MenuTree::with_children( MenuTree::with_children(
@ -220,7 +214,7 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
menu_checkbox( menu_checkbox(
fl!("automatic-indentation"), fl!("automatic-indentation"),
config.auto_indent, config.auto_indent,
Message::ToggleAutoIndent, Action::ToggleAutoIndent,
), ),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_tab_width(1), menu_tab_width(1),
@ -232,28 +226,25 @@ pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap<KeyBind, Action>) -> El
menu_tab_width(7), menu_tab_width(7),
menu_tab_width(8), menu_tab_width(8),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("convert-indentation-to-spaces"), Message::Todo), menu_item(fl!("convert-indentation-to-spaces"), Action::Todo),
menu_item(fl!("convert-indentation-to-tabs"), Message::Todo), menu_item(fl!("convert-indentation-to-tabs"), Action::Todo),
], ],
), ),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_checkbox(fl!("word-wrap"), config.word_wrap, Message::ToggleWordWrap), menu_checkbox(fl!("word-wrap"), config.word_wrap, Action::ToggleWordWrap),
menu_checkbox( menu_checkbox(
fl!("show-line-numbers"), fl!("show-line-numbers"),
config.line_numbers, config.line_numbers,
Message::ToggleLineNumbers, Action::ToggleLineNumbers,
), ),
menu_checkbox(fl!("highlight-current-line"), false, Message::Todo), menu_checkbox(fl!("highlight-current-line"), false, Action::Todo),
menu_item(fl!("syntax-highlighting"), Message::Todo), menu_item(fl!("syntax-highlighting"), Action::Todo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item( menu_item(fl!("menu-settings"), Action::ToggleSettingsPage),
fl!("menu-settings"),
Message::ToggleContextPage(ContextPage::Settings),
),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("menu-keyboard-shortcuts"), Message::Todo), menu_item(fl!("menu-keyboard-shortcuts"), Action::Todo),
MenuTree::new(horizontal_rule(1)), MenuTree::new(horizontal_rule(1)),
menu_item(fl!("about-cosmic-text-editor"), Message::Todo), menu_item(fl!("about-cosmic-text-editor"), Action::Todo),
], ],
), ),
]) ])