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)]
pub enum Action {
Todo,
CloseFile,
CloseProject,
Copy,
@ -190,7 +191,11 @@ pub enum Action {
TabActivate8,
TabNext,
TabPrev,
TabWidth(u16),
ToggleAutoIndent,
ToggleDocumentStatistics,
ToggleGitManagement,
ToggleLineNumbers,
ToggleProjectSearch,
ToggleSettingsPage,
ToggleWordWrap,
@ -200,6 +205,7 @@ pub enum Action {
impl Action {
pub fn message(&self) -> Message {
match self {
Self::Todo => Message::Todo,
Self::CloseFile => Message::CloseFile,
Self::CloseProject => Message::CloseProject,
Self::Copy => Message::Copy,
@ -226,7 +232,13 @@ impl Action {
Self::TabActivate8 => Message::TabActivateJump(8),
Self::TabNext => Message::TabNext,
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::ToggleLineNumbers => Message::ToggleLineNumbers,
Self::ToggleProjectSearch => Message::ToggleContextPage(ContextPage::ProjectSearch),
Self::ToggleSettingsPage => Message::ToggleContextPage(ContextPage::Settings),
Self::ToggleWordWrap => Message::ToggleWordWrap,
@ -259,7 +271,7 @@ impl PartialEq for WatcherWrapper {
}
#[allow(dead_code)]
#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug)]
pub enum Message {
AppTheme(AppTheme),
Config(Config),

View file

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