From d04d15f4c4a0655fcd144ef4c72ad7ab97555740 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 12 Mar 2026 19:43:00 -0700 Subject: [PATCH] Tab menu: show 'restart' + maintain items' enable state --- src/cascadia/TerminalApp/Tab.cpp | 33 ++++++++++++++++++++------------ src/cascadia/TerminalApp/Tab.h | 16 +++++++++------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/cascadia/TerminalApp/Tab.cpp b/src/cascadia/TerminalApp/Tab.cpp index 4bbf58e50ad..1c0b6e3d85b 100644 --- a/src/cascadia/TerminalApp/Tab.cpp +++ b/src/cascadia/TerminalApp/Tab.cpp @@ -35,7 +35,6 @@ namespace winrt::TerminalApp::implementation _activePane = nullptr; _closePaneMenuItem.Visibility(WUX::Visibility::Collapsed); - _restartConnectionMenuItem.Visibility(WUX::Visibility::Collapsed); auto firstId = _nextPaneId; @@ -86,6 +85,7 @@ namespace winrt::TerminalApp::implementation _MakeTabViewItem(); _CreateContextMenu(); + _UpdateMenuItemEnablement(); _headerControl.TabStatus(_tabStatus); @@ -1271,13 +1271,6 @@ namespace winrt::TerminalApp::implementation _tabStatus.IsConnectionClosed(isClosed); } - - if (_activePane) - { - _restartConnectionMenuItem.Visibility(_activePane->IsConnectionClosed() ? - WUX::Visibility::Visible : - WUX::Visibility::Collapsed); - } } void Tab::_RestartActivePaneConnection() @@ -1348,6 +1341,22 @@ namespace winrt::TerminalApp::implementation } }); } + + _UpdateMenuItemEnablement(); + } + + void Tab::_UpdateMenuItemEnablement() + { + // Terminal-specific menu items + const auto content = _activePane ? _activePane->GetContent() : nullptr; + const auto isTerm = content && content.try_as() != nullptr; + _duplicateTabMenuItem.IsEnabled(isTerm); + _exportTabMenuItem.IsEnabled(isTerm); + _findMenuItem.IsEnabled(isTerm); + _restartConnectionMenuItem.IsEnabled(isTerm); + + // Snippets Pane can technically be split + _splitTabMenuItem.IsEnabled(isTerm || (content && content.try_as() != nullptr)); } // Method Description: @@ -1652,7 +1661,7 @@ namespace winrt::TerminalApp::implementation Automation::AutomationProperties::SetHelpText(renameTabMenuItem, renameTabToolTip); } - Controls::MenuFlyoutItem duplicateTabMenuItem; + Controls::MenuFlyoutItem duplicateTabMenuItem = _duplicateTabMenuItem; { // "Duplicate tab" Controls::FontIcon duplicateTabSymbol; @@ -1669,7 +1678,7 @@ namespace winrt::TerminalApp::implementation Automation::AutomationProperties::SetHelpText(duplicateTabMenuItem, duplicateTabToolTip); } - Controls::MenuFlyoutItem splitTabMenuItem; + Controls::MenuFlyoutItem splitTabMenuItem = _splitTabMenuItem; { // "Split tab" Controls::FontIcon splitTabSymbol; @@ -1698,7 +1707,7 @@ namespace winrt::TerminalApp::implementation Automation::AutomationProperties::SetHelpText(closePaneMenuItem, closePaneToolTip); } - Controls::MenuFlyoutItem exportTabMenuItem; + Controls::MenuFlyoutItem exportTabMenuItem = _exportTabMenuItem; { // "Export tab" Controls::FontIcon exportTabSymbol; @@ -1715,7 +1724,7 @@ namespace winrt::TerminalApp::implementation Automation::AutomationProperties::SetHelpText(exportTabMenuItem, exportTabToolTip); } - Controls::MenuFlyoutItem findMenuItem; + Controls::MenuFlyoutItem findMenuItem = _findMenuItem; { // "Find" Controls::FontIcon findSymbol; diff --git a/src/cascadia/TerminalApp/Tab.h b/src/cascadia/TerminalApp/Tab.h index 65d4e574ede..3e5f6b49419 100644 --- a/src/cascadia/TerminalApp/Tab.h +++ b/src/cascadia/TerminalApp/Tab.h @@ -140,11 +140,17 @@ namespace winrt::TerminalApp::implementation static constexpr double HeaderRenameBoxWidthTitleLength{ std::numeric_limits::infinity() }; winrt::Windows::UI::Xaml::FocusState _focusState{ winrt::Windows::UI::Xaml::FocusState::Unfocused }; - winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _closeOtherTabsMenuItem{}; - winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _closeTabsAfterMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _duplicateTabMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _splitTabMenuItem{}; winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _moveToNewWindowMenuItem{}; winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _moveRightMenuItem{}; winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _moveLeftMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _exportTabMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _findMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _restartConnectionMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _closeOtherTabsMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _closeTabsAfterMenuItem{}; + winrt::Windows::UI::Xaml::Controls::MenuFlyoutItem _closePaneMenuItem{}; winrt::TerminalApp::ShortcutActionDispatch _dispatch; Microsoft::Terminal::Settings::Model::IActionMapView _actionMap{ nullptr }; winrt::hstring _keyChord{}; @@ -159,9 +165,6 @@ namespace winrt::TerminalApp::implementation std::shared_ptr _activePane{ nullptr }; std::shared_ptr _zoomedPane{ nullptr }; - Windows::UI::Xaml::Controls::MenuFlyoutItem _closePaneMenuItem; - Windows::UI::Xaml::Controls::MenuFlyoutItem _restartConnectionMenuItem; - winrt::Microsoft::Terminal::Settings::Model::IconStyle _lastIconStyle; winrt::hstring _lastIconPath{}; std::optional _runtimeTabColor{}; @@ -220,6 +223,7 @@ namespace winrt::TerminalApp::implementation void _AttachEventHandlersToPane(std::shared_ptr pane); void _UpdateActivePane(std::shared_ptr pane); + void _UpdateMenuItemEnablement(); winrt::hstring _GetActiveTitle() const; @@ -230,8 +234,6 @@ namespace winrt::TerminalApp::implementation void _UpdateConnectionClosedState(); void _RestartActivePaneConnection(); - void _DuplicateTab(); - winrt::Windows::UI::Xaml::Media::Brush _BackgroundBrush(); void _MakeTabViewItem();