From d77745d03567f987c0e04d17ae5ad8de7dcb36d0 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 8 May 2020 13:53:34 -0500 Subject: [PATCH] Manually select a new tab when we're in fullscreen mode (#5809) If we're fullscreen, the TabView isn't `Visible`. If it's not `Visible`, it's _not_ going to raise a `SelectionChanged` event, which is what we usually use to focus another tab. Instead, we'll have to do it manually here. So, what we're going to try to do is move the focus to the tab to the left, within the bounds of how many tabs we have. EX: we have 4 tabs: [A, B, C, D]. If we close: * A (`tabIndex=0`): We'll want to focus tab B (now in index 0) * B (`tabIndex=1`): We'll want to focus tab A (now in index 0) * C (`tabIndex=2`): We'll want to focus tab B (now in index 1) * D (`tabIndex=3`): We'll want to focus tab C (now in index 2) `_UpdatedSelectedTab` will do the work of setting up the new tab as the focused one, and unfocusing all the others. Also, we need to _manually_ set the SelectedItem of the tabView here. If we don't, then the TabView will technically not have a selected item at all, which can make things like ClosePane not work correctly. ## PR Checklist * [x] Closes #5799 * [x] I work here * [ ] Tests added/passed * [n/a] Requires documentation to be updated ## Validation Steps Performed Played with it a bunch --- src/cascadia/TerminalApp/TerminalPage.cpp | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 3d208c749..98d28d6b2 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -854,6 +854,37 @@ namespace winrt::TerminalApp::implementation { _lastTabClosedHandlers(*this, nullptr); } + else if (_isFullscreen) + { + // GH#5799 - If we're fullscreen, the TabView isn't visible. If it's + // not Visible, it's _not_ going to raise a SelectionChanged event, + // which is what we usually use to focus another tab. Instead, we'll + // have to do it manually here. + // + // We can't use + // auto selectedIndex = _tabView.SelectedIndex(); + // Because this will always return -1 in this scenario unfortunately. + // + // So, what we're going to try to do is move the focus to the tab + // to the left, within the bounds of how many tabs we have. + // + // EX: we have 4 tabs: [A, B, C, D]. If we close: + // * A (tabIndex=0): We'll want to focus tab B (now in index 0) + // * B (tabIndex=1): We'll want to focus tab A (now in index 0) + // * C (tabIndex=2): We'll want to focus tab B (now in index 1) + // * D (tabIndex=3): We'll want to focus tab C (now in index 2) + const auto newSelectedIndex = std::clamp(tabIndex - 1, 0, _tabs.Size()); + // _UpdatedSelectedTab will do the work of setting up the new tab as + // the focused one, and unfocusing all the others. + _UpdatedSelectedTab(newSelectedIndex); + + // Also, we need to _manually_ set the SelectedItem of the tabView + // here. If we don't, then the TabView will technically not have a + // selected item at all, which can make things like ClosePane not + // work correctly. + auto newSelectedTab{ _GetStrongTabImpl(newSelectedIndex) }; + _tabView.SelectedItem(newSelectedTab->GetTabViewItem()); + } } // Method Description: