From 17e5fb49d8a7b61c66d198389e3557e8970ebf5c Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Tue, 27 Oct 2020 15:44:53 -0700 Subject: [PATCH] serialize hidden shells --- .../DeserializationTests.cpp | 2 -- .../SerializationTests.cpp | 4 +-- .../CascadiaSettings.cpp | 27 ++++++++++++------- .../TerminalSettingsModel/CascadiaSettings.h | 3 ++- .../CascadiaSettingsSerialization.cpp | 5 ++++ 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/cascadia/LocalTests_SettingsModel/DeserializationTests.cpp b/src/cascadia/LocalTests_SettingsModel/DeserializationTests.cpp index 9f878d2300df..f502fc8d121b 100644 --- a/src/cascadia/LocalTests_SettingsModel/DeserializationTests.cpp +++ b/src/cascadia/LocalTests_SettingsModel/DeserializationTests.cpp @@ -783,7 +783,6 @@ namespace SettingsModelLocalTests settings->_profiles.Append(*profile4); settings->_profiles.Append(*profile5); - settings->_ValidateProfilesHaveGuid(); VERIFY_IS_TRUE(settings->_profiles.GetAt(0).HasGuid()); VERIFY_IS_TRUE(settings->_profiles.GetAt(1).HasGuid()); VERIFY_IS_TRUE(settings->_profiles.GetAt(2).HasGuid()); @@ -836,7 +835,6 @@ namespace SettingsModelLocalTests auto settings = winrt::make_self(); settings->_profiles.Append(*profile1); - settings->_ValidateProfilesHaveGuid(); VERIFY_IS_TRUE(settings->_profiles.GetAt(0).HasGuid()); diff --git a/src/cascadia/LocalTests_SettingsModel/SerializationTests.cpp b/src/cascadia/LocalTests_SettingsModel/SerializationTests.cpp index 11a934038b49..b70cb772b136 100644 --- a/src/cascadia/LocalTests_SettingsModel/SerializationTests.cpp +++ b/src/cascadia/LocalTests_SettingsModel/SerializationTests.cpp @@ -231,8 +231,8 @@ namespace SettingsModelLocalTests "\"name\": \"NiksaShell\"" "}," "{" - "\"name\": \"BhojwaniShell\"," - "\"source\": \"local\"" + "\"hidden\": true," + "\"name\": \"BhojwaniShell\"" "}" "]" "}," diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp index 42427288ec27..233abf948f57 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp @@ -46,6 +46,7 @@ CascadiaSettings::CascadiaSettings() : CascadiaSettings::CascadiaSettings(const bool addDynamicProfiles) : _globals{ winrt::make_self() }, _profiles{ winrt::single_threaded_observable_vector() }, + _hiddenProfiles{ winrt::single_threaded_observable_vector() }, _warnings{ winrt::single_threaded_vector() }, _deserializationErrorMessage{ L"" } { @@ -81,7 +82,14 @@ winrt::Microsoft::Terminal::Settings::Model::CascadiaSettings CascadiaSettings:: settings->_userSettings = _userSettings; settings->_defaultSettings = _defaultSettings; - _CopyProfileInheritanceTree(settings); + // profile.defaults must be saved to CascadiaSettings + // So let's copy it over manually first + if (_userDefaultProfileSettings) + { + settings->_userDefaultProfileSettings = Profile::CopySettings(_userDefaultProfileSettings); + } + settings->_profiles = _CopyProfileInheritanceTree(_profiles.GetView(), settings->_userDefaultProfileSettings); + settings->_hiddenProfiles = _CopyProfileInheritanceTree(_hiddenProfiles.GetView(), settings->_userDefaultProfileSettings); return *settings; } @@ -92,14 +100,14 @@ winrt::Microsoft::Terminal::Settings::Model::CascadiaSettings CascadiaSettings:: // - cloneSettings: the CascadiaSettings we're copying the inheritance tree to // Return Value: // - -void CascadiaSettings::_CopyProfileInheritanceTree(winrt::com_ptr& cloneSettings) const +IObservableVector CascadiaSettings::_CopyProfileInheritanceTree(IVectorView profiles, winrt::com_ptr profileDefaultsClone) const { // Our profiles inheritance graph doesn't have a formal root. // However, if we create a dummy Profile, and set _profiles as the parent, // we now have a root. So we'll do just that, then copy the inheritance graph // from the dummyRoot. auto dummyRootSource{ winrt::make_self() }; - for (const auto& profile : _profiles) + for (const auto& profile : profiles) { winrt::com_ptr profileImpl; profileImpl.copy_from(winrt::get_self(profile)); @@ -109,23 +117,23 @@ void CascadiaSettings::_CopyProfileInheritanceTree(winrt::com_ptr() }; std::unordered_map> visited{}; - if (_userDefaultProfileSettings) + if (_userDefaultProfileSettings && profileDefaultsClone) { - // profile.defaults must be saved to CascadiaSettings - // So let's do that manually first, and add that to visited - cloneSettings->_userDefaultProfileSettings = Profile::CopySettings(_userDefaultProfileSettings); - visited[_userDefaultProfileSettings.get()] = cloneSettings->_userDefaultProfileSettings; + // add profile.defaults to visited + visited[_userDefaultProfileSettings.get()] = profileDefaultsClone; } Profile::CloneInheritanceGraph(dummyRootSource, dummyRootClone, visited); // All of the parents of the dummy root clone are _profiles. // Get the parents and add them to the settings clone. + IObservableVector result{ winrt::single_threaded_observable_vector() }; const auto cloneParents{ dummyRootClone->Parents() }; for (const auto& profile : cloneParents) { - cloneSettings->_profiles.Append(*profile); + result.Append(*profile); } + return result; } // Method Description: @@ -441,6 +449,7 @@ void CascadiaSettings::_RemoveHiddenProfiles() if (_profiles.GetAt(i).Hidden()) { // remove hidden profile, don't increment 'i' + _hiddenProfiles.Append(std::move(_profiles.GetAt(i))); _profiles.RemoveAt(i); } else diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h index 175a609a1f45..26ff88d4d208 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h @@ -96,6 +96,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation private: com_ptr _globals; Windows::Foundation::Collections::IObservableVector _profiles; + Windows::Foundation::Collections::IObservableVector _hiddenProfiles; Windows::Foundation::Collections::IVector _warnings; Windows::Foundation::IReference _loadError; hstring _deserializationErrorMessage; @@ -118,7 +119,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation bool _PrependSchemaDirective(); bool _AppendDynamicProfilesToUserSettings(); std::string _ApplyFirstRunChangesToSettingsTemplate(std::string_view settingsTemplate) const; - void _CopyProfileInheritanceTree(com_ptr& cloneSettings) const; + Windows::Foundation::Collections::IObservableVector _CopyProfileInheritanceTree(Windows::Foundation::Collections::IVectorView profiles, winrt::com_ptr profileDefaultsClone) const; void _ApplyDefaultsFromUserSettings(); diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp index 388dc8c68bd0..dac1100ea436 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp @@ -1063,6 +1063,11 @@ Json::Value CascadiaSettings::ToJson() const const auto prof{ winrt::get_self(entry) }; profilesList.append(prof->ToJson()); } + for (const auto& entry : _hiddenProfiles) + { + const auto prof{ winrt::get_self(entry) }; + profilesList.append(prof->ToJson()); + } profiles[JsonKey(ProfilesListKey)] = profilesList; json[JsonKey(ProfilesKey)] = profiles;