diff --git a/src/settings-ui/Settings.UI/Converters/RunOptionTemplateSelector.cs b/src/settings-ui/Settings.UI/Converters/RunOptionTemplateSelector.cs new file mode 100644 index 0000000000..575562da5d --- /dev/null +++ b/src/settings-ui/Settings.UI/Converters/RunOptionTemplateSelector.cs @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.PowerToys.Settings.UI.Library; +using Microsoft.PowerToys.Settings.UI.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace Microsoft.PowerToys.Settings.UI.Converters +{ + public sealed class RunOptionTemplateSelector : DataTemplateSelector + { + public DataTemplate CheckBoxTemplate { get; set; } + + public DataTemplate ComboBoxTemplate { get; set; } + + public DataTemplate TextboxTemplate { get; set; } + + public DataTemplate NumberBoxTemplate { get; set; } + + public DataTemplate MultilineTextBoxTemplate { get; set; } + + public DataTemplate CheckBoxComboBoxTemplate { get; set; } + + public DataTemplate CheckBoxTextBoxTemplate { get; set; } + + public DataTemplate CheckBoxMultilineTextBoxTemplate { get; set; } + + public DataTemplate CheckBoxNumberBoxTemplate { get; set; } + + /// + /// Gets or sets an empty template used as fall back in case of malformed data + /// + public DataTemplate EmptyTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is PluginAdditionalOptionViewModel optionViewModel) + { + return optionViewModel.Type switch + { + PluginAdditionalOption.AdditionalOptionType.Checkbox => CheckBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.Combobox => ComboBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.Textbox => TextboxTemplate, + PluginAdditionalOption.AdditionalOptionType.Numberbox => NumberBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.MultilineTextbox => MultilineTextBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.CheckboxAndCombobox => CheckBoxComboBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.CheckboxAndTextbox => CheckBoxTextBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.CheckboxAndNumberbox => CheckBoxNumberBoxTemplate, + PluginAdditionalOption.AdditionalOptionType.CheckboxAndMultilineTextbox => CheckBoxMultilineTextBoxTemplate, + _ => EmptyTemplate, + }; + } + + throw new ArgumentException("Item must be an PluginAdditionalOptionViewModel", nameof(item)); + } + } +} diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/PowerLauncherPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/PowerLauncherPage.xaml index ca9a4d647d..1a2c01f6b3 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/PowerLauncherPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/PowerLauncherPage.xaml @@ -4,6 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ViewModels="using:Microsoft.PowerToys.Settings.UI.ViewModels" xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls" + xmlns:converters="using:Microsoft.PowerToys.Settings.UI.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:i="using:Microsoft.Xaml.Interactivity" xmlns:ic="using:Microsoft.Xaml.Interactions.Core" @@ -13,6 +14,293 @@ AutomationProperties.LandmarkType="Main" mc:Ignorable="d"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -297,13 +585,11 @@ Style="{ThemeResource SecondaryTextStyle}" /> - - - - - - - + + + + + @@ -395,261 +681,8 @@ HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" IsEnabled="{x:Bind Enabled, Mode=OneWay}" - ItemsSource="{x:Bind Path=AdditionalOptions}"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ItemTemplateSelector="{StaticResource RunOptionTemplateSelector}" + ItemsSource="{x:Bind Path=AdditionalOptions}" /> - - + + diff --git a/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs index a6689e704d..d1c22ad0b5 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs @@ -29,6 +29,8 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels public string SecondDisplayDescription => _additionalOption.SecondDisplayDescription; + public PluginAdditionalOption.AdditionalOptionType Type => _additionalOption.PluginOptionType; + // Bool checkbox setting public bool ShowCheckBox => _additionalOption.PluginOptionType == PluginAdditionalOption.AdditionalOptionType.Checkbox;