From 23f08e8747a049276b6387cd07ad44e479b507b3 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Mon, 23 Nov 2020 11:03:12 -0800 Subject: [PATCH] update SUI after settings changes are made --- .../TerminalSettingsEditor/MainPage.cpp | 72 ++++++++++++++++++- .../TerminalSettingsEditor/MainPage.h | 3 +- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.cpp b/src/cascadia/TerminalSettingsEditor/MainPage.cpp index 1c69caf90dd..c0c3d66d2d2 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.cpp +++ b/src/cascadia/TerminalSettingsEditor/MainPage.cpp @@ -47,10 +47,77 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation _InitializeProfilesList(); } - void MainPage::UpdateSettings(Model::CascadiaSettings settings) + fire_and_forget MainPage::UpdateSettings(Model::CascadiaSettings settings) { _settingsSource = settings; _settingsClone = settings.Copy(); + + co_await winrt::resume_foreground(Dispatcher()); + + // reconstruct our list of profiles + auto menuItems{ SettingsNav().MenuItems() }; + unsigned int i = 0; + while (i < menuItems.Size()) + { + if (const auto navViewItem{ menuItems.GetAt(i).try_as() }) + { + const auto tag{ navViewItem.Tag() }; + if (tag.try_as()) + { + // remove NavViewItem pointing to a Profile + menuItems.RemoveAt(i); + continue; + } + else if (const auto stringTag{ tag.try_as() }) + { + if (stringTag == addProfileTag) + { + // remove NavViewItem pointing to "Add Profile" + menuItems.RemoveAt(i); + continue; + } + } + } + ++i; + } + _InitializeProfilesList(); + + _RefreshCurrentPage(); + } + + void MainPage::_RefreshCurrentPage() + { + auto navigationMenu{ SettingsNav() }; + if (const auto selectedItem{ navigationMenu.SelectedItem() }) + { + if (const auto tag{ selectedItem.as().Tag() }) + { + if (const auto profile{ tag.try_as() }) + { + // check if the profile still exists + if (_settingsClone.FindProfile(profile.Guid())) + { + // Navigate to the page with the given profile + contentFrame().Navigate(xaml_typename(), winrt::make(profile, _settingsClone.GlobalSettings().ColorSchemes())); + return; + } + } + else if (const auto stringTag{ tag.try_as() }) + { + // navigate to the page with this tag + _Navigate(*stringTag); + return; + } + } + } + + // could not find the page we were on, fallback to first menu item + const auto firstItem{ navigationMenu.MenuItems().GetAt(0) }; + navigationMenu.SelectedItem(firstItem); + if (const auto tag{ navigationMenu.SelectedItem().as().Tag() }) + { + _Navigate(unbox_value(tag)); + } } // Function Description: @@ -164,6 +231,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void MainPage::ResetButton_Click(IInspectable const& /*sender*/, RoutedEventArgs const& /*args*/) { _settingsClone = _settingsSource.Copy(); + _RefreshCurrentPage(); } void MainPage::_InitializeProfilesList() @@ -181,7 +249,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation // Top off (the end of the nav view) with the Add Profile item MUX::Controls::NavigationViewItem addProfileItem; addProfileItem.Content(box_value(RS_(L"Nav_AddNewProfile/Content"))); - addProfileItem.Tag(box_value(L"AddProfile")); + addProfileItem.Tag(box_value(addProfileTag)); addProfileItem.SelectsOnInvoked(false); FontIcon icon; diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.h b/src/cascadia/TerminalSettingsEditor/MainPage.h index e3bdc1d93d1..f3dbacbf3a1 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.h +++ b/src/cascadia/TerminalSettingsEditor/MainPage.h @@ -13,7 +13,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation MainPage() = delete; MainPage(const Model::CascadiaSettings& settings); - void UpdateSettings(Model::CascadiaSettings settings); + fire_and_forget UpdateSettings(Model::CascadiaSettings settings); void OpenJsonKeyDown(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& args); void OpenJsonTapped(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs const& args); @@ -34,6 +34,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation winrt::Microsoft::UI::Xaml::Controls::NavigationViewItem _CreateProfileNavViewItem(const Model::Profile& profile); void _Navigate(hstring clickedItemTag); + void _RefreshCurrentPage(); }; }