From 0ecbb15de329b160f8571d7307b9e99dddac092b Mon Sep 17 00:00:00 2001 From: Eduardo Flores Date: Mon, 18 Mar 2024 19:31:28 -0700 Subject: [PATCH] refactor(menu): update menu declaration. - Updated libcosmic. - Updated menu declaration. --- src/key_bind.rs | 46 +-------------- src/main.rs | 16 +++-- src/menu.rs | 141 +++++++++++++++++--------------------------- src/terminal_box.rs | 7 +-- 4 files changed, 68 insertions(+), 142 deletions(-) diff --git a/src/key_bind.rs b/src/key_bind.rs index 6aa77e4..dab47cb 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -1,49 +1,9 @@ -use cosmic::{ - iced::keyboard::{Key, Modifiers}, - iced_core::keyboard::key::Named, -}; -use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, fmt}; +use cosmic::widget::menu::key_bind::{KeyBind, Modifier}; +use cosmic::{iced::keyboard::Key, iced_core::keyboard::key::Named}; +use std::collections::HashMap; use crate::Action; -#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] -pub enum Modifier { - Super, - Ctrl, - Alt, - Shift, -} - -#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] -pub struct KeyBind { - pub modifiers: Vec, - pub key: Key, -} - -impl KeyBind { - pub fn matches(&self, modifiers: Modifiers, key: &Key) -> bool { - key == &self.key - && modifiers.logo() == self.modifiers.contains(&Modifier::Super) - && modifiers.control() == self.modifiers.contains(&Modifier::Ctrl) - && modifiers.alt() == self.modifiers.contains(&Modifier::Alt) - && modifiers.shift() == self.modifiers.contains(&Modifier::Shift) - } -} - -impl fmt::Display for KeyBind { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - for modifier in self.modifiers.iter() { - write!(f, "{:?} + ", modifier)?; - } - match &self.key { - Key::Character(c) => write!(f, "{}", c.to_uppercase()), - Key::Named(named) => write!(f, "{:?}", named), - other => write!(f, "{:?}", other), - } - } -} - //TODO: load from config pub fn key_binds() -> HashMap { let mut key_binds = HashMap::new(); diff --git a/src/main.rs b/src/main.rs index afa19f7..a76d696 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-only use alacritty_terminal::{event::Event as TermEvent, term, term::color::Colors as TermColors, tty}; +use cosmic::widget::menu::action::MenuAction; +use cosmic::widget::menu::key_bind::KeyBind; use cosmic::{ app::{message, Command, Core, Settings}, cosmic_config::{self, ConfigSet, CosmicConfigEntry}, @@ -40,7 +42,7 @@ mod mouse_reporter; use icon_cache::IconCache; mod icon_cache; -use key_bind::{key_binds, KeyBind}; +use key_bind::key_binds; mod key_bind; mod localize; @@ -206,12 +208,14 @@ pub enum Action { ZoomReset, } -impl Action { - pub fn message(self, entity_opt: Option) -> Message { +impl MenuAction for Action { + type Message = Message; + + fn message(&self, entity_opt: Option) -> Message { match self { Action::About => Message::ToggleContextPage(ContextPage::About), Action::ColorSchemes(color_scheme_kind) => { - Message::ToggleContextPage(ContextPage::ColorSchemes(color_scheme_kind)) + Message::ToggleContextPage(ContextPage::ColorSchemes(*color_scheme_kind)) } Action::Copy => Message::Copy(entity_opt), Action::Find => Message::Find(true), @@ -223,11 +227,11 @@ impl Action { Action::PaneSplitVertical => Message::PaneSplit(pane_grid::Axis::Vertical), Action::PaneToggleMaximized => Message::PaneToggleMaximized, Action::Paste => Message::Paste(entity_opt), - Action::ProfileOpen(profile_id) => Message::ProfileOpen(profile_id), + Action::ProfileOpen(profile_id) => Message::ProfileOpen(*profile_id), Action::Profiles => Message::ToggleContextPage(ContextPage::Profiles), Action::SelectAll => Message::SelectAll(entity_opt), Action::Settings => Message::ToggleContextPage(ContextPage::Settings), - Action::ShowHeaderBar(show_headerbar) => Message::ShowHeaderBar(show_headerbar), + Action::ShowHeaderBar(show_headerbar) => Message::ShowHeaderBar(*show_headerbar), Action::TabActivate0 => Message::TabActivateJump(0), Action::TabActivate1 => Message::TabActivateJump(1), Action::TabActivate2 => Message::TabActivateJump(2), diff --git a/src/menu.rs b/src/menu.rs index 07d9546..a97dd05 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,13 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-only +use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::menu::menu_tree::{menu_items, menu_root, MenuItem}; use cosmic::{ - //TODO: export in cosmic::widget iced::{ widget::{column, horizontal_rule, horizontal_space}, Alignment, Background, Length, }, iced_core::Border, - theme, + menu_button, theme, widget::{ self, menu::{ItemHeight, ItemWidth, MenuBar, MenuTree}, @@ -17,22 +18,7 @@ use cosmic::{ }; use std::collections::HashMap; -use crate::{fl, Action, ColorSchemeId, ColorSchemeKind, Config, KeyBind, Message}; - -macro_rules! menu_button { - ($($x:expr),+ $(,)?) => ( - widget::button( - widget::Row::with_children( - vec![$(Element::from($x)),+] - ) - .align_items(Alignment::Center) - ) - .height(Length::Fixed(32.0)) - .padding([4, 16]) - .width(Length::Fill) - .style(theme::Button::MenuItem) - ); -} +use crate::{fl, Action, ColorSchemeId, ColorSchemeKind, Config, Message}; pub fn context_menu<'a>( config: &Config, @@ -145,90 +131,69 @@ pub fn color_scheme_menu<'a>( } pub fn menu_bar<'a>(config: &Config, key_binds: &HashMap) -> Element<'a, Message> { - //TODO: port to libcosmic - let menu_root = |label| { - widget::button(widget::text(label)) - .padding([4, 12]) - .style(theme::Button::MenuRoot) - }; - - let menu_folder = - |label| menu_button!(widget::text(label), horizontal_space(Length::Fill), ">"); - - let find_key = |action: &Action| -> String { - for (key_bind, key_action) in key_binds.iter() { - if action == key_action { - return key_bind.to_string(); - } - } - String::new() - }; - - 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(action.message(None)), - ) - }; - let mut profile_items = Vec::with_capacity(config.profiles.len()); for (name, id) in config.profile_names() { - profile_items.push(menu_item(name, Action::ProfileOpen(id))); + profile_items.push(MenuItem::Button(name, Action::ProfileOpen(id))); } + //TODO: what to do if there are no profiles? MenuBar::new(vec![ MenuTree::with_children( menu_root(fl!("file")), - vec![ - menu_item(fl!("new-tab"), Action::TabNew), - menu_item(fl!("new-window"), Action::WindowNew), - MenuTree::new(horizontal_rule(1)), - MenuTree::with_children(menu_folder(fl!("profile")), profile_items), - menu_item(fl!("menu-profiles"), Action::Profiles), - MenuTree::new(horizontal_rule(1)), - menu_item(fl!("close-tab"), Action::TabClose), - MenuTree::new(horizontal_rule(1)), - menu_item(fl!("quit"), Action::WindowClose), - ], + menu_items( + key_binds, + vec![ + MenuItem::Button(fl!("new-tab"), Action::TabNew), + MenuItem::Button(fl!("new-window"), Action::WindowNew), + MenuItem::Divider, + MenuItem::Folder(fl!("profile"), profile_items), + MenuItem::Button(fl!("menu-profiles"), Action::Profiles), + MenuItem::Divider, + MenuItem::Button(fl!("close-tab"), Action::TabClose), + MenuItem::Divider, + MenuItem::Button(fl!("quit"), Action::WindowClose), + ], + ), ), MenuTree::with_children( menu_root(fl!("edit")), - vec![ - 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"), Action::Find), - ], + menu_items( + key_binds, + vec![ + MenuItem::Button(fl!("copy"), Action::Copy), + MenuItem::Button(fl!("paste"), Action::Paste), + MenuItem::Button(fl!("select-all"), Action::SelectAll), + MenuItem::Divider, + MenuItem::Button(fl!("find"), Action::Find), + ], + ), ), MenuTree::with_children( menu_root(fl!("view")), - vec![ - menu_item(fl!("zoom-in"), Action::ZoomIn), - menu_item(fl!("zoom-reset"), Action::ZoomReset), - menu_item(fl!("zoom-out"), Action::ZoomOut), - MenuTree::new(horizontal_rule(1)), - menu_item(fl!("next-tab"), Action::TabNext), - menu_item(fl!("previous-tab"), Action::TabPrev), - MenuTree::new(horizontal_rule(1)), - menu_item(fl!("split-horizontal"), Action::PaneSplitHorizontal), - menu_item(fl!("split-vertical"), Action::PaneSplitVertical), - menu_item(fl!("pane-toggle-maximize"), Action::PaneToggleMaximized), - MenuTree::new(horizontal_rule(1)), - menu_item( - fl!("menu-color-schemes"), - Action::ColorSchemes(config.color_scheme_kind()), - ), - menu_item(fl!("menu-settings"), Action::Settings), - MenuTree::new(horizontal_rule(1)), - menu_item(fl!("menu-about"), Action::About), - ], + menu_items( + key_binds, + vec![ + MenuItem::Button(fl!("zoom-in"), Action::ZoomIn), + MenuItem::Button(fl!("zoom-reset"), Action::ZoomReset), + MenuItem::Button(fl!("zoom-out"), Action::ZoomOut), + MenuItem::Divider, + MenuItem::Button(fl!("next-tab"), Action::TabNext), + MenuItem::Button(fl!("previous-tab"), Action::TabPrev), + MenuItem::Divider, + MenuItem::Button(fl!("split-horizontal"), Action::PaneSplitHorizontal), + MenuItem::Button(fl!("split-vertical"), Action::PaneSplitVertical), + MenuItem::Button(fl!("pane-toggle-maximize"), Action::PaneToggleMaximized), + MenuItem::Divider, + MenuItem::Button( + fl!("menu-color-schemes"), + Action::ColorSchemes(config.color_scheme_kind()), + ), + MenuItem::Button(fl!("menu-settings"), Action::Settings), + MenuItem::Divider, + MenuItem::Button(fl!("menu-about"), Action::About), + ], + ), ), ]) .item_height(ItemHeight::Dynamic(40)) diff --git a/src/terminal_box.rs b/src/terminal_box.rs index 6d7d823..70cdd84 100644 --- a/src/terminal_box.rs +++ b/src/terminal_box.rs @@ -5,6 +5,7 @@ use alacritty_terminal::{ selection::{Selection, SelectionType}, term::{cell::Flags, TermMode}, }; +use cosmic::widget::menu::key_bind::KeyBind; use cosmic::{ cosmic_theme::palette::{blend::Compose, WithAlpha}, iced::{ @@ -40,11 +41,7 @@ use std::{ time::{Duration, Instant}, }; -use crate::{ - key_bind::{key_binds, KeyBind}, - terminal::Metadata, - Action, Terminal, TerminalScroll, -}; +use crate::{key_bind::key_binds, terminal::Metadata, Action, Terminal, TerminalScroll}; pub struct TerminalBox<'a, Message> { terminal: &'a Mutex,