diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.cpp b/src/cascadia/TerminalSettingsEditor/Appearances.cpp index 236485128e..a38c9326fc 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.cpp +++ b/src/cascadia/TerminalSettingsEditor/Appearances.cpp @@ -10,6 +10,8 @@ #include "EnumEntry.h" #include "ProfileViewModel.h" +#include "CursorColorTemplateSelector.g.cpp" +#include "AppearanceViewModel.g.cpp" #include "Appearances.g.cpp" using namespace winrt::Windows::UI::Text; @@ -203,6 +205,26 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation return _isFontFeature; } + DataTemplate CursorColorTemplateSelector::SelectTemplateCore(const IInspectable& item, const DependencyObject& /*container*/) + { + return SelectTemplateCore(item); + } + + DataTemplate CursorColorTemplateSelector::SelectTemplateCore(const IInspectable& item) + { + if (const auto maybeCursorColor = item.try_as()) + { + const auto cursorColor = *maybeCursorColor; + if (cursorColor.R == 0xFF && cursorColor.G == 0xFF && cursorColor.B == 0xFF) + { + return InvertColorTemplate(); + } + return DefaultTemplate(); + } + assert(false); + return nullptr; + } + AppearanceViewModel::AppearanceViewModel(const Model::AppearanceConfig& appearance) : _appearance{ appearance } { @@ -1036,11 +1058,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation if (modelVal) { // user defined an override value + const auto color = modelVal.Value(); return Windows::UI::Color{ .A = 255, - .R = modelVal.Value().R, - .G = modelVal.Value().G, - .B = modelVal.Value().B + .R = color.R, + .G = color.G, + .B = color.B }; } // set to null --> deduce value from color scheme diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.h b/src/cascadia/TerminalSettingsEditor/Appearances.h index e8b1cac6c3..b7c05d3ca8 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.h +++ b/src/cascadia/TerminalSettingsEditor/Appearances.h @@ -19,6 +19,7 @@ Author(s): #include "Font.g.h" #include "FontKeyValuePair.g.h" #include "Appearances.g.h" +#include "CursorColorTemplateSelector.g.h" #include "AppearanceViewModel.g.h" #include "Utils.h" #include "ViewModelHelpers.h" @@ -60,6 +61,19 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation bool _isFontFeature; }; + struct CursorColorTemplateSelector : public CursorColorTemplateSelectorT + { + public: + CursorColorTemplateSelector() = 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, InvertColorTemplate, nullptr); + WINRT_PROPERTY(Editor::ColorSchemeViewModel, ColorScheme, nullptr); + }; + struct AppearanceViewModel : AppearanceViewModelT, ViewModelHelper { enum FontSettingIndex @@ -247,5 +261,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation namespace winrt::Microsoft::Terminal::Settings::Editor::factory_implementation { + BASIC_FACTORY(CursorColorTemplateSelector); BASIC_FACTORY(Appearances); } diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.idl b/src/cascadia/TerminalSettingsEditor/Appearances.idl index 42ce83f07c..69edc74cbc 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.idl +++ b/src/cascadia/TerminalSettingsEditor/Appearances.idl @@ -30,6 +30,14 @@ namespace Microsoft.Terminal.Settings.Editor Single Value; } + runtimeclass CursorColorTemplateSelector : Windows.UI.Xaml.Controls.DataTemplateSelector + { + CursorColorTemplateSelector(); + Windows.UI.Xaml.DataTemplate DefaultTemplate; + Windows.UI.Xaml.DataTemplate InvertColorTemplate; + ColorSchemeViewModel ColorScheme; + } + runtimeclass AppearanceViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged { Boolean IsDefault; diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.xaml b/src/cascadia/TerminalSettingsEditor/Appearances.xaml index 23e117a8ae..6cd093f13c 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.xaml +++ b/src/cascadia/TerminalSettingsEditor/Appearances.xaml @@ -61,6 +61,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -514,10 +570,10 @@ ClearSettingValue="{x:Bind Appearance.ClearCursorColor}" CurrentValue="{x:Bind Appearance.CursorColorPreview, Mode=OneWay}" CurrentValueAccessibleName="{x:Bind Appearance.CursorColorPreview, Converter={StaticResource ColorToStringConverter}, Mode=OneWay}" - CurrentValueTemplate="{StaticResource ColorPreviewTemplate}" + CurrentValueTemplateSelector="{StaticResource CursorColorTemplateSelector}" HasSettingValue="{x:Bind Appearance.HasCursorColor, Mode=OneWay}" SettingOverrideSource="{x:Bind Appearance.CursorColorOverrideSource, Mode=OneWay}" - Style="{StaticResource ExpanderSettingContainerStyleWithComplexPreview}"> + Style="{StaticResource ExpanderSettingContainerStyleWithTemplateSelector}"> Yes, clear the cache - + + Invert + Label displayed when the selected cursor color value inverts the selected text's color. + + \ No newline at end of file diff --git a/src/cascadia/TerminalSettingsEditor/SettingContainer.cpp b/src/cascadia/TerminalSettingsEditor/SettingContainer.cpp index 2ab1614123..130cfcc29a 100644 --- a/src/cascadia/TerminalSettingsEditor/SettingContainer.cpp +++ b/src/cascadia/TerminalSettingsEditor/SettingContainer.cpp @@ -15,6 +15,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation DependencyProperty SettingContainer::_FontIconGlyphProperty{ nullptr }; DependencyProperty SettingContainer::_CurrentValueProperty{ nullptr }; DependencyProperty SettingContainer::_CurrentValueTemplateProperty{ nullptr }; + DependencyProperty SettingContainer::_CurrentValueTemplateSelectorProperty{ nullptr }; DependencyProperty SettingContainer::_CurrentValueAccessibleNameProperty{ nullptr }; DependencyProperty SettingContainer::_HasSettingValueProperty{ nullptr }; DependencyProperty SettingContainer::_SettingOverrideSourceProperty{ nullptr }; @@ -75,6 +76,15 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation xaml_typename(), PropertyMetadata{ nullptr }); } + if (!_CurrentValueTemplateSelectorProperty) + { + _CurrentValueTemplateSelectorProperty = + DependencyProperty::Register( + L"CurrentValueTemplateSelector", + xaml_typename(), + xaml_typename(), + PropertyMetadata{ nullptr }); + } if (!_CurrentValueAccessibleNameProperty) { _CurrentValueAccessibleNameProperty = @@ -116,7 +126,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void SettingContainer::_OnCurrentValueChanged(const Windows::UI::Xaml::DependencyObject& d, const Windows::UI::Xaml::DependencyPropertyChangedEventArgs& /*e*/) { const auto& obj{ d.try_as() }; - get_self(obj)->_UpdateCurrentValueAutoProp(); + const auto& settingContainer = get_self(obj); + settingContainer->_UpdateCurrentValueAutoProp(); + settingContainer->_UpdateCurrentValueTemplate(); } void SettingContainer::_OnHasSettingValueChanged(const DependencyObject& d, const DependencyPropertyChangedEventArgs& /*args*/) @@ -279,6 +291,18 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } } + void SettingContainer::_UpdateCurrentValueTemplate() + { + if (const auto& child{ GetTemplateChild(L"CurrentValuePresenter") }) + { + if (const auto& contentPresenter{ child.try_as() }) + { + const auto newTemplate = contentPresenter.ContentTemplateSelector().SelectTemplate(CurrentValue()); + contentPresenter.ContentTemplate(newTemplate); + } + } + } + // Method Description: // - Helper function for generating the override message // Arguments: diff --git a/src/cascadia/TerminalSettingsEditor/SettingContainer.h b/src/cascadia/TerminalSettingsEditor/SettingContainer.h index 9c77a838e0..70dec4be17 100644 --- a/src/cascadia/TerminalSettingsEditor/SettingContainer.h +++ b/src/cascadia/TerminalSettingsEditor/SettingContainer.h @@ -38,6 +38,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation DEPENDENCY_PROPERTY(hstring, FontIconGlyph); DEPENDENCY_PROPERTY(Windows::Foundation::IInspectable, CurrentValue); DEPENDENCY_PROPERTY(Windows::UI::Xaml::DataTemplate, CurrentValueTemplate); + DEPENDENCY_PROPERTY(Windows::UI::Xaml::Controls::DataTemplateSelector, CurrentValueTemplateSelector); DEPENDENCY_PROPERTY(hstring, CurrentValueAccessibleName); DEPENDENCY_PROPERTY(bool, HasSettingValue); DEPENDENCY_PROPERTY(bool, StartExpanded); @@ -53,6 +54,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void _UpdateOverrideSystem(); void _UpdateHelpText(); void _UpdateCurrentValueAutoProp(); + void _UpdateCurrentValueTemplate(); }; } diff --git a/src/cascadia/TerminalSettingsEditor/SettingContainer.idl b/src/cascadia/TerminalSettingsEditor/SettingContainer.idl index 143d49b919..4c241313e9 100644 --- a/src/cascadia/TerminalSettingsEditor/SettingContainer.idl +++ b/src/cascadia/TerminalSettingsEditor/SettingContainer.idl @@ -24,6 +24,9 @@ namespace Microsoft.Terminal.Settings.Editor Windows.UI.Xaml.DataTemplate CurrentValueTemplate; static Windows.UI.Xaml.DependencyProperty CurrentValueTemplateProperty { get; }; + Windows.UI.Xaml.Controls.DataTemplateSelector CurrentValueTemplateSelector; + static Windows.UI.Xaml.DependencyProperty CurrentValueTemplateSelectorProperty { get; }; + String CurrentValueAccessibleName; static Windows.UI.Xaml.DependencyProperty CurrentValueAccessibleNameProperty { get; }; diff --git a/src/cascadia/TerminalSettingsEditor/SettingContainerStyle.xaml b/src/cascadia/TerminalSettingsEditor/SettingContainerStyle.xaml index 280dba68ad..4af3978f9b 100644 --- a/src/cascadia/TerminalSettingsEditor/SettingContainerStyle.xaml +++ b/src/cascadia/TerminalSettingsEditor/SettingContainerStyle.xaml @@ -470,6 +470,58 @@ + + +