From 56be87d2883c6714225ce229abcfcd1bc0604cc5 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Mon, 27 Jul 2026 20:14:19 +0200 Subject: [PATCH] Add pane shortcuts to View menu --- src/app.rs | 5 ++++ src/native_menu.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/app.rs b/src/app.rs index 5c74cde..839f5f7 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2020,6 +2020,10 @@ impl App { Some(crate::native_menu::NativeMenuEvent::NewChat) => Message::NewChat, Some(crate::native_menu::NativeMenuEvent::ExportChat) => Message::ExportChat, Some(crate::native_menu::NativeMenuEvent::ToggleSidebar) => Message::ToggleSidebar, + Some(crate::native_menu::NativeMenuEvent::ShowChat) => Message::ShowChat, + Some(crate::native_menu::NativeMenuEvent::ShowA2ui) => Message::ShowA2ui, + Some(crate::native_menu::NativeMenuEvent::ShowGit) => Message::ShowGit, + Some(crate::native_menu::NativeMenuEvent::ShowStats) => Message::ShowStats, Some(crate::native_menu::NativeMenuEvent::Help) => Message::OpenHelp, Some(crate::native_menu::NativeMenuEvent::Quit) => Message::RequestQuit, Some(crate::native_menu::NativeMenuEvent::Edit(command)) => { @@ -2228,6 +2232,7 @@ impl App { self.selected_project.is_some(), self.active_chat_title().is_some(), !self.config.interface.sidebar_collapsed, + self.detail_tab, edit, ); } diff --git a/src/native_menu.rs b/src/native_menu.rs index 6c02f69..8d4d38b 100644 --- a/src/native_menu.rs +++ b/src/native_menu.rs @@ -1,6 +1,7 @@ use muda::accelerator::{Accelerator, CMD_OR_CTRL, Code, Modifiers}; use muda::{CheckMenuItem, Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu}; +use crate::app::DetailTab; use crate::native_edit::EditCommand; const PREFERENCES: &str = "preferences"; @@ -8,6 +9,10 @@ const MODEL_MANAGER: &str = "model-manager"; const NEW_CHAT: &str = "new-chat"; const EXPORT_CHAT: &str = "export-chat"; const TOGGLE_SIDEBAR: &str = "toggle-sidebar"; +const SHOW_CHAT: &str = "show-chat"; +const SHOW_A2UI: &str = "show-a2ui"; +const SHOW_GIT: &str = "show-git"; +const SHOW_STATS: &str = "show-stats"; const HELP: &str = "help"; const QUIT: &str = "quit"; const UNDO: &str = "undo"; @@ -22,6 +27,10 @@ pub(crate) struct NativeMenu { new_chat: MenuItem, export_chat: MenuItem, sidebar: CheckMenuItem, + chat: CheckMenuItem, + a2ui: CheckMenuItem, + git: CheckMenuItem, + stats: CheckMenuItem, undo: MenuItem, redo: MenuItem, cut: MenuItem, @@ -37,6 +46,10 @@ pub(crate) enum NativeMenuEvent { NewChat, ExportChat, ToggleSidebar, + ShowChat, + ShowA2ui, + ShowGit, + ShowStats, Help, Quit, Edit(EditCommand), @@ -87,6 +100,10 @@ pub(crate) fn install() -> Result { true, Some(Accelerator::new(Some(Modifiers::SUPER), Code::KeyB)), ); + let chat = view_item(SHOW_CHAT, "Chat", Code::Digit1, true); + let a2ui = view_item(SHOW_A2UI, "A2UI", Code::Digit2, false); + let git = view_item(SHOW_GIT, "Git", Code::Digit3, false); + let stats = view_item(SHOW_STATS, "Stats", Code::Digit4, false); let open_help = MenuItem::with_id( HELP, "DS4Server Help", @@ -141,8 +158,17 @@ pub(crate) fn install() -> Result { &select_all, ]) .map_err(|error| error.to_string())?; - view.append_items(&[&sidebar, &PredefinedMenuItem::separator(), &model_manager]) - .map_err(|error| error.to_string())?; + view.append_items(&[ + &sidebar, + &PredefinedMenuItem::separator(), + &chat, + &a2ui, + &git, + &stats, + &PredefinedMenuItem::separator(), + &model_manager, + ]) + .map_err(|error| error.to_string())?; window .append_items(&[ &PredefinedMenuItem::minimize(None), @@ -161,6 +187,10 @@ pub(crate) fn install() -> Result { new_chat, export_chat, sidebar, + chat, + a2ui, + git, + stats, undo, redo, cut, @@ -176,11 +206,16 @@ impl NativeMenu { project_active: bool, chat_active: bool, sidebar_visible: bool, + detail_tab: DetailTab, edit: crate::native_edit::EditAvailability, ) { self.new_chat.set_enabled(project_active); self.export_chat.set_enabled(chat_active); self.sidebar.set_checked(sidebar_visible); + self.chat.set_checked(detail_tab == DetailTab::Chat); + self.a2ui.set_checked(detail_tab == DetailTab::A2ui); + self.git.set_checked(detail_tab == DetailTab::Git); + self.stats.set_checked(detail_tab == DetailTab::Stats); self.undo.set_enabled(edit.undo); self.redo.set_enabled(edit.redo); self.cut.set_enabled(edit.cut); @@ -198,6 +233,10 @@ pub(crate) fn next_event() -> Option { NEW_CHAT => NativeMenuEvent::NewChat, EXPORT_CHAT => NativeMenuEvent::ExportChat, TOGGLE_SIDEBAR => NativeMenuEvent::ToggleSidebar, + SHOW_CHAT => NativeMenuEvent::ShowChat, + SHOW_A2UI => NativeMenuEvent::ShowA2ui, + SHOW_GIT => NativeMenuEvent::ShowGit, + SHOW_STATS => NativeMenuEvent::ShowStats, HELP => NativeMenuEvent::Help, QUIT => NativeMenuEvent::Quit, UNDO => NativeMenuEvent::Edit(EditCommand::Undo), @@ -213,6 +252,16 @@ pub(crate) fn next_event() -> Option { None } +fn view_item(id: &'static str, label: &'static str, code: Code, checked: bool) -> CheckMenuItem { + CheckMenuItem::with_id( + id, + label, + true, + checked, + Some(Accelerator::new(Some(Modifiers::SUPER), code)), + ) +} + fn edit_item( id: &'static str, label: &'static str, @@ -240,4 +289,14 @@ mod tests { assert_eq!(paste.id().0, PASTE); assert!(paste.is_enabled()); } + + #[test] + fn view_items_keep_the_selected_pane_checked() { + let chat = view_item(SHOW_CHAT, "Chat", Code::Digit1, true); + let stats = view_item(SHOW_STATS, "Stats", Code::Digit4, false); + assert_eq!(chat.id().0, SHOW_CHAT); + assert!(chat.is_checked()); + assert_eq!(stats.id().0, SHOW_STATS); + assert!(!stats.is_checked()); + } }