From 50822aaf4f9564910d35550f06631714f40db21f Mon Sep 17 00:00:00 2001 From: Heath Stewart Date: Thu, 23 Sep 2021 23:41:23 -0700 Subject: [PATCH] Only show latest VS prompts by default Resolves #11307 --- .../BaseVisualStudioGenerator.cpp | 27 +++++++++++- .../BaseVisualStudioGenerator.h | 3 ++ .../VsSetupConfiguration.cpp | 7 ++++ .../VsSetupConfiguration.h | 41 ++++++++++++++++++- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.cpp b/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.cpp index cb351935f4d..b28e77fd657 100644 --- a/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.cpp +++ b/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.cpp @@ -11,10 +11,17 @@ void BaseVisualStudioGenerator::GenerateProfiles(std::vectorCommandline(winrt::hstring{ GetProfileCommandLine(instance) }); profile->StartingDirectory(winrt::hstring{ instance.GetInstallationPath() }); profile->Icon(winrt::hstring{ GetProfileIconPath() }); + profile->Hidden(!latest); profiles.emplace_back(std::move(profile)); + + latest = false; } CATCH_LOG(); } } + +bool BaseVisualStudioGenerator::Compare(const VsSetupConfiguration::VsSetupInstance& a, const VsSetupConfiguration::VsSetupInstance& b) +{ + auto const aVersion = a.GetComparableVersion(); + auto const bVersion = b.GetComparableVersion(); + + if (aVersion == bVersion) + { + return a.GetComparableInstallDate() < b.GetComparableInstallDate(); + } + + return aVersion < bVersion; +} diff --git a/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.h b/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.h index e2ea620b824..836532b2a6f 100644 --- a/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.h +++ b/src/cascadia/TerminalSettingsModel/BaseVisualStudioGenerator.h @@ -31,5 +31,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model virtual std::wstring GetProfileCommandLine(const VsSetupConfiguration::VsSetupInstance& instance) const = 0; virtual std::wstring GetProfileGuidSeed(const VsSetupConfiguration::VsSetupInstance& instance) const = 0; virtual std::wstring GetProfileIconPath() const = 0; + + private: + static bool Compare(const VsSetupConfiguration::VsSetupInstance& a, const VsSetupConfiguration::VsSetupInstance& b); }; }; diff --git a/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.cpp b/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.cpp index 47e96575776..36e39ba00be 100644 --- a/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.cpp +++ b/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.cpp @@ -95,6 +95,13 @@ std::wstring VsSetupConfiguration::GetInstanceId(ISetupInstance* pInst) return bstrInstanceId.get(); } +unsigned long long VsSetupConfiguration::GetInstallDate(ISetupInstance* pInst) +{ + FILETIME ftInstallDate{ 0 }; + THROW_IF_FAILED(pInst->GetInstallDate(&ftInstallDate)); + return wil::filetime::to_int64(ftInstallDate); +} + std::wstring VsSetupConfiguration::GetStringProperty(ISetupPropertyStore* pProps, std::wstring_view name) { if (pProps == nullptr) diff --git a/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.h b/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.h index 849b91b10d9..1c5fb5c2d18 100644 --- a/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.h +++ b/src/cascadia/TerminalSettingsModel/VsSetupConfiguration.h @@ -37,6 +37,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model public: struct VsSetupInstance { + VsSetupInstance(VsSetupInstance&&) = default; + std::wstring ResolvePath(std::wstring_view relativePath) const { return VsSetupConfiguration::ResolvePath(inst.get(), relativePath); @@ -65,7 +67,17 @@ namespace winrt::Microsoft::Terminal::Settings::Model std::wstring GetVersion() const { - return GetInstallationVersion(inst.get()); + return VsSetupConfiguration::GetInstallationVersion(inst.get()); + } + + unsigned long long GetComparableInstallDate() const + { + return installDate; + } + + unsigned long long GetComparableVersion() const + { + return version; } std::wstring GetInstallationPath() const @@ -116,13 +128,17 @@ namespace winrt::Microsoft::Terminal::Settings::Model return profileNameSuffix; } + VsSetupInstance& operator=(VsSetupInstance&&) = default; + private: friend class VsSetupConfiguration; VsSetupInstance(ComPtrSetupQuery pQuery, ComPtrSetupInstance pInstance) : query(std::move(pQuery)), inst(std::move(pInstance)), - profileNameSuffix(BuildProfileNameSuffix()) + profileNameSuffix(BuildProfileNameSuffix()), + installDate(GetInstallDate()), + version(GetInstallationVersion()) { } @@ -131,6 +147,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model std::wstring profileNameSuffix; + // Cache oft-accessed properties used in sorting. + unsigned long long installDate; + unsigned long long version; + std::wstring BuildProfileNameSuffix() const { ComPtrCatalogPropertyStore catalogProperties = GetCatalogPropertyStore(); @@ -167,6 +187,22 @@ namespace winrt::Microsoft::Terminal::Settings::Model return GetVersion(); } + unsigned long long GetInstallDate() const + { + return VsSetupConfiguration::GetInstallDate(inst.get()); + } + + unsigned long long GetInstallationVersion() const + { + const auto helper = wil::com_query(query); + + std::wstring versionString{ GetVersion() }; + unsigned long long version{ 0 }; + + THROW_IF_FAILED(helper->ParseVersion(versionString.data(), &version)); + return version; + } + static std::wstring GetChannelNameSuffixTag(ISetupPropertyStore* instanceProperties) { std::wstring tag; @@ -229,6 +265,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model static std::wstring GetInstallationVersion(ISetupInstance* pInst); static std::wstring GetInstallationPath(ISetupInstance* pInst); static std::wstring GetInstanceId(ISetupInstance* pInst); + static unsigned long long GetInstallDate(ISetupInstance* pInst); static std::wstring GetStringProperty(ISetupPropertyStore* pProps, std::wstring_view name); }; };