diff --git a/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/AzureCloudShell.png b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/AzureCloudShell.png
new file mode 100644
index 00000000000..c7ee454ce98
Binary files /dev/null and b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/AzureCloudShell.png differ
diff --git a/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/PowerShell.png b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/PowerShell.png
new file mode 100644
index 00000000000..72f5e54e31a
Binary files /dev/null and b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/PowerShell.png differ
diff --git a/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/SSH.png b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/SSH.png
new file mode 100644
index 00000000000..ebba22951f0
Binary files /dev/null and b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/SSH.png differ
diff --git a/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/VisualStudio.png b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/VisualStudio.png
new file mode 100644
index 00000000000..c41b6cb5811
Binary files /dev/null and b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/VisualStudio.png differ
diff --git a/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/WSL.png b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/WSL.png
new file mode 100644
index 00000000000..b572346ff53
Binary files /dev/null and b/src/cascadia/CascadiaPackage/ProfileGeneratorIcons/WSL.png differ
diff --git a/src/cascadia/CascadiaResources.build.items b/src/cascadia/CascadiaResources.build.items
index cfd11c79f42..336fad5048b 100644
--- a/src/cascadia/CascadiaResources.build.items
+++ b/src/cascadia/CascadiaResources.build.items
@@ -21,6 +21,11 @@
true
ProfileIcons\%(RecursiveDir)%(FileName)%(Extension)
+
+
+ true
+ ProfileGeneratorIcons\%(RecursiveDir)%(FileName)%(Extension)
+
true
diff --git a/src/cascadia/TerminalSettingsEditor/Extensions.cpp b/src/cascadia/TerminalSettingsEditor/Extensions.cpp
index 38980653e87..272784aaa79 100644
--- a/src/cascadia/TerminalSettingsEditor/Extensions.cpp
+++ b/src/cascadia/TerminalSettingsEditor/Extensions.cpp
@@ -7,6 +7,7 @@
#include "ExtensionPackageViewModel.g.cpp"
#include "ExtensionsViewModel.g.cpp"
#include "FragmentProfileViewModel.g.cpp"
+#include "ExtensionPackageTemplateSelector.g.cpp"
#include
#include "..\WinRTUtils\inc\Utils.h"
@@ -22,31 +23,25 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Extensions::Extensions()
{
InitializeComponent();
- }
- void Extensions::OnNavigatedTo(const NavigationEventArgs& e)
- {
- _ViewModel = e.Parameter().as();
- }
+ _extensionPackageIdentifierTemplateSelector = Resources().Lookup(box_value(L"ExtensionPackageIdentifierTemplateSelector")).as();
- void Extensions::ExtensionLoaded(const IInspectable& sender, const RoutedEventArgs& /*args*/)
- {
- const auto& toggleSwitch = sender.as();
- const auto& extensionSource = toggleSwitch.Tag().as();
- toggleSwitch.IsOn(_ViewModel.GetExtensionState(extensionSource));
+ Automation::AutomationProperties::SetName(ActiveExtensionsList(), RS_(L"Extensions_ActiveExtensionsHeader/Text"));
+ Automation::AutomationProperties::SetName(ModifiedProfilesList(), RS_(L"Extensions_ModifiedProfilesHeader/Text"));
+ Automation::AutomationProperties::SetName(AddedProfilesList(), RS_(L"Extensions_AddedProfilesHeader/Text"));
+ Automation::AutomationProperties::SetName(AddedColorSchemesList(), RS_(L"Extensions_AddedColorSchemesHeader/Text"));
}
- void Extensions::ExtensionToggled(const IInspectable& sender, const RoutedEventArgs& /*args*/)
+ void Extensions::OnNavigatedTo(const NavigationEventArgs& e)
{
- const auto& toggleSwitch = sender.as();
- const auto& extensionSource = toggleSwitch.Tag().as();
- _ViewModel.SetExtensionState(extensionSource, toggleSwitch.IsOn());
+ _ViewModel = e.Parameter().as();
+ get_self(_ViewModel)->ExtensionPackageIdentifierTemplateSelector(_extensionPackageIdentifierTemplateSelector);
}
void Extensions::ExtensionNavigator_Click(const IInspectable& sender, const RoutedEventArgs& /*args*/)
{
- const auto source = sender.as().Tag().as();
- _ViewModel.CurrentExtensionSource(source);
+ const auto extPkgVM = sender.as().Tag().as();
+ _ViewModel.CurrentExtensionPackage(extPkgVM);
}
void Extensions::NavigateToProfile_Click(const IInspectable& sender, const RoutedEventArgs& /*args*/)
@@ -69,20 +64,18 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
PropertyChanged([this](auto&&, const PropertyChangedEventArgs& args) {
const auto viewModelProperty{ args.PropertyName() };
- if (viewModelProperty == L"CurrentExtensionSource")
+ if (viewModelProperty == L"CurrentExtensionPackage")
{
- // Update the views to reflect the current extension source, if one is selected.
+ // Update the views to reflect the current extension package, if one is selected.
// Otherwise, show components from all extensions
_profilesModifiedView.Clear();
_profilesAddedView.Clear();
_colorSchemesAddedView.Clear();
- const auto currentExtensionSource = CurrentExtensionSource();
- for (const auto& ext : _fragmentExtensions)
- {
- // No extension selected --> show all enabled extension components
- // Otherwise, only show the ones for the selected extension
- if (const auto extSrc = ext.Fragment().Source(); (currentExtensionSource.empty() && GetExtensionState(extSrc)) || extSrc == currentExtensionSource)
+ // Helper lambda to add the contents of an extension package to the current view
+ auto addPackageContentsToView = [&](const Editor::ExtensionPackageViewModel& extPkg) {
+ auto extPkgVM = get_self(extPkg);
+ for (const auto& ext : extPkgVM->FragmentExtensions())
{
for (const auto& profile : ext.ProfilesModified())
{
@@ -97,9 +90,21 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
_colorSchemesAddedView.Append(scheme);
}
}
+ };
+
+ if (const auto currentExtensionPackage = CurrentExtensionPackage())
+ {
+ addPackageContentsToView(currentExtensionPackage);
+ }
+ else
+ {
+ for (const auto& extPkg : _extensionPackages)
+ {
+ addPackageContentsToView(extPkg);
+ }
}
- _NotifyChanges(L"IsExtensionView", L"CurrentExtensionFragments");
+ _NotifyChanges(L"IsExtensionView", L"CurrentExtensionPackageIdentifierTemplate");
}
});
}
@@ -108,143 +113,100 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
_settings = settings;
_colorSchemesPageVM = colorSchemesPageVM;
- _extensionSources.clear();
- _CurrentExtensionSource.clear();
+ _CurrentExtensionPackage = nullptr;
- std::vector extensions;
- extensions.reserve(settings.FragmentExtensions().Size() + settings.DynamicProfileGenerators().Size());
- for (auto ext : settings.FragmentExtensions())
- {
- extensions.push_back(ext);
- }
- for (auto ext : settings.DynamicProfileGenerators())
- {
- extensions.push_back(ext);
- }
-
- std::vector extensionVMs;
- extensionVMs.reserve(extensions.size());
+ std::vector extensions = wil::to_vector(settings.Extensions());
// these vectors track components all extensions successfully added
+ std::vector extensionPackages;
std::vector profilesModifiedTotal;
std::vector profilesAddedTotal;
std::vector colorSchemesAddedTotal;
- for (const auto& fragExt : extensions)
+ for (const auto& extPkg : extensions)
{
- const auto extensionEnabled = GetExtensionState(fragExt.Source());
+ auto extPkgVM = winrt::make_self(extPkg, settings);
+ extensionPackages.push_back(*extPkgVM);
+ for (const auto& fragExt : extPkg.FragmentsView())
+ {
+ const auto extensionEnabled = GetExtensionState(fragExt.Source(), _settings);
- // these vectors track everything the current extension attempted to bring in
- std::vector currentProfilesModified;
- std::vector currentProfilesAdded;
- std::vector currentColorSchemesAdded;
+ // these vectors track everything the current extension attempted to bring in
+ std::vector currentProfilesModified;
+ std::vector currentProfilesAdded;
+ std::vector currentColorSchemesAdded;
- if (fragExt.ModifiedProfilesView())
- {
- for (const auto&& entry : fragExt.ModifiedProfilesView())
+ if (fragExt.ModifiedProfilesView())
{
- // Ensure entry successfully modifies a profile before creating and registering the object
- if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid()))
+ for (const auto&& entry : fragExt.ModifiedProfilesView())
{
- auto vm = winrt::make(entry, fragExt, deducedProfile);
- currentProfilesModified.push_back(vm);
- if (extensionEnabled)
+ // Ensure entry successfully modifies a profile before creating and registering the object
+ if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid()))
{
- profilesModifiedTotal.push_back(vm);
+ auto vm = winrt::make(entry, fragExt, deducedProfile);
+ currentProfilesModified.push_back(vm);
+ if (extensionEnabled)
+ {
+ profilesModifiedTotal.push_back(vm);
+ }
}
}
}
- }
- if (fragExt.NewProfilesView())
- {
- for (const auto&& entry : fragExt.NewProfilesView())
+ if (fragExt.NewProfilesView())
{
- // Ensure entry successfully points to a profile before creating and registering the object.
- // The profile may have been removed by the user.
- if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid()))
+ for (const auto&& entry : fragExt.NewProfilesView())
{
- auto vm = winrt::make(entry, fragExt, deducedProfile);
- currentProfilesAdded.push_back(vm);
- if (extensionEnabled)
+ // Ensure entry successfully points to a profile before creating and registering the object.
+ // The profile may have been removed by the user.
+ if (const auto& deducedProfile = _settings.FindProfile(entry.ProfileGuid()))
{
- profilesAddedTotal.push_back(vm);
+ auto vm = winrt::make(entry, fragExt, deducedProfile);
+ currentProfilesAdded.push_back(vm);
+ if (extensionEnabled)
+ {
+ profilesAddedTotal.push_back(vm);
+ }
}
}
}
- }
- if (fragExt.ColorSchemesView())
- {
- for (const auto&& entry : fragExt.ColorSchemesView())
+ if (fragExt.ColorSchemesView())
{
- for (const auto& schemeVM : _colorSchemesPageVM.AllColorSchemes())
+ for (const auto&& entry : fragExt.ColorSchemesView())
{
- if (schemeVM.Name() == entry.ColorSchemeName())
+ for (const auto& schemeVM : _colorSchemesPageVM.AllColorSchemes())
{
- auto vm = winrt::make(entry, fragExt, schemeVM);
- currentColorSchemesAdded.push_back(vm);
- if (extensionEnabled)
+ if (schemeVM.Name() == entry.ColorSchemeName())
{
- colorSchemesAddedTotal.push_back(vm);
+ auto vm = winrt::make(entry, fragExt, schemeVM);
+ currentColorSchemesAdded.push_back(vm);
+ if (extensionEnabled)
+ {
+ colorSchemesAddedTotal.push_back(vm);
+ }
}
}
}
}
+ extPkgVM->FragmentExtensions().Append(winrt::make(fragExt, currentProfilesModified, currentProfilesAdded, currentColorSchemesAdded));
}
-
- _extensionSources.insert(fragExt.Source());
- extensionVMs.push_back(winrt::make(fragExt, currentProfilesModified, currentProfilesAdded, currentColorSchemesAdded));
}
- _fragmentExtensions = single_threaded_observable_vector(std::move(extensionVMs));
+ _extensionPackages = single_threaded_observable_vector(std::move(extensionPackages));
_profilesModifiedView = single_threaded_observable_vector(std::move(profilesModifiedTotal));
_profilesAddedView = single_threaded_observable_vector(std::move(profilesAddedTotal));
_colorSchemesAddedView = single_threaded_observable_vector(std::move(colorSchemesAddedTotal));
}
- IVector ExtensionsViewModel::CurrentExtensionFragments() const noexcept
- {
- std::vector fragmentExtensionVMs;
- for (auto&& extVM : _fragmentExtensions)
- {
- if (_CurrentExtensionSource.empty() || extVM.Fragment().Source() == _CurrentExtensionSource)
- {
- fragmentExtensionVMs.push_back(extVM);
- }
- }
- return winrt::single_threaded_vector(std::move(fragmentExtensionVMs));
- }
-
- hstring ExtensionsViewModel::CurrentExtensionScope() const noexcept
- {
- if (!_CurrentExtensionSource.empty())
- {
- for (auto&& extVM : _fragmentExtensions)
- {
- const auto& fragExt = extVM.Fragment();
- if (fragExt.Source() == _CurrentExtensionSource)
- {
- return fragExt.Scope() == Model::FragmentScope::User ? RS_(L"Extensions_ScopeUser") : RS_(L"Extensions_ScopeSystem");
- }
- }
- }
- return hstring{};
- }
-
- IObservableVector ExtensionsViewModel::ExtensionPackages() const noexcept
+ Windows::UI::Xaml::DataTemplate ExtensionsViewModel::CurrentExtensionPackageIdentifierTemplate() const
{
- std::vector extensionPackages;
- for (auto&& extSrc : _extensionSources)
- {
- extensionPackages.push_back(winrt::make(extSrc, GetExtensionState(extSrc)));
- }
- return winrt::single_threaded_observable_vector(std::move(extensionPackages));
+ return _ExtensionPackageIdentifierTemplateSelector.SelectTemplate(CurrentExtensionPackage());
}
// Returns true if the extension is enabled, false otherwise
- bool ExtensionsViewModel::GetExtensionState(hstring extensionSource) const
+ bool ExtensionsViewModel::GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings)
{
- if (const auto& disabledExtensions = _DisabledProfileSources())
+ if (const auto& disabledExtensions = settings.GlobalSettings().DisabledProfileSources())
{
uint32_t ignored;
return !disabledExtensions.IndexOf(extensionSource, ignored);
@@ -254,12 +216,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
}
// Enable/Disable an extension
- void ExtensionsViewModel::SetExtensionState(hstring extensionSource, bool enableExt)
+ void ExtensionsViewModel::SetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings, bool enableExt)
{
// get the current status of the extension
uint32_t idx;
bool currentlyEnabled = true;
- const auto& disabledExtensions = _DisabledProfileSources();
+ const auto& disabledExtensions = settings.GlobalSettings().DisabledProfileSources();
if (disabledExtensions)
{
currentlyEnabled = !disabledExtensions.IndexOf(extensionSource, idx);
@@ -274,7 +236,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
if (!disabledExtensions && !enableExt)
{
std::vector disabledProfileSources{ extensionSource };
- _settings.GlobalSettings().DisabledProfileSources(single_threaded_vector(std::move(disabledProfileSources)));
+ settings.GlobalSettings().DisabledProfileSources(single_threaded_vector(std::move(disabledProfileSources)));
return;
}
@@ -301,12 +263,74 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
NavigateToColorSchemeRequested.raise(*this, nullptr);
}
+ hstring ExtensionPackageViewModel::Scope() const noexcept
+ {
+ return _package.Scope() == Model::FragmentScope::User ? RS_(L"Extensions_ScopeUser") : RS_(L"Extensions_ScopeSystem");
+ }
+
+ bool ExtensionPackageViewModel::Enabled() const
+ {
+ return ExtensionsViewModel::GetExtensionState(_package.Source(), _settings);
+ }
+
+ void ExtensionPackageViewModel::Enabled(bool val)
+ {
+ if (Enabled() != val)
+ {
+ ExtensionsViewModel::SetExtensionState(_package.Source(), _settings, val);
+ _NotifyChanges(L"Enabled");
+ }
+ }
+
+ // Returns the accessible name for the extension package in the following format:
+ // ", "
hstring ExtensionPackageViewModel::AccessibleName() const noexcept
{
- if (_enabled)
+ hstring name;
+ const auto source = _package.Source();
+ if (const auto displayName = _package.DisplayName(); !displayName.empty())
{
- return _source;
+ return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), displayName, source) };
+ }
+ return source;
+ }
+
+ // Returns the accessible name for the extension package with the disabled state (if disabled) in the following format:
+ // ", : "
+ hstring ExtensionPackageViewModel::AccessibleNameWithStatus() const noexcept
+ {
+ if (Enabled())
+ {
+ return AccessibleName();
+ }
+ return hstring{ fmt::format(FMT_COMPILE(L"{}: {}"), AccessibleName(), RS_(L"Extension_StateDisabled/Text")) };
+ }
+
+ hstring FragmentProfileViewModel::AccessibleName() const noexcept
+ {
+ return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), Profile().Name(), SourceName()) };
+ }
+
+ hstring FragmentColorSchemeViewModel::AccessibleName() const noexcept
+ {
+ return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), ColorSchemeVM().Name(), SourceName()) };
+ }
+
+ DataTemplate ExtensionPackageTemplateSelector::SelectTemplateCore(const IInspectable& item, const DependencyObject& /*container*/)
+ {
+ return SelectTemplateCore(item);
+ }
+
+ DataTemplate ExtensionPackageTemplateSelector::SelectTemplateCore(const IInspectable& item)
+ {
+ if (const auto extPkgVM = item.try_as())
+ {
+ if (!extPkgVM.Package().DisplayName().empty())
+ {
+ return ComplexTemplate();
+ }
+ return DefaultTemplate();
}
- return hstring{ fmt::format(L"{}: {}", _source, RS_(L"Extension_StateDisabled/Text")) };
+ return nullptr;
}
}
diff --git a/src/cascadia/TerminalSettingsEditor/Extensions.h b/src/cascadia/TerminalSettingsEditor/Extensions.h
index 8bd9dfaf911..799618c2b08 100644
--- a/src/cascadia/TerminalSettingsEditor/Extensions.h
+++ b/src/cascadia/TerminalSettingsEditor/Extensions.h
@@ -9,6 +9,7 @@
#include "FragmentExtensionViewModel.g.h"
#include "FragmentProfileViewModel.g.h"
#include "FragmentColorSchemeViewModel.g.h"
+#include "ExtensionPackageTemplateSelector.g.h"
#include "ViewModelHelpers.h"
#include "Utils.h"
@@ -20,14 +21,15 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Extensions();
void OnNavigatedTo(const Windows::UI::Xaml::Navigation::NavigationEventArgs& e);
- void ExtensionLoaded(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
- void ExtensionToggled(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
void ExtensionNavigator_Click(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
void NavigateToProfile_Click(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
void NavigateToColorScheme_Click(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args);
WINRT_PROPERTY(Editor::ExtensionsViewModel, ViewModel, nullptr);
+
+ private:
+ Editor::ExtensionPackageTemplateSelector _extensionPackageIdentifierTemplateSelector;
};
struct ExtensionsViewModel : ExtensionsViewModelT, ViewModelHelper
@@ -36,57 +38,62 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
ExtensionsViewModel(const Model::CascadiaSettings& settings, const Editor::ColorSchemesPageViewModel& colorSchemesPageVM);
// Properties
- bool IsExtensionView() const noexcept { return _CurrentExtensionSource != hstring{}; }
- Windows::Foundation::Collections::IVector CurrentExtensionFragments() const noexcept;
- hstring CurrentExtensionScope() const noexcept;
- bool NoActiveExtensions() const noexcept { return _fragmentExtensions.Size() == 0; }
+ Windows::UI::Xaml::DataTemplate CurrentExtensionPackageIdentifierTemplate() const;
+ bool IsExtensionView() const noexcept { return _CurrentExtensionPackage != nullptr; }
+ bool NoExtensionPackages() const noexcept { return _extensionPackages.Size() == 0; }
bool NoProfilesModified() const noexcept { return _profilesModifiedView.Size() == 0; }
bool NoProfilesAdded() const noexcept { return _profilesAddedView.Size() == 0; }
bool NoSchemesAdded() const noexcept { return _colorSchemesAddedView.Size() == 0; }
// Views
- Windows::Foundation::Collections::IObservableVector ExtensionPackages() const noexcept;
+ Windows::Foundation::Collections::IObservableVector ExtensionPackages() const noexcept { return _extensionPackages; }
Windows::Foundation::Collections::IObservableVector ProfilesModified() const noexcept { return _profilesModifiedView; }
Windows::Foundation::Collections::IObservableVector ProfilesAdded() const noexcept { return _profilesAddedView; }
Windows::Foundation::Collections::IObservableVector ColorSchemesAdded() const noexcept { return _colorSchemesAddedView; }
// Methods
void UpdateSettings(const Model::CascadiaSettings& settings, const Editor::ColorSchemesPageViewModel& colorSchemesPageVM);
- bool GetExtensionState(hstring extensionSource) const;
- void SetExtensionState(hstring extensionSource, bool enableExt);
void NavigateToProfile(const guid profileGuid);
void NavigateToColorScheme(const Editor::ColorSchemeViewModel& schemeVM);
+ static bool GetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings);
+ static void SetExtensionState(hstring extensionSource, const Model::CascadiaSettings& settings, bool enableExt);
+
til::typed_event NavigateToProfileRequested;
til::typed_event NavigateToColorSchemeRequested;
- VIEW_MODEL_OBSERVABLE_PROPERTY(hstring, CurrentExtensionSource);
+ VIEW_MODEL_OBSERVABLE_PROPERTY(Editor::ExtensionPackageViewModel, CurrentExtensionPackage, nullptr);
+ WINRT_PROPERTY(Editor::ExtensionPackageTemplateSelector, ExtensionPackageIdentifierTemplateSelector, nullptr);
private:
Model::CascadiaSettings _settings;
Editor::ColorSchemesPageViewModel _colorSchemesPageVM;
- std::unordered_set _extensionSources;
- Windows::Foundation::Collections::IVector _fragmentExtensions;
+ Windows::Foundation::Collections::IObservableVector _extensionPackages;
Windows::Foundation::Collections::IObservableVector _profilesModifiedView;
Windows::Foundation::Collections::IObservableVector _profilesAddedView;
Windows::Foundation::Collections::IObservableVector _colorSchemesAddedView;
-
- Windows::Foundation::Collections::IVector _DisabledProfileSources() const noexcept { return _settings.GlobalSettings().DisabledProfileSources(); }
};
struct ExtensionPackageViewModel : ExtensionPackageViewModelT, ViewModelHelper
{
public:
- ExtensionPackageViewModel(hstring source, bool enabled) :
- _source{ source },
- _enabled{ enabled } {}
- hstring Source() const noexcept { return _source; }
- bool Enabled() const noexcept { return _enabled; }
+ ExtensionPackageViewModel(const Model::ExtensionPackage& pkg, const Model::CascadiaSettings& settings) :
+ _package{ pkg },
+ _settings{ settings },
+ _fragmentExtensions{ single_threaded_observable_vector() } {}
+
+ Model::ExtensionPackage Package() const noexcept { return _package; }
+ hstring Scope() const noexcept;
+ bool Enabled() const;
+ void Enabled(bool val);
hstring AccessibleName() const noexcept;
+ hstring AccessibleNameWithStatus() const noexcept;
+ Windows::Foundation::Collections::IObservableVector FragmentExtensions() { return _fragmentExtensions; }
private:
- hstring _source;
- bool _enabled;
+ Model::ExtensionPackage _package;
+ Model::CascadiaSettings _settings;
+ Windows::Foundation::Collections::IObservableVector _fragmentExtensions;
};
struct FragmentExtensionViewModel : FragmentExtensionViewModelT, ViewModelHelper
@@ -124,6 +131,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Model::Profile Profile() const { return _deducedProfile; };
hstring SourceName() const { return _fragment.Source(); }
hstring Json() const { return _entry.Json(); }
+ hstring AccessibleName() const noexcept;
private:
Model::FragmentProfileEntry _entry;
@@ -142,15 +150,29 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Editor::ColorSchemeViewModel ColorSchemeVM() const { return _deducedSchemeVM; };
hstring SourceName() const { return _fragment.Source(); }
hstring Json() const { return _entry.Json(); }
+ hstring AccessibleName() const noexcept;
private:
Model::FragmentColorSchemeEntry _entry;
Model::FragmentSettings _fragment;
Editor::ColorSchemeViewModel _deducedSchemeVM;
};
+
+ struct ExtensionPackageTemplateSelector : public ExtensionPackageTemplateSelectorT
+ {
+ public:
+ ExtensionPackageTemplateSelector() = default;
+
+ Windows::UI::Xaml::DataTemplate SelectTemplateCore(const Windows::Foundation::IInspectable& item, const Windows::UI::Xaml::DependencyObject& container);
+ Windows::UI::Xaml::DataTemplate SelectTemplateCore(const Windows::Foundation::IInspectable& item);
+
+ WINRT_PROPERTY(Windows::UI::Xaml::DataTemplate, DefaultTemplate, nullptr);
+ WINRT_PROPERTY(Windows::UI::Xaml::DataTemplate, ComplexTemplate, nullptr);
+ };
};
namespace winrt::Microsoft::Terminal::Settings::Editor::factory_implementation
{
BASIC_FACTORY(Extensions);
+ BASIC_FACTORY(ExtensionPackageTemplateSelector);
}
diff --git a/src/cascadia/TerminalSettingsEditor/Extensions.idl b/src/cascadia/TerminalSettingsEditor/Extensions.idl
index ba5cac9885f..ffea5d0f073 100644
--- a/src/cascadia/TerminalSettingsEditor/Extensions.idl
+++ b/src/cascadia/TerminalSettingsEditor/Extensions.idl
@@ -14,25 +14,22 @@ namespace Microsoft.Terminal.Settings.Editor
[default_interface] runtimeclass ExtensionsViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged
{
// Properties
- String CurrentExtensionSource;
- IVector