[UX] New dashboard & refactored KeyVisual (#40214)

### Updated `KeyVisual` and `Shortcut` control
- Refactoring `KeyVisual` to remove redundant properties and UI
elements, and using Styles for better customization.
- Shortcut control now shows a "Configure shortcut" label when there's
no shortcut configured.

### Other changes
- Consolidated converters that were used across pages in `App.xaml.cs`
with consistent naming.
- Renamed templated controls (from `.cs` to `.xaml.cs`) and moving those
to the `Controls` root folder vs. individual folders for a better
overview.
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

Closes #39520
Closes #32944

---------

Co-authored-by: Jay <65828559+Jay-o-Way@users.noreply.github.com>
Co-authored-by: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com>
This commit is contained in:
Niels Laute
2025-08-05 01:33:19 +02:00
committed by GitHub
parent fdd1f47d85
commit c91bef1517
43 changed files with 1415 additions and 1220 deletions

View File

@@ -120,9 +120,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library
if (Shift) if (Shift)
{ {
shortcutList.Add("Shift"); shortcutList.Add(16); // The Shift key or button.
// shortcutList.Add(16); // The Shift key or button.
} }
if (Code > 0) if (Code > 0)

View File

@@ -1,23 +0,0 @@
// 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 Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Microsoft.PowerToys.Settings.UI.Converters
{
internal sealed partial class KeyVisualTemplateSelector : DataTemplateSelector
{
public DataTemplate KeyVisualTemplate { get; set; }
public DataTemplate CommaTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var stringValue = item as string;
return stringValue == KeysDataModel.CommaSeparator ? CommaTemplate : KeyVisualTemplate;
}
}
}

View File

@@ -10,23 +10,17 @@ namespace Microsoft.PowerToys.Settings.UI.Converters
{ {
public partial class ModuleItemTemplateSelector : DataTemplateSelector public partial class ModuleItemTemplateSelector : DataTemplateSelector
{ {
public DataTemplate TextTemplate { get; set; }
public DataTemplate ButtonTemplate { get; set; }
public DataTemplate ShortcutTemplate { get; set; } public DataTemplate ShortcutTemplate { get; set; }
public DataTemplate KBMTemplate { get; set; } public DataTemplate ActivationTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{ {
switch (item) switch (item)
{ {
case DashboardModuleButtonItem: return ButtonTemplate;
case DashboardModuleShortcutItem: return ShortcutTemplate; case DashboardModuleShortcutItem: return ShortcutTemplate;
case DashboardModuleTextItem: return TextTemplate; case DashboardModuleActivationItem: return ActivationTemplate;
case DashboardModuleKBMItem: return KBMTemplate; default: return ActivationTemplate;
default: return TextTemplate;
} }
} }
} }

View File

@@ -22,6 +22,9 @@
<ItemGroup> <ItemGroup>
<None Remove="Assets\Settings\Modules\APDialog.dark.png" /> <None Remove="Assets\Settings\Modules\APDialog.dark.png" />
<None Remove="Assets\Settings\Modules\APDialog.light.png" /> <None Remove="Assets\Settings\Modules\APDialog.light.png" />
<None Remove="SettingsXAML\Controls\Dashboard\CheckUpdateControl.xaml" />
<None Remove="SettingsXAML\Controls\Dashboard\ShortcutConflictControl.xaml" />
<None Remove="SettingsXAML\Controls\KeyVisual\KeyCharPresenter.xaml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Remove="SettingsXAML\App.xaml" /> <Page Remove="SettingsXAML\App.xaml" />
@@ -132,6 +135,15 @@
<None Update="Assets\Settings\Scripts\DisableModule.ps1"> <None Update="Assets\Settings\Scripts\DisableModule.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<Page Update="SettingsXAML\Controls\KeyVisual\KeyCharPresenter.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Update="SettingsXAML\Controls\Dashboard\ShortcutConflictControl.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Update="SettingsXAML\Controls\Dashboard\CheckUpdateControl.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -3,17 +3,20 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls" xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:converters="using:Microsoft.PowerToys.Settings.UI.Converters"
xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters"> xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters">
<Application.Resources> <Application.Resources>
<ResourceDictionary> <ResourceDictionary>
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" /> <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
<ResourceDictionary Source="/SettingsXAML/Controls/KeyVisual/KeyVisual.xaml" /> <ResourceDictionary Source="/SettingsXAML/Controls/KeyVisual/KeyVisual.xaml" />
<ResourceDictionary Source="/SettingsXAML/Controls/KeyVisual/KeyCharPresenter.xaml" />
<ResourceDictionary Source="/SettingsXAML/Styles/TextBlock.xaml" /> <ResourceDictionary Source="/SettingsXAML/Styles/TextBlock.xaml" />
<ResourceDictionary Source="/SettingsXAML/Styles/Button.xaml" /> <ResourceDictionary Source="/SettingsXAML/Styles/Button.xaml" />
<ResourceDictionary Source="/SettingsXAML/Styles/InfoBadge.xaml" /> <ResourceDictionary Source="/SettingsXAML/Styles/InfoBadge.xaml" />
<ResourceDictionary Source="/SettingsXAML/Themes/Colors.xaml" /> <ResourceDictionary Source="/SettingsXAML/Themes/Colors.xaml" />
<ResourceDictionary Source="/SettingsXAML/Themes/Generic.xaml" /> <ResourceDictionary Source="/SettingsXAML/Themes/Generic.xaml" />
<!-- Other merged dictionaries here --> <!-- Other merged dictionaries here -->
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
@@ -26,19 +29,28 @@
x:Key="BoolToVisibilityConverter" x:Key="BoolToVisibilityConverter"
FalseValue="Collapsed" FalseValue="Collapsed"
TrueValue="Visible" /> TrueValue="Visible" />
<tkconverters:BoolToObjectConverter <tkconverters:BoolToObjectConverter
x:Key="BoolToComboBoxIndexConverter" x:Key="BoolToComboBoxIndexConverter"
FalseValue="0" FalseValue="0"
TrueValue="1" /> TrueValue="1" />
<tkconverters:BoolToObjectConverter <tkconverters:BoolToObjectConverter
x:Key="ReverseBoolToComboBoxIndexConverter" x:Key="ReverseBoolToComboBoxIndexConverter"
FalseValue="1" FalseValue="1"
TrueValue="0" /> TrueValue="0" />
<tkconverters:DoubleToVisibilityConverter
x:Name="DoubleToVisibilityConverter"
FalseValue="Collapsed"
GreaterThan="0"
TrueValue="Visible" />
<tkconverters:DoubleToVisibilityConverter
x:Name="DoubleToInvertedVisibilityConverter"
FalseValue="Visible"
GreaterThan="0"
TrueValue="Collapsed" />
<tkconverters:StringFormatConverter x:Key="StringFormatConverter" /> <tkconverters:StringFormatConverter x:Key="StringFormatConverter" />
<tkconverters:BoolNegationConverter x:Key="BoolNegationConverter" /> <tkconverters:BoolNegationConverter x:Key="BoolNegationConverter" />
<converters:UpdateStateToBoolConverter x:Key="UpdateStateToBoolConverter" />
<x:Double x:Key="SettingsCardSpacing">2</x:Double> <x:Double x:Key="SettingsCardSpacing">2</x:Double>
<!-- Overrides --> <!-- Overrides -->
@@ -46,6 +58,7 @@
<Thickness x:Key="InfoBarContentRootPadding">16,0,0,0</Thickness> <Thickness x:Key="InfoBarContentRootPadding">16,0,0,0</Thickness>
<x:Double x:Key="SettingActionControlMinWidth">240</x:Double> <x:Double x:Key="SettingActionControlMinWidth">240</x:Double>
<x:Double x:Key="PageMaxWidth">1000</x:Double>
<Style TargetType="ListViewItem"> <Style TargetType="ListViewItem">
<Setter Property="Margin" Value="0,0,0,2" /> <Setter Property="Margin" Value="0,0,0,2" />
@@ -55,7 +68,6 @@
</Style> </Style>
<Style BasedOn="{StaticResource DefaultCheckBoxStyle}" TargetType="controls:CheckBoxWithDescriptionControl" /> <Style BasedOn="{StaticResource DefaultCheckBoxStyle}" TargetType="controls:CheckBoxWithDescriptionControl" />
<!-- Other app resources here -->
<TransitionCollection x:Key="SettingsCardsAnimations"> <TransitionCollection x:Key="SettingsCardsAnimations">
<EntranceThemeTransition FromVerticalOffset="50" /> <EntranceThemeTransition FromVerticalOffset="50" />
@@ -63,6 +75,9 @@
<RepositionThemeTransition IsStaggeringEnabled="False" /> <RepositionThemeTransition IsStaggeringEnabled="False" />
<!-- Smoothly animates individual cards upon whenever Expanders are expanded/collapsed --> <!-- Smoothly animates individual cards upon whenever Expanders are expanded/collapsed -->
</TransitionCollection> </TransitionCollection>
<!-- Additional resources or settings can be added here -->
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>
</Application> </Application>

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="Microsoft.PowerToys.Settings.UI.Controls.Card"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Padding="8"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource OverlayCornerRadius}"
mc:Ignorable="d">
<Grid
VerticalAlignment="{x:Bind VerticalContentAlignment, Mode=OneWay}"
Background="{x:Bind Background, Mode=OneWay}"
BorderBrush="{x:Bind BorderBrush, Mode=OneWay}"
BorderThickness="{x:Bind BorderThickness, Mode=OneWay}"
CornerRadius="{x:Bind CornerRadius, Mode=OneWay}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="44" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="TitleGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Margin="16,0,0,0"
VerticalAlignment="Center"
FontSize="16"
FontWeight="SemiBold"
Text="{x:Bind Title, Mode=OneWay}" />
<ContentPresenter
Grid.Column="2"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Content="{x:Bind TitleContent, Mode=OneWay}" />
</Grid>
<Rectangle
x:Name="Divider"
Grid.Row="1"
Height="1"
HorizontalAlignment="Stretch"
Fill="{ThemeResource DividerStrokeColorDefaultBrush}"
Visibility="{x:Bind DividerVisibility, Mode=OneWay}" />
<ContentPresenter
Grid.Row="2"
Margin="{x:Bind Padding, Mode=OneWay}"
HorizontalAlignment="{x:Bind HorizontalContentAlignment, Mode=OneWay}"
VerticalAlignment="{x:Bind VerticalContentAlignment, Mode=OneWay}"
Content="{x:Bind Content, Mode=OneWay}" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="TitleGridVisibilityStates">
<VisualState x:Name="TitleGridVisible" />
<VisualState x:Name="TitleGridCollapsed">
<VisualState.Setters>
<Setter Target="TitleGrid.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</UserControl>

View File

@@ -0,0 +1,73 @@
// 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 Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
public sealed partial class Card : UserControl
{
public static readonly DependencyProperty TitleContentProperty = DependencyProperty.Register(nameof(TitleContent), typeof(object), typeof(Card), new PropertyMetadata(defaultValue: null, OnVisualPropertyChanged));
public object TitleContent
{
get => (object)GetValue(TitleContentProperty);
set => SetValue(TitleContentProperty, value);
}
public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(Card), new PropertyMetadata(defaultValue: null, OnVisualPropertyChanged));
public string Title
{
get => (string)GetValue(TitleProperty);
set => SetValue(TitleProperty, value);
}
public static new readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(Card), new PropertyMetadata(defaultValue: null));
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1061:Do not hide base class methods", Justification = "We need to hide the base class method")]
public new object Content
{
get => (object)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public static readonly DependencyProperty DividerVisibilityProperty = DependencyProperty.Register(nameof(DividerVisibility), typeof(Visibility), typeof(Card), new PropertyMetadata(defaultValue: null));
public Visibility DividerVisibility
{
get => (Visibility)GetValue(DividerVisibilityProperty);
set => SetValue(DividerVisibilityProperty, value);
}
public Card()
{
InitializeComponent();
SetVisualStates();
}
private static void OnVisualPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is Card card)
{
card.SetVisualStates();
}
}
private void SetVisualStates()
{
if (string.IsNullOrEmpty(Title) && TitleContent == null)
{
VisualStateManager.GoToState(this, "TitleGridCollapsed", true);
DividerVisibility = Visibility.Collapsed;
}
else
{
VisualStateManager.GoToState(this, "TitleGridVisible", true);
DividerVisibility = Visibility.Visible;
}
}
}
}

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="Microsoft.PowerToys.Settings.UI.Controls.CheckUpdateControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel Orientation="Horizontal">
<Button
Click="SWVersionButtonClicked"
Style="{StaticResource SubtleButtonStyle}"
Visibility="{x:Bind UpdateAvailable, Mode=OneWay}">
<Grid ColumnSpacing="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border
Width="20"
Height="20"
CornerRadius="10">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0.5,1">
<GradientStop Offset="0.0" Color="#239DE0" />
<GradientStop Offset="1.0" Color="#037CD6" />
</LinearGradientBrush>
</Border.Background>
<FontIcon
AutomationProperties.AccessibilityView="Raw"
FontSize="11"
Foreground="White"
Glyph="&#xE895;" />
</Border>
<StackPanel Grid.Column="1" Orientation="Vertical">
<TextBlock x:Uid="UpdateAvailableTextBlock" FontWeight="SemiBold" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Style="{StaticResource CaptionTextBlockStyle}">
<Run x:Uid="GeneralVersion" />
<Run Text="{x:Bind UpdateSettingsConfig.NewVersion, Mode=OneWay}" />
</TextBlock>
</StackPanel>
</Grid>
</Button>
<Grid
Padding="0,0,4,0"
VerticalAlignment="Center"
ColumnSpacing="16"
Visibility="{x:Bind UpdateAvailable, Converter={StaticResource ReverseBoolToVisibilityConverter}, Mode=OneWay}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border
Width="20"
Height="20"
CornerRadius="10">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0.5,1">
<GradientStop Offset="0.0" Color="#6FB538" />
<GradientStop Offset="1.0" Color="#397A24" />
</LinearGradientBrush>
</Border.Background>
<FontIcon
AutomationProperties.AccessibilityView="Raw"
FontSize="11"
Foreground="White"
Glyph="&#xE73E;" />
</Border>
<StackPanel Grid.Column="1" Orientation="Vertical">
<TextBlock x:Uid="YoureUpToDate" FontWeight="SemiBold" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Style="{StaticResource CaptionTextBlockStyle}">
<Run x:Uid="General_VersionLastChecked" />
<Run Text="{x:Bind UpdateSettingsConfig.LastCheckedDateLocalized, Mode=OneWay}" />
</TextBlock>
</StackPanel>
</Grid>
</StackPanel>
</UserControl>

View File

@@ -0,0 +1,30 @@
// 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 Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Services;
using Microsoft.PowerToys.Settings.UI.Views;
using Microsoft.UI.Xaml.Controls;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
public sealed partial class CheckUpdateControl : UserControl
{
public bool UpdateAvailable { get; set; }
public UpdatingSettings UpdateSettingsConfig { get; set; }
public CheckUpdateControl()
{
InitializeComponent();
UpdateSettingsConfig = UpdatingSettings.LoadSettings();
UpdateAvailable = UpdateSettingsConfig != null && (UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToInstall || UpdateSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToDownload);
}
private void SWVersionButtonClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
NavigationService.Navigate(typeof(GeneralPage));
}
}
}

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="Microsoft.PowerToys.Settings.UI.Controls.ShortcutConflictControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid>
<Button Click="ShortcutConflictBtn_Click" Style="{StaticResource SubtleButtonStyle}">
<Grid ColumnSpacing="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<FontIcon
AutomationProperties.AccessibilityView="Raw"
FontSize="20"
Foreground="{ThemeResource SystemFillColorCriticalBrush}"
Glyph="&#xE814;" />
<StackPanel Grid.Column="1" Orientation="Vertical">
<TextBlock FontWeight="SemiBold" Text="Shortcut conflicts" />
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="2 conflicts found" />
</StackPanel>
</Grid>
</Button>
</Grid>
</UserControl>

View File

@@ -0,0 +1,40 @@
// 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 System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
public sealed partial class ShortcutConflictControl : UserControl
{
public ShortcutConflictControl()
{
InitializeComponent();
GetShortcutConflicts();
}
private void GetShortcutConflicts()
{
// TO DO: Implement the logic to retrieve and display shortcut conflicts. Make sure to Collapse this control if not conflicts are found.
}
private void ShortcutConflictBtn_Click(object sender, RoutedEventArgs e)
{
// TO DO: Handle the button click event to show the shortcut conflicts window.
}
}
}

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Microsoft.PowerToys.Settings.UI.Controls"
xmlns:ui="using:CommunityToolkit.WinUI">
<Style BasedOn="{StaticResource DefaultKeyCharPresenterStyle}" TargetType="local:KeyCharPresenter" />
<Style x:Key="DefaultKeyCharPresenterStyle" TargetType="local:KeyCharPresenter">
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="AutomationProperties.AccessibilityView" Value="Raw" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:KeyCharPresenter">
<Grid Height="{TemplateBinding FontSize}">
<TextBlock
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
FontFamily="{TemplateBinding FontFamily}"
FontSize="{TemplateBinding FontSize}"
FontWeight="{TemplateBinding FontWeight}"
Text="{TemplateBinding Content}"
TextLineBounds="Tight" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
x:Key="WindowsKeyCharPresenterStyle"
BasedOn="{StaticResource DefaultKeyCharPresenterStyle}"
TargetType="local:KeyCharPresenter">
<!-- Scale to visually align the height of the Windows logo and text -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:KeyCharPresenter">
<Grid Height="{TemplateBinding FontSize}">
<Viewbox>
<PathIcon Data="M9 20H0V11H9V20ZM20 20H11V11H20V20ZM9 9H0V0H9V9ZM20 9H11V0H20V9Z" />
</Viewbox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
x:Key="GlyphKeyCharPresenterStyle"
BasedOn="{StaticResource DefaultKeyCharPresenterStyle}"
TargetType="local:KeyCharPresenter">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:KeyCharPresenter">
<Grid>
<Viewbox>
<FontIcon
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
FontSize="{TemplateBinding FontSize}"
FontWeight="{TemplateBinding FontWeight}"
Glyph="{TemplateBinding Content}" />
</Viewbox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,32 @@
// 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 System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Documents;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
namespace Microsoft.PowerToys.Settings.UI.Controls;
public sealed partial class KeyCharPresenter : Control
{
public KeyCharPresenter()
{
DefaultStyleKey = typeof(KeyCharPresenter);
}
public object Content
{
get => (object)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyCharPresenter), new PropertyMetadata(default(string)));
}

View File

@@ -1,191 +0,0 @@
// 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 Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
using Windows.System;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
[TemplatePart(Name = KeyPresenter, Type = typeof(ContentPresenter))]
[TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Disabled", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Default", GroupName = "StateStates")]
[TemplateVisualState(Name = "Error", GroupName = "StateStates")]
public sealed partial class KeyVisual : Control
{
private const string KeyPresenter = "KeyPresenter";
private KeyVisual _keyVisual;
private ContentPresenter _keyPresenter;
public object Content
{
get => (object)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(KeyVisual), new PropertyMetadata(default(string), OnContentChanged));
public VisualType VisualType
{
get => (VisualType)GetValue(VisualTypeProperty);
set => SetValue(VisualTypeProperty, value);
}
public static readonly DependencyProperty VisualTypeProperty = DependencyProperty.Register("VisualType", typeof(VisualType), typeof(KeyVisual), new PropertyMetadata(default(VisualType), OnSizeChanged));
public bool IsError
{
get => (bool)GetValue(IsErrorProperty);
set => SetValue(IsErrorProperty, value);
}
public static readonly DependencyProperty IsErrorProperty = DependencyProperty.Register("IsError", typeof(bool), typeof(KeyVisual), new PropertyMetadata(false, OnIsErrorChanged));
public KeyVisual()
{
this.DefaultStyleKey = typeof(KeyVisual);
this.Style = GetStyleSize("TextKeyVisualStyle");
}
protected override void OnApplyTemplate()
{
IsEnabledChanged -= KeyVisual_IsEnabledChanged;
_keyVisual = (KeyVisual)this;
_keyPresenter = (ContentPresenter)_keyVisual.GetTemplateChild(KeyPresenter);
Update();
SetEnabledState();
SetErrorState();
IsEnabledChanged += KeyVisual_IsEnabledChanged;
base.OnApplyTemplate();
}
private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((KeyVisual)d).Update();
}
private static void OnSizeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((KeyVisual)d).Update();
}
private static void OnIsErrorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((KeyVisual)d).SetErrorState();
}
private void Update()
{
if (_keyVisual == null)
{
return;
}
if (_keyVisual.Content != null)
{
if (_keyVisual.Content.GetType() == typeof(string))
{
_keyVisual.Style = GetStyleSize("TextKeyVisualStyle");
_keyVisual._keyPresenter.Content = _keyVisual.Content;
}
else
{
_keyVisual.Style = GetStyleSize("IconKeyVisualStyle");
switch ((int)_keyVisual.Content)
{
/* We can enable other glyphs in the future
case 13: // The Enter key or button.
_keyVisual._keyPresenter.Content = "\uE751"; break;
case 8: // The Back key or button.
_keyVisual._keyPresenter.Content = "\uE750"; break;
case 16: // The right Shift key or button.
case 160: // The left Shift key or button.
case 161: // The Shift key or button.
_keyVisual._keyPresenter.Content = "\uE752"; break; */
case 38: _keyVisual._keyPresenter.Content = "\uE0E4"; break; // The Up Arrow key or button.
case 40: _keyVisual._keyPresenter.Content = "\uE0E5"; break; // The Down Arrow key or button.
case 37: _keyVisual._keyPresenter.Content = "\uE0E2"; break; // The Left Arrow key or button.
case 39: _keyVisual._keyPresenter.Content = "\uE0E3"; break; // The Right Arrow key or button.
case 91: // The left Windows key
case 92: // The right Windows key
PathIcon winIcon = XamlReader.Load(@"<PathIcon xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" Data=""M683 1229H0V546h683v683zm819 0H819V546h683v683zm-819 819H0v-683h683v683zm819 0H819v-683h683v683z"" />") as PathIcon;
Viewbox winIconContainer = new Viewbox();
winIconContainer.Child = winIcon;
winIconContainer.HorizontalAlignment = HorizontalAlignment.Center;
winIconContainer.VerticalAlignment = VerticalAlignment.Center;
double iconDimensions = GetIconSize();
winIconContainer.Height = iconDimensions;
winIconContainer.Width = iconDimensions;
_keyVisual._keyPresenter.Content = winIconContainer;
break;
default: _keyVisual._keyPresenter.Content = ((VirtualKey)_keyVisual.Content).ToString(); break;
}
}
}
}
public Style GetStyleSize(string styleName)
{
if (VisualType == VisualType.Small)
{
return (Style)App.Current.Resources["Small" + styleName];
}
else if (VisualType == VisualType.SmallOutline)
{
return (Style)App.Current.Resources["SmallOutline" + styleName];
}
else if (VisualType == VisualType.TextOnly)
{
return (Style)App.Current.Resources["Only" + styleName];
}
else
{
return (Style)App.Current.Resources["Default" + styleName];
}
}
public double GetIconSize()
{
if (VisualType == VisualType.Small || VisualType == VisualType.SmallOutline)
{
return (double)App.Current.Resources["SmallIconSize"];
}
else
{
return (double)App.Current.Resources["DefaultIconSize"];
}
}
private void KeyVisual_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
SetEnabledState();
}
private void SetErrorState()
{
VisualStateManager.GoToState(this, IsError ? "Error" : "Default", true);
}
private void SetEnabledState()
{
VisualStateManager.GoToState(this, IsEnabled ? "Normal" : "Disabled", true);
}
}
public enum VisualType
{
Small,
SmallOutline,
TextOnly,
Large,
}
}

View File

@@ -1,66 +1,70 @@
<ResourceDictionary <ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Microsoft.PowerToys.Settings.UI.Controls"> xmlns:local="using:Microsoft.PowerToys.Settings.UI.Controls">
<x:Double x:Key="DefaultIconSize">16</x:Double> <Style BasedOn="{StaticResource DefaultKeyVisualStyle}" TargetType="local:KeyVisual" />
<x:Double x:Key="SmallIconSize">12</x:Double>
<Style x:Key="DefaultTextKeyVisualStyle" TargetType="controls:KeyVisual"> <Style x:Key="DefaultKeyVisualStyle" TargetType="local:KeyVisual">
<Setter Property="MinWidth" Value="56" /> <Setter Property="MinWidth" Value="16" />
<Setter Property="MinHeight" Value="48" /> <Setter Property="AutomationProperties.AccessibilityView" Value="Raw" />
<Setter Property="Background" Value="{ThemeResource AccentButtonBackground}" /> <Setter Property="IsTabStop" Value="False" />
<Setter Property="Foreground" Value="{ThemeResource AccentButtonForeground}" /> <Setter Property="MinHeight" Value="16" />
<Setter Property="BorderBrush" Value="{ThemeResource AccentButtonBorderBrush}" /> <Setter Property="Background" Value="{ThemeResource SubtleFillColorTransparentBrush}" />
<Setter Property="BorderThickness" Value="{ThemeResource ButtonBorderThemeThickness}" /> <Setter Property="Foreground" Value="{ThemeResource TextFillColorPrimaryBrush}" />
<Setter Property="Padding" Value="16,8,16,8" /> <Setter Property="BorderBrush" Value="{ThemeResource ControlStrokeColorDefaultBrush}" />
<Setter Property="FontWeight" Value="SemiBold" /> <Setter Property="BorderThickness" Value="1" />
<Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="Padding" Value="4,4,4,4" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="FontSize" Value="14" />
<Setter Property="CornerRadius" Value="2" />
<Setter Property="BackgroundSizing" Value="InnerBorderEdge" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="HorizontalContentAlignment" Value="Center" /> <Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="FontSize" Value="18" /> <Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="controls:KeyVisual"> <ControlTemplate TargetType="local:KeyVisual">
<Grid> <Grid
<Grid> x:Name="KeyHolder"
<Rectangle
x:Name="ContentHolder"
Height="{TemplateBinding Height}"
MinWidth="{TemplateBinding MinWidth}" MinWidth="{TemplateBinding MinWidth}"
Fill="{TemplateBinding Background}" MinHeight="{TemplateBinding MinHeight}"
RadiusX="4" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
RadiusY="4" VerticalAlignment="{TemplateBinding VerticalAlignment}"
Stroke="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"
StrokeThickness="{TemplateBinding BorderThickness}" /> BorderBrush="{TemplateBinding BorderBrush}"
<ContentPresenter BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<Grid.BackgroundTransition>
<BrushTransition Duration="0:0:0.083" />
</Grid.BackgroundTransition>
<local:KeyCharPresenter
x:Name="KeyPresenter" x:Name="KeyPresenter"
Margin="{TemplateBinding Padding}" Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="Center" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
AutomationProperties.AccessibilityView="Raw"
Content="{TemplateBinding Content}" Content="{TemplateBinding Content}"
FontSize="{TemplateBinding FontSize}" FontSize="{TemplateBinding FontSize}"
FontWeight="{TemplateBinding FontWeight}" FontWeight="{TemplateBinding FontWeight}"
Foreground="{TemplateBinding Foreground}" /> Foreground="{TemplateBinding Foreground}" />
</Grid>
<VisualStateManager.VisualStateGroups> <VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates"> <VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" /> <VisualState x:Name="Normal" />
<VisualState x:Name="Disabled"> <VisualState x:Name="Disabled">
<VisualState.Setters> <VisualState.Setters>
<Setter Target="ContentHolder.Fill" Value="{ThemeResource AccentButtonBackgroundDisabled}" /> <Setter Target="KeyHolder.Background" Value="{ThemeResource SubtleFillColorTransparentBrush}" />
<Setter Target="KeyPresenter.Foreground" Value="{ThemeResource AccentButtonForegroundDisabled}" /> <Setter Target="KeyHolder.BorderBrush" Value="{ThemeResource CardStrokeColorDefaultSolidBrush}" />
<Setter Target="ContentHolder.Stroke" Value="{ThemeResource AccentButtonBorderBrushDisabled}" /> <Setter Target="KeyPresenter.Foreground" Value="{ThemeResource ControlStrokeColorDefaultBrush}" />
<!--<Setter Target="ContentHolder.StrokeThickness" Value="{TemplateBinding BorderThickness}" />-->
</VisualState.Setters> </VisualState.Setters>
</VisualState> </VisualState>
</VisualStateGroup> <VisualState x:Name="Invalid">
<VisualStateGroup x:Name="StateStates">
<VisualState x:Name="Default" />
<VisualState x:Name="Error">
<VisualState.Setters> <VisualState.Setters>
<Setter Target="ContentHolder.Fill" Value="{ThemeResource InfoBarErrorSeverityBackgroundBrush}" /> <Setter Target="KeyHolder.Background" Value="{ThemeResource SystemFillColorCriticalBackgroundBrush}" />
<Setter Target="KeyPresenter.Foreground" Value="{ThemeResource InfoBarErrorSeverityIconBackground}" /> <Setter Target="KeyHolder.BorderBrush" Value="{ThemeResource SystemFillColorCriticalBrush}" />
<Setter Target="ContentHolder.Stroke" Value="{ThemeResource InfoBarErrorSeverityIconBackground}" /> <Setter Target="KeyHolder.BorderThickness" Value="2" />
<Setter Target="ContentHolder.StrokeThickness" Value="2" /> <Setter Target="KeyPresenter.Foreground" Value="{ThemeResource SystemFillColorCriticalBrush}" />
</VisualState.Setters> </VisualState.Setters>
</VisualState> </VisualState>
</VisualStateGroup> </VisualStateGroup>
@@ -72,103 +76,116 @@
</Style> </Style>
<Style <Style
x:Key="SmallTextKeyVisualStyle" x:Key="SubtleKeyVisualStyle"
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" BasedOn="{StaticResource DefaultKeyVisualStyle}"
TargetType="controls:KeyVisual"> TargetType="local:KeyVisual">
<Setter Property="MinWidth" Value="40" /> <Setter Property="Background" Value="{ThemeResource SubtleFillColorTransparentBrush}" />
<Setter Property="Height" Value="36" /> <Setter Property="BorderBrush" Value="{ThemeResource SubtleFillColorTransparentBrush}" />
<Setter Property="FontWeight" Value="SemiBold" /> <Setter Property="Template">
<Setter Property="Padding" Value="12,0,12,2" /> <Setter.Value>
<Setter Property="FontSize" Value="14" /> <ControlTemplate TargetType="local:KeyVisual">
<Setter Property="HorizontalContentAlignment" Value="Center" /> <Grid
x:Name="KeyHolder"
MinWidth="{TemplateBinding MinWidth}"
MinHeight="{TemplateBinding MinHeight}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<Grid.BackgroundTransition>
<BrushTransition Duration="0:0:0.083" />
</Grid.BackgroundTransition>
<local:KeyCharPresenter
x:Name="KeyPresenter"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
AutomationProperties.AccessibilityView="Raw"
Content="{TemplateBinding Content}"
FontSize="{TemplateBinding FontSize}"
FontWeight="{TemplateBinding FontWeight}"
Foreground="{TemplateBinding Foreground}" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Target="KeyPresenter.Foreground" Value="{ThemeResource TextFillColorDisabledBrush}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Invalid">
<VisualState.Setters>
<Setter Target="KeyPresenter.Foreground" Value="{ThemeResource SystemFillColorCriticalBrush}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style> </Style>
<Style <Style
x:Key="SmallOutlineTextKeyVisualStyle" x:Key="AccentKeyVisualStyle"
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" BasedOn="{StaticResource DefaultKeyVisualStyle}"
TargetType="controls:KeyVisual"> TargetType="local:KeyVisual">
<Setter Property="MinWidth" Value="40" />
<Setter Property="Background" Value="{ThemeResource ButtonBackground}" />
<Setter Property="Foreground" Value="{ThemeResource ButtonForeground}" />
<Setter Property="BorderBrush" Value="{ThemeResource ButtonBorderBrush}" />
<Setter Property="Height" Value="36" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Padding" Value="8,0,8,2" />
<Setter Property="FontSize" Value="13" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Setter Property="Background" Value="{ThemeResource AccentFillColorDefaultBrush}" />
<Setter Property="Foreground" Value="{ThemeResource TextOnAccentFillColorPrimaryBrush}" />
<Style <Setter Property="BorderBrush" Value="{ThemeResource AccentControlElevationBorderBrush}" />
x:Key="DefaultIconKeyVisualStyle" <Setter Property="BackgroundSizing" Value="OuterBorderEdge" />
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" <Setter Property="Template">
TargetType="controls:KeyVisual"> <Setter.Value>
<Setter Property="MinWidth" Value="56" /> <ControlTemplate TargetType="local:KeyVisual">
<Setter Property="MinHeight" Value="48" /> <Grid
<Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" /> x:Name="KeyHolder"
<Setter Property="Padding" Value="16,8,16,8" /> MinWidth="{TemplateBinding MinWidth}"
<Setter Property="FontSize" Value="14" /> MinHeight="{TemplateBinding MinHeight}"
<Setter Property="HorizontalContentAlignment" Value="Center" /> HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
</Style> VerticalAlignment="{TemplateBinding VerticalAlignment}"
AutomationProperties.AccessibilityView="Raw"
<Style Background="{TemplateBinding Background}"
x:Key="SmallIconKeyVisualStyle" BorderBrush="{TemplateBinding BorderBrush}"
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" BorderThickness="{TemplateBinding BorderThickness}"
TargetType="controls:KeyVisual"> CornerRadius="{TemplateBinding CornerRadius}">
<Setter Property="MinWidth" Value="40" /> <Grid.BackgroundTransition>
<Setter Property="Height" Value="36" /> <BrushTransition Duration="0:0:0.083" />
<Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" /> </Grid.BackgroundTransition>
<Setter Property="FontWeight" Value="Normal" /> <local:KeyCharPresenter
<Setter Property="Padding" Value="0" /> x:Name="KeyPresenter"
<Setter Property="FontSize" Value="10" /> Margin="{TemplateBinding Padding}"
<Setter Property="HorizontalContentAlignment" Value="Center" /> HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
</Style> VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
<Style FontSize="{TemplateBinding FontSize}"
x:Key="SmallOutlineIconKeyVisualStyle" FontWeight="{TemplateBinding FontWeight}"
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" Foreground="{TemplateBinding Foreground}" />
TargetType="controls:KeyVisual"> <VisualStateManager.VisualStateGroups>
<Setter Property="MinWidth" Value="40" /> <VisualStateGroup x:Name="CommonStates">
<Setter Property="Background" Value="{ThemeResource ButtonBackground}" /> <VisualState x:Name="Normal" />
<Setter Property="Foreground" Value="{ThemeResource ButtonForeground}" /> <VisualState x:Name="Disabled">
<Setter Property="BorderBrush" Value="{ThemeResource ButtonBorderBrush}" /> <VisualState.Setters>
<Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" /> <Setter Target="KeyHolder.Background" Value="{ThemeResource AccentButtonBackgroundDisabled}" />
<Setter Property="Height" Value="36" /> <Setter Target="KeyHolder.BorderBrush" Value="{ThemeResource AccentButtonBorderBrushDisabled}" />
<Setter Property="FontWeight" Value="SemiBold" /> <Setter Target="KeyPresenter.Foreground" Value="{ThemeResource AccentButtonForegroundDisabled}" />
<Setter Property="Padding" Value="0" /> </VisualState.Setters>
<Setter Property="FontSize" Value="9" /> </VisualState>
<Setter Property="HorizontalContentAlignment" Value="Center" /> <VisualState x:Name="Invalid">
</Style> <VisualState.Setters>
<Setter Target="KeyHolder.Background" Value="{ThemeResource SystemFillColorCriticalBackgroundBrush}" />
<Style <Setter Target="KeyHolder.BorderBrush" Value="{ThemeResource SystemFillColorCriticalBrush}" />
x:Key="OnlyTextKeyVisualStyle" <Setter Target="KeyHolder.BorderThickness" Value="2" />
BasedOn="{StaticResource DefaultTextKeyVisualStyle}" <Setter Target="KeyPresenter.Foreground" Value="{ThemeResource SystemFillColorCriticalBrush}" />
TargetType="controls:KeyVisual"> </VisualState.Setters>
<Setter Property="MinHeight" Value="12" /> </VisualState>
<Setter Property="MinWidth" Value="12" /> </VisualStateGroup>
<Setter Property="Background" Value="Transparent" /> </VisualStateManager.VisualStateGroups>
<Setter Property="Foreground" Value="{ThemeResource ButtonForeground}" /> </Grid>
<Setter Property="BorderBrush" Value="Transparent" /> </ControlTemplate>
<Setter Property="FontWeight" Value="Normal" /> </Setter.Value>
<Setter Property="Padding" Value="0" /> </Setter>
<Setter Property="FontSize" Value="12" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style
x:Key="OnlyIconKeyVisualStyle"
BasedOn="{StaticResource DefaultTextKeyVisualStyle}"
TargetType="controls:KeyVisual">
<Setter Property="MinHeight" Value="10" />
<Setter Property="MinWidth" Value="10" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{ThemeResource ButtonForeground}" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="Padding" Value="0,0,0,3" />
<!--<Setter Property="FontSize" Value="9" />-->
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style> </Style>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -0,0 +1,166 @@
// 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 Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Windows.System;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
[TemplatePart(Name = KeyPresenter, Type = typeof(KeyCharPresenter))]
[TemplateVisualState(Name = NormalState, GroupName = "CommonStates")]
[TemplateVisualState(Name = DisabledState, GroupName = "CommonStates")]
[TemplateVisualState(Name = InvalidState, GroupName = "CommonStates")]
public sealed partial class KeyVisual : Control
{
private const string KeyPresenter = "KeyPresenter";
private const string NormalState = "Normal";
private const string DisabledState = "Disabled";
private const string InvalidState = "Invalid";
private KeyCharPresenter _keyPresenter;
public object Content
{
get => (object)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyVisual), new PropertyMetadata(default(string), OnContentChanged));
public bool IsInvalid
{
get => (bool)GetValue(IsInvalidProperty);
set => SetValue(IsInvalidProperty, value);
}
public static readonly DependencyProperty IsInvalidProperty = DependencyProperty.Register(nameof(IsInvalid), typeof(bool), typeof(KeyVisual), new PropertyMetadata(false, OnIsInvalidChanged));
public bool RenderKeyAsGlyph
{
get => (bool)GetValue(RenderKeyAsGlyphProperty);
set => SetValue(RenderKeyAsGlyphProperty, value);
}
public static readonly DependencyProperty RenderKeyAsGlyphProperty = DependencyProperty.Register(nameof(RenderKeyAsGlyph), typeof(bool), typeof(KeyVisual), new PropertyMetadata(false, OnContentChanged));
public KeyVisual()
{
this.DefaultStyleKey = typeof(KeyVisual);
}
protected override void OnApplyTemplate()
{
IsEnabledChanged -= KeyVisual_IsEnabledChanged;
_keyPresenter = (KeyCharPresenter)this.GetTemplateChild(KeyPresenter);
Update();
SetVisualStates();
IsEnabledChanged += KeyVisual_IsEnabledChanged;
base.OnApplyTemplate();
}
private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((KeyVisual)d).SetVisualStates();
}
private static void OnIsInvalidChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((KeyVisual)d).SetVisualStates();
}
private void SetVisualStates()
{
if (this != null)
{
if (IsInvalid)
{
VisualStateManager.GoToState(this, InvalidState, true);
}
else if (!IsEnabled)
{
VisualStateManager.GoToState(this, DisabledState, true);
}
else
{
VisualStateManager.GoToState(this, NormalState, true);
}
}
}
private void Update()
{
if (Content == null)
{
return;
}
if (Content is string)
{
_keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
return;
}
if (Content is int keyCode)
{
VirtualKey virtualKey = (VirtualKey)keyCode;
switch (virtualKey)
{
case VirtualKey.Enter:
SetGlyphOrText("\uE751", virtualKey);
break;
case VirtualKey.Back:
SetGlyphOrText("\uE750", virtualKey);
break;
case VirtualKey.Shift:
case (VirtualKey)160: // Left Shift
case (VirtualKey)161: // Right Shift
SetGlyphOrText("\uE752", virtualKey);
break;
case VirtualKey.Up:
_keyPresenter.Content = "\uE0E4";
break;
case VirtualKey.Down:
_keyPresenter.Content = "\uE0E5";
break;
case VirtualKey.Left:
_keyPresenter.Content = "\uE0E2";
break;
case VirtualKey.Right:
_keyPresenter.Content = "\uE0E3";
break;
case VirtualKey.LeftWindows:
case VirtualKey.RightWindows:
_keyPresenter.Style = (Style)Application.Current.Resources["WindowsKeyCharPresenterStyle"];
break;
}
}
}
private void SetGlyphOrText(string glyph, VirtualKey key)
{
if (RenderKeyAsGlyph)
{
_keyPresenter.Content = glyph;
_keyPresenter.Style = (Style)Application.Current.Resources["GlyphKeyCharPresenterStyle"];
}
else
{
_keyPresenter.Content = key.ToString();
_keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
}
}
private void KeyVisual_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
SetVisualStates();
}
}
}

View File

@@ -31,8 +31,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
Content="{Binding}" Content="{Binding}"
IsTabStop="False" IsTabStop="False" />
VisualType="SmallOutline" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>

View File

@@ -6,20 +6,12 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:tk7controls="using:CommunityToolkit.WinUI.UI.Controls" xmlns:tk7controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters"
Loaded="UserControl_Loaded" Loaded="UserControl_Loaded"
mc:Ignorable="d"> mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<x:Double x:Key="PageMaxWidth">1000</x:Double> <x:Double x:Key="PageMaxWidth">1000</x:Double>
<x:Double x:Key="PageHeaderMaxWidth">1020</x:Double> <x:Double x:Key="PageHeaderMaxWidth">1020</x:Double>
<tkconverters:DoubleToVisibilityConverter
x:Name="doubleToVisibilityConverter"
FalseValue="Collapsed"
GreaterThan="0"
TrueValue="Visible" />
</UserControl.Resources> </UserControl.Resources>
<Grid Padding="20,0,0,0" RowSpacing="24"> <Grid Padding="20,0,0,0" RowSpacing="24">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -62,7 +54,7 @@
MaxWidth="160" MaxWidth="160"
HorizontalAlignment="Left" HorizontalAlignment="Left"
VerticalAlignment="Top" VerticalAlignment="Top"
CornerRadius="4"> CornerRadius="{StaticResource OverlayCornerRadius}">
<Image AutomationProperties.AccessibilityView="Raw"> <Image AutomationProperties.AccessibilityView="Raw">
<Image.Source> <Image.Source>
<BitmapImage UriSource="{x:Bind ModuleImageSource}" /> <BitmapImage UriSource="{x:Bind ModuleImageSource}" />
@@ -113,7 +105,7 @@
MaxWidth="{StaticResource PageMaxWidth}" MaxWidth="{StaticResource PageMaxWidth}"
AutomationProperties.Name="{x:Bind SecondaryLinksHeader}" AutomationProperties.Name="{x:Bind SecondaryLinksHeader}"
Orientation="Vertical" Orientation="Vertical"
Visibility="{x:Bind SecondaryLinks.Count, Converter={StaticResource doubleToVisibilityConverter}}"> Visibility="{x:Bind SecondaryLinks.Count, Converter={StaticResource DoubleToVisibilityConverter}}">
<TextBlock <TextBlock
Margin="2,8,0,0" Margin="2,8,0,0"
AutomationProperties.HeadingLevel="Level2" AutomationProperties.HeadingLevel="Level2"

View File

@@ -11,21 +11,20 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Grid HorizontalAlignment="Right"> <Grid HorizontalAlignment="Right">
<StackPanel Orientation="Horizontal">
<Button <Button
x:Name="EditButton" x:Name="EditButton"
Padding="0" Padding="0"
HorizontalAlignment="Right"
Click="OpenDialogButton_Click" Click="OpenDialogButton_Click"
CornerRadius="8"> Style="{StaticResource SubtleButtonStyle}">
<StackPanel <StackPanel Orientation="Horizontal" Spacing="8">
Margin="12,6,12,6"
Orientation="Horizontal"
Spacing="16">
<ItemsControl <ItemsControl
x:Name="PreviewKeysControl" x:Name="PreviewKeysControl"
Margin="2"
VerticalAlignment="Center" VerticalAlignment="Center"
IsEnabled="{Binding ElementName=EditButton, Path=IsEnabled}" IsEnabled="{Binding ElementName=EditButton, Path=IsEnabled}"
IsTabStop="False"> IsTabStop="False"
Visibility="Collapsed">
<ItemsControl.ItemsPanel> <ItemsControl.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="4" /> <StackPanel Orientation="Horizontal" Spacing="4" />
@@ -34,20 +33,52 @@
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate> <DataTemplate>
<controls:KeyVisual <controls:KeyVisual
Padding="12,8,12,8"
VerticalAlignment="Center" VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
Content="{Binding}" Content="{Binding}"
CornerRadius="{StaticResource ControlCornerRadius}"
FontWeight="SemiBold"
IsTabStop="False" IsTabStop="False"
VisualType="Small" /> Style="{StaticResource AccentKeyVisualStyle}" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
<StackPanel
x:Name="PlaceholderPanel"
Padding="8,4"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}"
Orientation="Horizontal"
Spacing="8">
<!--<FontIcon
AutomationProperties.AccessibilityView="Raw"
FontSize="12"
Glyph="&#xEDA7;" />-->
<TextBlock
x:Uid="ConfigureShortcutText"
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
</StackPanel>
<FontIcon <FontIcon
Margin="0,0,4,0"
AutomationProperties.Name=""
FontFamily="{ThemeResource SymbolThemeFontFamily}" FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="16" FontSize="14"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE70F;" /> Glyph="&#xE70F;" />
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> <VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Configured">
<VisualState.Setters>
<Setter Target="PlaceholderPanel.Visibility" Value="Collapsed" />
<Setter Target="PreviewKeysControl.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@@ -3,7 +3,6 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System; using System;
using CommunityToolkit.WinUI; using CommunityToolkit.WinUI;
using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library;
@@ -11,6 +10,7 @@ using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Automation; using Microsoft.UI.Xaml.Automation;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Input;
using Microsoft.Windows.ApplicationModel.Resources;
using Windows.System; using Windows.System;
namespace Microsoft.PowerToys.Settings.UI.Controls namespace Microsoft.PowerToys.Settings.UI.Controls
@@ -36,6 +36,8 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
public static readonly DependencyProperty AllowDisableProperty = DependencyProperty.Register("AllowDisable", typeof(bool), typeof(ShortcutControl), new PropertyMetadata(false, OnAllowDisableChanged)); public static readonly DependencyProperty AllowDisableProperty = DependencyProperty.Register("AllowDisable", typeof(bool), typeof(ShortcutControl), new PropertyMetadata(false, OnAllowDisableChanged));
private static ResourceLoader resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader;
private static void OnAllowDisableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) private static void OnAllowDisableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ {
var me = d as ShortcutControl; var me = d as ShortcutControl;
@@ -50,8 +52,6 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
return; return;
} }
var resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader;
var newValue = (bool)(e?.NewValue ?? false); var newValue = (bool)(e?.NewValue ?? false);
var text = newValue ? resourceLoader.GetString("Activation_Shortcut_With_Disable_Description") : resourceLoader.GetString("Activation_Shortcut_Description"); var text = newValue ? resourceLoader.GetString("Activation_Shortcut_With_Disable_Description") : resourceLoader.GetString("Activation_Shortcut_Description");
@@ -103,8 +103,7 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
{ {
hotkeySettings = value; hotkeySettings = value;
SetValue(HotkeySettingsProperty, value); SetValue(HotkeySettingsProperty, value);
PreviewKeysControl.ItemsSource = HotkeySettings.GetKeysList(); SetKeys();
AutomationProperties.SetHelpText(EditButton, HotkeySettings.ToString());
c.Keys = HotkeySettings.GetKeysList(); c.Keys = HotkeySettings.GetKeysList();
} }
} }
@@ -118,8 +117,6 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
this.Unloaded += ShortcutControl_Unloaded; this.Unloaded += ShortcutControl_Unloaded;
this.Loaded += ShortcutControl_Loaded; this.Loaded += ShortcutControl_Loaded;
var resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader;
// We create the Dialog in C# because doing it in XAML is giving WinUI/XAML Island bugs when using dark theme. // We create the Dialog in C# because doing it in XAML is giving WinUI/XAML Island bugs when using dark theme.
shortcutDialog = new ContentDialog shortcutDialog = new ContentDialog
{ {
@@ -433,11 +430,9 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
hotkeySettings = null; hotkeySettings = null;
SetValue(HotkeySettingsProperty, hotkeySettings); SetValue(HotkeySettingsProperty, hotkeySettings);
PreviewKeysControl.ItemsSource = HotkeySettings.GetKeysList(); SetKeys();
lastValidSettings = hotkeySettings; lastValidSettings = hotkeySettings;
AutomationProperties.SetHelpText(EditButton, HotkeySettings.ToString());
shortcutDialog.Hide(); shortcutDialog.Hide();
} }
@@ -448,8 +443,7 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
HotkeySettings = lastValidSettings with { }; HotkeySettings = lastValidSettings with { };
} }
PreviewKeysControl.ItemsSource = hotkeySettings.GetKeysList(); SetKeys();
AutomationProperties.SetHelpText(EditButton, HotkeySettings.ToString());
shortcutDialog.Hide(); shortcutDialog.Hide();
} }
@@ -462,9 +456,7 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
var empty = new HotkeySettings(); var empty = new HotkeySettings();
HotkeySettings = empty; HotkeySettings = empty;
SetKeys();
PreviewKeysControl.ItemsSource = HotkeySettings.GetKeysList();
AutomationProperties.SetHelpText(EditButton, HotkeySettings.ToString());
shortcutDialog.Hide(); shortcutDialog.Hide();
} }
@@ -525,5 +517,22 @@ namespace Microsoft.PowerToys.Settings.UI.Controls
Dispose(disposing: true); Dispose(disposing: true);
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
private void SetKeys()
{
var keys = HotkeySettings.GetKeysList();
if (keys != null && keys.Count > 0)
{
VisualStateManager.GoToState(this, "Configured", true);
PreviewKeysControl.ItemsSource = keys;
AutomationProperties.SetHelpText(EditButton, HotkeySettings.ToString());
}
else
{
VisualStateManager.GoToState(this, "Normal", true);
AutomationProperties.SetHelpText(EditButton, resourceLoader.GetString("ConfigureShortcut"));
}
}
} }
} }

View File

@@ -14,9 +14,6 @@
<RowDefinition MinHeight="110" /> <RowDefinition MinHeight="110" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" />
<ItemsControl <ItemsControl
x:Name="KeysControl" x:Name="KeysControl"
Grid.Row="1" Grid.Row="1"
@@ -34,12 +31,15 @@
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate> <DataTemplate>
<controls:KeyVisual <controls:KeyVisual
Height="56" Padding="20,16"
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
Content="{Binding}" Content="{Binding}"
IsError="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}" CornerRadius="{StaticResource ControlCornerRadius}"
FontSize="16"
FontWeight="SemiBold"
IsInvalid="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}"
IsTabStop="False" IsTabStop="False"
VisualType="Large" /> Style="{StaticResource AccentKeyVisualStyle}" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
@@ -51,14 +51,12 @@
Orientation="Vertical" Orientation="Vertical"
Spacing="8"> Spacing="8">
<Grid Height="62"> <Grid Height="62">
<InfoBar <InfoBar
x:Uid="InvalidShortcut" x:Uid="InvalidShortcut"
IsClosable="False" IsClosable="False"
IsOpen="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}" IsOpen="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}"
IsTabStop="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}" IsTabStop="{Binding ElementName=ShortcutContentControl, Path=IsError, Mode=OneWay}"
Severity="Error" /> Severity="Error" />
<InfoBar <InfoBar
x:Uid="WarningShortcutAltGr" x:Uid="WarningShortcutAltGr"
IsClosable="False" IsClosable="False"

View File

@@ -28,11 +28,11 @@
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate> <DataTemplate>
<controls:KeyVisual <controls:KeyVisual
VerticalAlignment="Center" Padding="12,8,12,8"
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
Content="{Binding}" Content="{Binding}"
IsTabStop="False" FontSize="12"
VisualType="SmallOutline" /> IsTabStop="False" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>

View File

@@ -7,17 +7,8 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters"
xmlns:viewModels="using:Microsoft.PowerToys.Settings.UI.ViewModels" xmlns:viewModels="using:Microsoft.PowerToys.Settings.UI.ViewModels"
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources>
<tkconverters:BoolNegationConverter x:Key="BoolNegationConverter" />
<tkconverters:BoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
</Page.Resources>
<Grid Background="{ThemeResource LayerOnAcrylicFillColorDefaultBrush}"> <Grid Background="{ThemeResource LayerOnAcrylicFillColorDefaultBrush}">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -89,7 +80,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
FontSize="16" FontSize="16"
Glyph="&#xE72E;" Glyph="&#xE72E;"
Visibility="{x:Bind IsLocked, Converter={StaticResource BoolToInvertedVisibilityConverter}, ConverterParameter=True, Mode=OneWay}"> Visibility="{x:Bind IsLocked, Converter={StaticResource ReverseBoolToVisibilityConverter}, ConverterParameter=True, Mode=OneWay}">
<ToolTipService.ToolTip> <ToolTipService.ToolTip>
<TextBlock x:Uid="GPO_SettingIsManaged_ToolTip" TextWrapping="WrapWholeWords" /> <TextBlock x:Uid="GPO_SettingIsManaged_ToolTip" TextWrapping="WrapWholeWords" />
</ToolTipService.ToolTip> </ToolTipService.ToolTip>

View File

@@ -21,7 +21,6 @@
<Setter Property="Height" Value="32" /> <Setter Property="Height" Value="32" />
<Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" /> <Setter Property="FontFamily" Value="{ThemeResource SymbolThemeFontFamily}" />
</Style> </Style>
<tkconverters:StringVisibilityConverter x:Key="StringVisibilityConverter" /> <tkconverters:StringVisibilityConverter x:Key="StringVisibilityConverter" />
</Page.Resources> </Page.Resources>
<Grid> <Grid>
@@ -110,7 +109,7 @@
</Grid> </Grid>
<Grid Grid.Row="2"> <Grid Grid.Row="2">
<InfoBar <InfoBar
x:Uid="UpdateAvailable" x:Uid="UpdateAvailableInfoBar"
IsClosable="False" IsClosable="False"
IsOpen="{x:Bind ViewModel.IsUpdateAvailable, Mode=OneWay}" IsOpen="{x:Bind ViewModel.IsUpdateAvailable, Mode=OneWay}"
Severity="Success" /> Severity="Success" />

View File

@@ -2,7 +2,7 @@
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/SettingsGroup/SettingsGroup.xaml" /> <ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/SettingsGroup/SettingsGroup.xaml" />
<ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/IsEnabledTextBlock/IsEnabledTextBlock.xaml" /> <ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/IsEnabledTextBlock.xaml" />
<ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/FlyoutMenuButton/FlyoutMenuButton.xaml" /> <ResourceDictionary Source="ms-appx:///SettingsXAML/Controls/FlyoutMenuButton.xaml" />
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -10,13 +10,6 @@
xmlns:ui="using:CommunityToolkit.WinUI" xmlns:ui="using:CommunityToolkit.WinUI"
AutomationProperties.LandmarkType="Main" AutomationProperties.LandmarkType="Main"
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources>
<tkconverters:BoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
<tkconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</Page.Resources>
<controls:SettingsPageControl x:Uid="CmdNotFound" ModuleImageSource="ms-appx:///Assets/Settings/Modules/CmdNotFound.png"> <controls:SettingsPageControl x:Uid="CmdNotFound" ModuleImageSource="ms-appx:///Assets/Settings/Modules/CmdNotFound.png">
<controls:SettingsPageControl.ModuleContent> <controls:SettingsPageControl.ModuleContent>
<StackPanel ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical"> <StackPanel ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical">

View File

@@ -14,14 +14,8 @@
d:DataContext="{d:DesignInstance Type=viewModels:ColorPickerViewModel}" d:DataContext="{d:DesignInstance Type=viewModels:ColorPickerViewModel}"
AutomationProperties.LandmarkType="Main" AutomationProperties.LandmarkType="Main"
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources>
<tkconverters:BoolToVisibilityConverter x:Key="BoolToVis" />
</Page.Resources>
<controls:SettingsPageControl x:Uid="ColorPicker" ModuleImageSource="ms-appx:///Assets/Settings/Modules/ColorPicker.png"> <controls:SettingsPageControl x:Uid="ColorPicker" ModuleImageSource="ms-appx:///Assets/Settings/Modules/ColorPicker.png">
<controls:SettingsPageControl.ModuleContent> <controls:SettingsPageControl.ModuleContent>
<StackPanel <StackPanel
x:Name="ColorPickerView" x:Name="ColorPickerView"
ChildrenTransitions="{StaticResource SettingsCardsAnimations}" ChildrenTransitions="{StaticResource SettingsCardsAnimations}"

View File

@@ -9,177 +9,30 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:tkcontrols="using:CommunityToolkit.WinUI.Controls" xmlns:tkcontrols="using:CommunityToolkit.WinUI.Controls"
xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters" xmlns:tkconverters="using:CommunityToolkit.WinUI.Converters"
xmlns:viewModels="using:Microsoft.PowerToys.Settings.UI.ViewModels" xmlns:viewmodels="using:Microsoft.PowerToys.Settings.UI.ViewModels"
AutomationProperties.LandmarkType="Main" AutomationProperties.LandmarkType="Main"
DataContext="DashboardViewModel" DataContext="DashboardViewModel"
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources> <Page.Resources>
<DataTemplate x:Key="KeyVisualTemplate">
<controls:KeyVisual
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
Content="{Binding}"
IsTabStop="False"
VisualType="TextOnly" />
</DataTemplate>
<DataTemplate x:Key="CommaTemplate">
<StackPanel Background="{ThemeResource SystemFillColorSolidAttentionBackground}">
<TextBlock
Margin="4,0"
VerticalAlignment="Bottom"
Text="," />
</StackPanel>
</DataTemplate>
<converters:KeyVisualTemplateSelector
x:Key="KeyVisualTemplateSelector"
CommaTemplate="{StaticResource CommaTemplate}"
KeyVisualTemplate="{StaticResource KeyVisualTemplate}" />
<converters:ModuleItemTemplateSelector <converters:ModuleItemTemplateSelector
x:Key="ModuleItemTemplateSelector" x:Key="ModuleItemTemplateSelector"
ButtonTemplate="{StaticResource ModuleItemButtonTemplate}" ActivationTemplate="{StaticResource ModuleItemActivationTemplate}"
KBMTemplate="{StaticResource ModuleItemKBMTemplate}" ShortcutTemplate="{StaticResource ModuleItemShortcutTemplate}" />
ShortcutTemplate="{StaticResource ModuleItemShortcutTemplate}" <DataTemplate x:Key="ModuleItemShortcutTemplate" x:DataType="viewmodels:DashboardModuleShortcutItem">
TextTemplate="{StaticResource ModuleItemTextTemplate}" /> <Grid MinHeight="36" ColumnSpacing="12">
<tkconverters:CollectionVisibilityConverter x:Key="CollectionVisibilityConverter" />
<Style x:Name="KeysListViewContainerStyle" TargetType="ListViewItem">
<Setter Property="IsTabStop" Value="False" />
</Style>
<converters:UpdateStateToBoolConverter x:Key="UpdateStateToBoolConverter" />
<tkconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<tkconverters:BoolNegationConverter x:Key="BoolNegationConverter" />
<tkconverters:BoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
<DataTemplate x:Key="OriginalKeyTemplate" x:DataType="x:String">
<controls:KeyVisual Content="{Binding}" VisualType="SmallOutline" />
</DataTemplate>
<DataTemplate x:Key="RemappedKeyTemplate" x:DataType="x:String">
<controls:KeyVisual Content="{Binding}" VisualType="Small" />
</DataTemplate>
<DataTemplate x:Key="ModuleItemTextTemplate" x:DataType="viewModels:DashboardModuleTextItem">
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind Label, Mode=OneWay}"
TextWrapping="WrapWholeWords" />
</DataTemplate>
<DataTemplate x:Key="ModuleItemButtonTemplate" x:DataType="viewModels:DashboardModuleButtonItem">
<Button
HorizontalAlignment="Stretch"
Click="{x:Bind ButtonClickHandler, Mode=OneWay}"
Content="{x:Bind ButtonTitle}" />
</DataTemplate>
<DataTemplate x:Key="ModuleItemShortcutTemplate" x:DataType="viewModels:DashboardModuleShortcutItem">
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" MinWidth="140" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Border
Padding="8,4"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}">
<ItemsControl <ItemsControl
AutomationProperties.AccessibilityView="Raw"
IsTabStop="False"
ItemsSource="{x:Bind Shortcut, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:KeyVisual
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
Content="{Binding}"
IsTabStop="False"
VisualType="TextOnly" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<TextBlock
Grid.Column="1" Grid.Column="1"
VerticalAlignment="Center" HorizontalAlignment="Left"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind Label, Mode=OneWay}"
TextWrapping="WrapWholeWords" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="ModuleItemKBMTemplate" x:DataType="viewModels:DashboardModuleKBMItem">
<Button x:Uid="DashboardKBMShowMappingsButton" HorizontalAlignment="Stretch">
<Button.Flyout>
<Flyout
x:Name="DetailsFlyout"
Placement="Bottom"
ShouldConstrainToRootBounds="False">
<StackPanel Orientation="Vertical" Spacing="4">
<ItemsControl ItemsSource="{x:Bind RemapKeys, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="4" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="Lib:KeysDataModel">
<StackPanel Orientation="Horizontal">
<Border
Padding="8,4"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}">
<ItemsControl
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
IsTabStop="False" IsTabStop="False"
ItemsSource="{x:Bind GetMappedOriginalKeys()}"> ItemsSource="{x:Bind Shortcut, Mode=OneWay}">
<ItemsControl.ItemsPanel> <ItemsControl.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="12" /> <StackPanel Orientation="Horizontal" Spacing="4" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:KeyVisual
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
Content="{Binding}"
IsTabStop="False"
VisualType="TextOnly" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<controls:IsEnabledTextBlock
x:Uid="To"
Margin="8,0,8,0"
VerticalAlignment="Center"
Style="{StaticResource SecondaryIsEnabledTextBlockStyle}" />
<Border
Padding="8,4"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource AccentFillColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}">
<ItemsControl
AutomationProperties.AccessibilityView="Raw"
IsTabStop="False"
ItemsSource="{x:Bind GetMappedNewRemapKeys(15)}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="12" />
</ItemsPanelTemplate> </ItemsPanelTemplate>
</ItemsControl.ItemsPanel> </ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
@@ -189,317 +42,324 @@
AutomationProperties.AccessibilityView="Raw" AutomationProperties.AccessibilityView="Raw"
Content="{Binding}" Content="{Binding}"
FontSize="12" FontSize="12"
Foreground="{ThemeResource AccentFillColorDefaultBrush}" Foreground="{ThemeResource TextFillColorSecondaryBrush}"
IsTabStop="False" IsTabStop="False"
VisualType="TextOnly" /> RenderKeyAsGlyph="True" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
</Border>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{x:Bind RemapShortcuts, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="4" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="Lib:AppSpecificKeysDataModel">
<StackPanel Orientation="Horizontal">
<Border
Padding="8,0"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}">
<ItemsControl
AutomationProperties.AccessibilityView="Raw"
IsTabStop="False"
ItemTemplateSelector="{StaticResource KeyVisualTemplateSelector}"
ItemsSource="{x:Bind GetMappedOriginalKeysWithSplitChord()}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Border>
<controls:IsEnabledTextBlock
x:Uid="To"
Margin="8,0,8,0"
VerticalAlignment="Center"
Style="{StaticResource SecondaryIsEnabledTextBlockStyle}"
Visibility="{x:Bind Path=IsOpenUriOrIsRunProgram, Mode=OneWay, Converter={StaticResource BoolToInvertedVisibilityConverter}}" />
<controls:IsEnabledTextBlock
x:Uid="Starts"
Margin="8,0,8,0"
VerticalAlignment="Center"
Style="{StaticResource SecondaryIsEnabledTextBlockStyle}"
Visibility="{x:Bind Path=IsOpenUriOrIsRunProgram, Mode=OneWay}" />
<Border
Padding="8,4"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource AccentFillColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{StaticResource ControlCornerRadius}">
<ItemsControl
AutomationProperties.AccessibilityView="Raw"
IsTabStop="False"
ItemsSource="{x:Bind GetMappedNewRemapKeys(15)}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:KeyVisual
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
Content="{Binding}"
Foreground="{ThemeResource AccentFillColorDefaultBrush}"
IsTabStop="False"
VisualType="TextOnly" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<TextBlock <TextBlock
Margin="4,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Foreground="{ThemeResource AccentFillColorDefaultBrush}" Text="{x:Bind Label, Mode=OneWay}"
Text="{x:Bind TargetApp}" /> TextWrapping="WrapWholeWords" />
</StackPanel> </Grid>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> <DataTemplate x:Key="ModuleItemActivationTemplate" x:DataType="viewmodels:DashboardModuleActivationItem">
</ItemsControl> <Grid MinHeight="36" ColumnSpacing="12">
</StackPanel> <Grid.ColumnDefinitions>
</Flyout> <ColumnDefinition Width="*" />
</Button.Flyout> <ColumnDefinition Width="Auto" MinWidth="140" />
</Button> </Grid.ColumnDefinitions>
<TextBlock
VerticalAlignment="Center"
Text="{x:Bind Label, Mode=OneWay}"
TextWrapping="WrapWholeWords" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind Activation, Mode=OneWay}"
TextWrapping="WrapWholeWords" />
</Grid>
</DataTemplate> </DataTemplate>
</Page.Resources> </Page.Resources>
<Grid Margin="16,0,0,0" RowSpacing="24"> <Grid Margin="16,0,0,0" RowSpacing="12">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock <TextBlock
x:Uid="DashboardTitle" x:Uid="DashboardTitle"
MaxWidth="{StaticResource PageMaxWidth}"
Margin="1,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource TitleTextBlockStyle}" /> Style="{StaticResource TitleTextBlockStyle}" />
<InfoBar
x:Uid="UpdateAvailable"
Margin="0,0,16,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
CornerRadius="8"
IsClosable="False"
IsOpen="{x:Bind ViewModel.UpdateAvailable, Mode=OneWay}"
Severity="Informational">
<InfoBar.ActionButton>
<Button x:Uid="LearnMore" Click="SWVersionButtonClicked" />
</InfoBar.ActionButton>
</InfoBar>
<ScrollViewer x:Name="MainScrollViewer" Grid.Row="1">
<StackPanel Padding="0,0,16,16" Orientation="Vertical">
<TextBlock
x:Uid="EnabledModules"
Margin="0,0,0,12"
Style="{StaticResource SubtitleTextBlockStyle}" />
<ItemsRepeater x:Name="DashboardView" ItemsSource="{x:Bind ViewModel.ActiveModules, Mode=OneWay}">
<ItemsRepeater.Layout>
<tkcontrols:StaggeredLayout
ColumnSpacing="8"
DesiredColumnWidth="378"
RowSpacing="8" />
</ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="viewModels:DashboardListItem">
<Button
Padding="0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
AutomationProperties.Name="{x:Bind Label}"
Background="Transparent"
BorderThickness="0"
Click="DashboardListItemClick"
CornerRadius="{StaticResource OverlayCornerRadius}"
Tag="{x:Bind Tag, Mode=OneWay}">
<Grid <Grid
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" Grid.Row="1"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" MaxWidth="{StaticResource PageMaxWidth}"
BorderThickness="1" Padding="0,0,20,0"
CornerRadius="{StaticResource OverlayCornerRadius}" ColumnSpacing="16">
RowSpacing="0"> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition /> <RowDefinition Height="Auto" />
<RowDefinition /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid Margin="16,8,16,0" ColumnSpacing="12"> <Button
Padding="0,0,8,0"
AutomationProperties.Name="WhatsNewButton"
Click="WhatsNewButton_Click"
Style="{StaticResource SubtleButtonStyle}">
<Grid ColumnSpacing="16">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid CornerRadius="{StaticResource OverlayCornerRadius}">
<Image <Image
Grid.Column="0" Width="120"
Width="20" AutomationProperties.AccessibilityView="Raw"
Margin="0,0,0,0"> Source="ms-appx:///Assets/Settings/Modules/PT.png" />
<Image.Source> <Grid Background="{ThemeResource SmokeFillColorDefaultBrush}" />
<BitmapImage UriSource="{x:Bind Icon, Mode=OneWay}" /> </Grid>
</Image.Source>
</Image>
<StackPanel <StackPanel
Grid.Column="1" Grid.Column="1"
VerticalAlignment="Center" VerticalAlignment="Center"
Orientation="Horizontal"> Orientation="Vertical">
<TextBlock x:Uid="LearnWhatsNew" FontWeight="SemiBold" />
<TextBlock <TextBlock
VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}"
FontWeight="SemiBold" Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind Label, Mode=OneWay}" Text="{x:Bind ViewModel.PowerToysVersion, Mode=OneWay}" />
TextTrimming="CharacterEllipsis" />
<InfoBadge
Margin="4,0,0,0"
Style="{StaticResource NewInfoBadge}"
Visibility="{x:Bind IsNew, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" />
</StackPanel> </StackPanel>
<FontIcon
Grid.Column="2"
Width="20"
Margin="0,0,-12,0"
FontSize="16"
Glyph="&#xE72E;"
Visibility="{x:Bind IsLocked, Converter={StaticResource BoolToInvertedVisibilityConverter}, ConverterParameter=True, Mode=OneWay}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="GPO_SettingIsManaged_ToolTip" TextWrapping="WrapWholeWords" />
</ToolTipService.ToolTip>
</FontIcon>
<ToggleSwitch
x:Uid="Enable_Module"
Grid.Column="3"
Margin="0,-2,0,0"
HorizontalAlignment="Right"
AutomationProperties.HelpText="{x:Bind Label}"
IsEnabled="{x:Bind IsLocked, Converter={StaticResource BoolNegationConverter}, ConverterParameter=True, Mode=OneWay}"
IsOn="{x:Bind IsEnabled, Mode=TwoWay}"
OffContent=""
OnContent=""
Style="{StaticResource RightAlignedCompactToggleSwitchStyle}" />
</Grid> </Grid>
</Button>
<StackPanel
x:Name="TopButtonPanel"
Grid.Column="1"
Orientation="Horizontal"
Spacing="16">
<!--<controls:ShortcutConflictControl/>-->
<controls:CheckUpdateControl />
</StackPanel>
</Grid>
<ScrollViewer x:Name="MainScrollViewer" Grid.Row="2">
<Grid>
<!-- This grid is required to ensure that the content is horizontally aligned -->
<Grid
MaxWidth="{StaticResource PageMaxWidth}"
Padding="0,0,20,48"
ColumnSpacing="16"
RowSpacing="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<controls:Card x:Uid="QuickAccessTitle" VerticalAlignment="Top">
<Grid>
<ItemsControl <ItemsControl
Grid.Row="1" x:Name="QuickAccessItemsControl"
Margin="16,8,16,16" Margin="8,0,12,12"
IsTabStop="False" ItemsSource="{x:Bind ViewModel.ActionModules, Mode=OneWay}"
ItemTemplateSelector="{StaticResource ModuleItemTemplateSelector}" Visibility="{x:Bind ViewModel.ActionModules.Count, Mode=OneWay, Converter={StaticResource DoubleToVisibilityConverter}}">
ItemsSource="{x:Bind DashboardModuleItems, Mode=OneWay}"
Visibility="{x:Bind IsEnabled, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
<ItemsControl.ItemsPanel> <ItemsControl.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<StackPanel Spacing="4" /> <tkcontrols:WrapPanel
Padding="12"
HorizontalSpacing="16"
VerticalSpacing="24" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewmodels:DashboardListItem">
<ItemsControl IsTabStop="False" ItemsSource="{x:Bind DashboardModuleItems, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewmodels:DashboardModuleButtonItem">
<controls:FlyoutMenuButton AutomationProperties.Name="{x:Bind ButtonTitle}" Click="{x:Bind ButtonClickHandler}">
<controls:FlyoutMenuButton.Content>
<TextBlock
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind ButtonTitle}"
TextAlignment="Center"
TextWrapping="Wrap" />
</controls:FlyoutMenuButton.Content>
<controls:FlyoutMenuButton.Icon>
<Image Width="24">
<Image.Source>
<BitmapImage UriSource="{x:Bind ButtonGlyph}" />
</Image.Source>
</Image>
</controls:FlyoutMenuButton.Icon>
<ToolTipService.ToolTip>
<ToolTip Content="{x:Bind ButtonDescription}" />
</ToolTipService.ToolTip>
</controls:FlyoutMenuButton>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock
x:Uid="NoActionsToShow"
Margin="12"
HorizontalAlignment="Left"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Visibility="{x:Bind ViewModel.ActionModules.Count, Mode=OneWay, Converter={StaticResource DoubleToInvertedVisibilityConverter}}" />
</Grid>
</controls:Card>
<controls:Card
x:Uid="ShortcutsOverview"
Grid.Row="1"
VerticalAlignment="Top">
<Grid>
<ItemsRepeater
Grid.Row="2"
Margin="8,0,0,0"
ItemsSource="{x:Bind ViewModel.ShortcutModules, Mode=OneWay}">
<ItemsRepeater.Layout>
<StackLayout Orientation="Vertical" Spacing="0" />
</ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="viewmodels:DashboardListItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image
Width="16"
Margin="0,10,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
AutomationProperties.AccessibilityView="Raw"
Source="{x:Bind Icon, Mode=OneWay}"
ToolTipService.ToolTip="{x:Bind Label}" />
<ItemsControl
Grid.Column="1"
IsTabStop="False"
ItemTemplateSelector="{StaticResource ModuleItemTemplateSelector}"
ItemsSource="{x:Bind DashboardModuleItems, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="0" />
</ItemsPanelTemplate> </ItemsPanelTemplate>
</ItemsControl.ItemsPanel> </ItemsControl.ItemsPanel>
</ItemsControl> </ItemsControl>
</Grid> </Grid>
</Button>
</DataTemplate> </DataTemplate>
</ItemsRepeater.ItemTemplate> </ItemsRepeater.ItemTemplate>
</ItemsRepeater> </ItemsRepeater>
<TextBlock <TextBlock
x:Uid="DisabledModules" x:Uid="NoShortcutsToShow"
Margin="0,24,0,12" Margin="12"
Style="{StaticResource SubtitleTextBlockStyle}" /> HorizontalAlignment="Left"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
<ItemsRepeater ItemsSource="{x:Bind ViewModel.DisabledModules, Mode=OneWay}"> Visibility="{x:Bind ViewModel.ShortcutModules.Count, Mode=OneWay, Converter={StaticResource DoubleToInvertedVisibilityConverter}}" />
</Grid>
</controls:Card>
<controls:Card
x:Name="ModulesCard"
Title="Modules"
Grid.RowSpan="2"
Grid.Column="1"
MinWidth="400"
Padding="0"
VerticalAlignment="Top"
DividerVisibility="Collapsed">
<ItemsRepeater
x:Name="DashboardView"
Grid.Row="2"
ItemsSource="{x:Bind ViewModel.AllModules, Mode=OneWay}">
<ItemsRepeater.Layout> <ItemsRepeater.Layout>
<tkcontrols:StaggeredLayout <StackLayout Orientation="Vertical" Spacing="0" />
ColumnSpacing="8"
DesiredColumnWidth="378"
RowSpacing="8" />
</ItemsRepeater.Layout> </ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate> <ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="viewModels:DashboardListItem"> <DataTemplate x:DataType="viewmodels:DashboardListItem">
<Button <tkcontrols:SettingsCard
Padding="0" MinHeight="0"
HorizontalAlignment="Stretch" Padding="12,4,12,4"
HorizontalContentAlignment="Stretch"
AutomationProperties.Name="{x:Bind Label}" AutomationProperties.Name="{x:Bind Label}"
Background="Transparent" Background="Transparent"
BorderThickness="0" BorderBrush="{ThemeResource DividerStrokeColorDefaultBrush}"
BorderThickness="0,1,0,0"
Click="DashboardListItemClick" Click="DashboardListItemClick"
CornerRadius="{StaticResource OverlayCornerRadius}" CornerRadius="0"
Tag="{x:Bind Tag, Mode=OneWay}"> IsClickEnabled="True"
<Grid Tag="{x:Bind Tag}">
Padding="16,12" <tkcontrols:SettingsCard.Resources>
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}" <x:Double x:Key="SettingsCardWrapThreshold">0</x:Double>
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" <x:Double x:Key="SettingsCardHeaderIconMaxSize">16</x:Double>
BorderThickness="1" </tkcontrols:SettingsCard.Resources>
CornerRadius="{StaticResource OverlayCornerRadius}" <tkcontrols:SettingsCard.Header>
RowSpacing="12"> <StackPanel Orientation="Horizontal">
<Grid ColumnSpacing="12"> <TextBlock Text="{x:Bind Label}" />
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Width="20">
<Image.Source>
<BitmapImage UriSource="{x:Bind Icon, Mode=OneWay}" />
</Image.Source>
</Image>
<StackPanel
Grid.Column="1"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
FontWeight="SemiBold"
Text="{x:Bind Label, Mode=OneWay}"
TextTrimming="CharacterEllipsis" />
<InfoBadge <InfoBadge
Margin="4,0,0,0" Margin="4,0,0,0"
Style="{StaticResource NewInfoBadge}" Style="{StaticResource NewInfoBadge}"
Visibility="{x:Bind IsNew, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" /> Visibility="{x:Bind IsNew, Converter={StaticResource BoolToVisibilityConverter}}" />
</StackPanel>
<FontIcon <FontIcon
Grid.Column="2" Grid.Column="2"
Width="20" Width="20"
Margin="0,0,-12,0" Margin="0,0,-12,0"
FontSize="16" FontSize="16"
Glyph="&#xE72E;" Glyph="&#xE72E;"
Visibility="{x:Bind IsLocked, Converter={StaticResource BoolToInvertedVisibilityConverter}, ConverterParameter=True, Mode=OneWay}"> Visibility="{x:Bind IsLocked, Converter={StaticResource ReverseBoolToVisibilityConverter}, ConverterParameter=True}">
<ToolTipService.ToolTip> <ToolTipService.ToolTip>
<TextBlock x:Uid="GPO_SettingIsManaged_ToolTip" TextWrapping="WrapWholeWords" /> <TextBlock x:Uid="GPO_SettingIsManaged_ToolTip" TextWrapping="WrapWholeWords" />
</ToolTipService.ToolTip> </ToolTipService.ToolTip>
</FontIcon> </FontIcon>
</StackPanel>
</tkcontrols:SettingsCard.Header>
<tkcontrols:SettingsCard.HeaderIcon>
<ImageIcon>
<ImageIcon.Source>
<BitmapImage UriSource="{x:Bind Icon}" />
</ImageIcon.Source>
</ImageIcon>
</tkcontrols:SettingsCard.HeaderIcon>
<ToggleSwitch <ToggleSwitch
x:Uid="Enable_Module" AutomationProperties.Name="{x:Bind Label}"
Grid.Column="3"
Margin="0,-2,0,0"
HorizontalAlignment="Right"
AutomationProperties.HelpText="{x:Bind Label}"
IsEnabled="{x:Bind IsLocked, Converter={StaticResource BoolNegationConverter}, ConverterParameter=True, Mode=OneWay}" IsEnabled="{x:Bind IsLocked, Converter={StaticResource BoolNegationConverter}, ConverterParameter=True, Mode=OneWay}"
IsOn="{x:Bind IsEnabled, Mode=TwoWay}" IsOn="{x:Bind IsEnabled, Mode=TwoWay}"
OffContent="" OffContent=""
OnContent="" OnContent="" />
Style="{StaticResource RightAlignedCompactToggleSwitchStyle}" /> </tkcontrols:SettingsCard>
</Grid>
</Grid>
</Button>
</DataTemplate> </DataTemplate>
</ItemsRepeater.ItemTemplate> </ItemsRepeater.ItemTemplate>
</ItemsRepeater> </ItemsRepeater>
</StackPanel> </controls:Card>
</Grid>
</Grid>
</ScrollViewer> </ScrollViewer>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="840" />
</VisualState.StateTriggers>
</VisualState>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="TopButtonPanel.(Grid.Row)" Value="1" />
<Setter Target="TopButtonPanel.Margin" Value="0,16,0,0" />
<Setter Target="TopButtonPanel.(Grid.Column)" Value="0" />
<Setter Target="ModulesCard.(Grid.Column)" Value="0" />
<Setter Target="ModulesCard.(Grid.Row)" Value="2" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid> </Grid>
</Page> </Page>

View File

@@ -5,10 +5,10 @@
using System; using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using ManagedCommon; using ManagedCommon;
using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.OOBE.Enums;
using Microsoft.PowerToys.Settings.UI.OOBE.Views; using Microsoft.PowerToys.Settings.UI.OOBE.Views;
using Microsoft.PowerToys.Settings.UI.ViewModels; using Microsoft.PowerToys.Settings.UI.ViewModels;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
@@ -46,14 +46,23 @@ namespace Microsoft.PowerToys.Settings.UI.Views
ViewModel.ModuleEnabledChangedOnSettingsPage(); ViewModel.ModuleEnabledChangedOnSettingsPage();
} }
private void SWVersionButtonClicked(object sender, RoutedEventArgs e)
{
ViewModel.SWVersionButtonClicked();
}
private void DashboardListItemClick(object sender, RoutedEventArgs e) private void DashboardListItemClick(object sender, RoutedEventArgs e)
{ {
ViewModel.DashboardListItemClick(sender); ViewModel.DashboardListItemClick(sender);
} }
private void WhatsNewButton_Click(object sender, RoutedEventArgs e)
{
if (App.GetOobeWindow() == null)
{
App.SetOobeWindow(new OobeWindow(PowerToysModules.WhatsNew));
}
else
{
App.GetOobeWindow().SetAppWindow(PowerToysModules.WhatsNew);
}
App.GetOobeWindow().Activate();
}
} }
} }

View File

@@ -12,7 +12,6 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources> <Page.Resources>
<converters:UpdateStateToBoolConverter x:Key="UpdateStateToBoolConverter" />
<converters:StringToInfoBarSeverityConverter x:Key="StringToInfoBarSeverityConverter" /> <converters:StringToInfoBarSeverityConverter x:Key="StringToInfoBarSeverityConverter" />
</Page.Resources> </Page.Resources>

View File

@@ -14,22 +14,23 @@
<Page.Resources> <Page.Resources>
<tkconverters:CollectionVisibilityConverter x:Key="CollectionVisibilityConverter" /> <tkconverters:CollectionVisibilityConverter x:Key="CollectionVisibilityConverter" />
<tkconverters:BoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
<tkconverters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<Style x:Name="KeysListViewContainerStyle" TargetType="ListViewItem"> <Style x:Name="KeysListViewContainerStyle" TargetType="ListViewItem">
<Setter Property="IsTabStop" Value="False" /> <Setter Property="IsTabStop" Value="False" />
</Style> </Style>
<DataTemplate x:Key="OriginalKeyTemplate" x:DataType="x:String"> <DataTemplate x:Key="OriginalKeyTemplate" x:DataType="x:String">
<controls:KeyVisual Content="{Binding}" VisualType="SmallOutline" /> <controls:KeyVisual
Padding="8"
Content="{Binding}"
CornerRadius="{StaticResource ControlCornerRadius}" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="RemappedKeyTemplate" x:DataType="x:String"> <DataTemplate x:Key="RemappedKeyTemplate" x:DataType="x:String">
<controls:KeyVisual Content="{Binding}" VisualType="Small" /> <controls:KeyVisual
Padding="8"
Content="{Binding}"
CornerRadius="{StaticResource ControlCornerRadius}"
Style="{StaticResource AccentKeyVisualStyle}" />
</DataTemplate> </DataTemplate>
<!--<DataTemplate x:Name="KeysListViewTemplate" x:DataType="Lib:KeysDataModel"> <!--<DataTemplate x:Name="KeysListViewTemplate" x:DataType="Lib:KeysDataModel">
@@ -184,7 +185,7 @@
Margin="8,0,8,0" Margin="8,0,8,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Style="{StaticResource SecondaryIsEnabledTextBlockStyle}" Style="{StaticResource SecondaryIsEnabledTextBlockStyle}"
Visibility="{x:Bind Path=IsOpenUriOrIsRunProgram, Mode=OneWay, Converter={StaticResource BoolToInvertedVisibilityConverter}}" /> Visibility="{x:Bind Path=IsOpenUriOrIsRunProgram, Mode=OneWay, Converter={StaticResource ReverseBoolToVisibilityConverter}}" />
<controls:IsEnabledTextBlock <controls:IsEnabledTextBlock
x:Uid="Starts" x:Uid="Starts"

View File

@@ -14,10 +14,6 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources> <Page.Resources>
<converters:IndexBitFieldToVisibilityConverter x:Key="IndexBitFieldToVisibilityConverter" /> <converters:IndexBitFieldToVisibilityConverter x:Key="IndexBitFieldToVisibilityConverter" />
<tkconverters:BoolToVisibilityConverter
x:Key="BoolToInvertedVisibilityConverter"
FalseValue="Visible"
TrueValue="Collapsed" />
</Page.Resources> </Page.Resources>
<controls:SettingsPageControl x:Uid="MouseUtils" ModuleImageSource="ms-appx:///Assets/Settings/Modules/MouseUtils.png"> <controls:SettingsPageControl x:Uid="MouseUtils" ModuleImageSource="ms-appx:///Assets/Settings/Modules/MouseUtils.png">
<controls:SettingsPageControl.ModuleContent> <controls:SettingsPageControl.ModuleContent>
@@ -153,7 +149,7 @@
IsClosable="False" IsClosable="False"
IsOpen="True" IsOpen="True"
Severity="Informational" Severity="Informational"
Visibility="{x:Bind ViewModel.IsAnimationEnabledBySystem, Mode=OneWay, Converter={StaticResource BoolToInvertedVisibilityConverter}}"> Visibility="{x:Bind ViewModel.IsAnimationEnabledBySystem, Mode=OneWay, Converter={StaticResource BoolToReverseVisibilityConverter}}">
<InfoBar.ActionButton> <InfoBar.ActionButton>
<HyperlinkButton x:Uid="OpenSettings" Click="OpenAnimationsSettings_Click" /> <HyperlinkButton x:Uid="OpenSettings" Click="OpenAnimationsSettings_Click" />
</InfoBar.ActionButton> </InfoBar.ActionButton>

View File

@@ -11,7 +11,6 @@
AutomationProperties.LandmarkType="Main" AutomationProperties.LandmarkType="Main"
mc:Ignorable="d"> mc:Ignorable="d">
<Page.Resources> <Page.Resources>
<converters:BoolToVisibilityConverter x:Key="negativeBoolToVisibilityConverter" />
<converters:BoolToObjectConverter <converters:BoolToObjectConverter
x:Key="OneRowMatrixBoolToNumberOfRowsConverter" x:Key="OneRowMatrixBoolToNumberOfRowsConverter"
FalseValue="2" FalseValue="2"
@@ -75,7 +74,7 @@
x:Uid="MouseWithoutBorders_Connect" x:Uid="MouseWithoutBorders_Connect"
Command="{x:Bind ShowConnectFieldsCommand, Mode=OneTime}" Command="{x:Bind ShowConnectFieldsCommand, Mode=OneTime}"
Style="{StaticResource AccentButtonStyle}" Style="{StaticResource AccentButtonStyle}"
Visibility="{x:Bind Path=ViewModel.ConnectFieldsVisible, Mode=OneWay, Converter={StaticResource negativeBoolToVisibilityConverter}, ConverterParameter=True}" /> Visibility="{x:Bind Path=ViewModel.ConnectFieldsVisible, Mode=OneWay, Converter={StaticResource ReverseBoolToVisibilityConverter}, ConverterParameter=True}" />
</StackPanel> </StackPanel>
</tkcontrols:SettingsExpander> </tkcontrols:SettingsExpander>

View File

@@ -796,7 +796,7 @@
<value>Information Symbol</value> <value>Information Symbol</value>
</data> </data>
<data name="FancyZones_LaunchEditorButtonControl.Header" xml:space="preserve"> <data name="FancyZones_LaunchEditorButtonControl.Header" xml:space="preserve">
<value>Launch layout editor</value> <value>Open layout editor</value>
<comment>launches the FancyZones layout editor application</comment> <comment>launches the FancyZones layout editor application</comment>
</data> </data>
<data name="FancyZones_LaunchEditorButtonControl.Description" xml:space="preserve"> <data name="FancyZones_LaunchEditorButtonControl.Description" xml:space="preserve">
@@ -824,8 +824,11 @@
<data name="FancyZones_ShiftDragCheckBoxControl_Header.Content" xml:space="preserve"> <data name="FancyZones_ShiftDragCheckBoxControl_Header.Content" xml:space="preserve">
<value>Hold Shift key to activate zones while dragging a window</value> <value>Hold Shift key to activate zones while dragging a window</value>
</data> </data>
<data name="FancyZones_ActivationShiftDrag" xml:space="preserve">
<value>Hold Shift key</value>
</data>
<data name="FancyZones_ActivationNoShiftDrag" xml:space="preserve"> <data name="FancyZones_ActivationNoShiftDrag" xml:space="preserve">
<value>Drag windows to activate zones</value> <value>Drag a window</value>
</data> </data>
<data name="FancyZones_ShowZonesOnAllMonitorsCheckBoxControl.Content" xml:space="preserve"> <data name="FancyZones_ShowZonesOnAllMonitorsCheckBoxControl.Content" xml:space="preserve">
<value>Show zones on all monitors while dragging a window</value> <value>Show zones on all monitors while dragging a window</value>
@@ -1986,7 +1989,7 @@ Made with 💗 by Microsoft and the PowerToys community.</value>
<value>Launch</value> <value>Launch</value>
</data> </data>
<data name="Launch_ColorPicker.Content" xml:space="preserve"> <data name="Launch_ColorPicker.Content" xml:space="preserve">
<value>Launch Color Picker</value> <value>Open Color Picker</value>
</data> </data>
<data name="Oobe_LearnMore.Text" xml:space="preserve"> <data name="Oobe_LearnMore.Text" xml:space="preserve">
<value>Learn more about</value> <value>Learn more about</value>
@@ -2133,7 +2136,7 @@ From there, simply click on one of the supported files in the File Explorer and
<value>Want a custom size? You can add them in the PowerToys Settings!</value> <value>Want a custom size? You can add them in the PowerToys Settings!</value>
</data> </data>
<data name="Oobe_KBM_HowToCreateMappings.Text" xml:space="preserve"> <data name="Oobe_KBM_HowToCreateMappings.Text" xml:space="preserve">
<value>Launch **PowerToys Settings**, navigate to the Keyboard Manager menu, and select either **Remap a key** or **Remap a shortcut**.</value> <value>Open **PowerToys Settings**, navigate to the Keyboard Manager menu, and select either **Remap a key** or **Remap a shortcut**.</value>
</data> </data>
<data name="Oobe_KBM_TipsAndTricks.Text" xml:space="preserve"> <data name="Oobe_KBM_TipsAndTricks.Text" xml:space="preserve">
<value>Want to only have a shortcut work for a single application? Use the Target App field when creating the shortcut remapping.</value> <value>Want to only have a shortcut work for a single application? Use the Target App field when creating the shortcut remapping.</value>
@@ -2550,10 +2553,10 @@ From there, simply click on one of the supported files in the File Explorer and
<comment>Mouse as in the hardware peripheral.</comment> <comment>Mouse as in the hardware peripheral.</comment>
</data> </data>
<data name="Launch_Run.Content" xml:space="preserve"> <data name="Launch_Run.Content" xml:space="preserve">
<value>Launch PowerToys Run</value> <value>Open PowerToys Run</value>
</data> </data>
<data name="Launch_ShortcutGuide.Content" xml:space="preserve"> <data name="Launch_ShortcutGuide.Content" xml:space="preserve">
<value>Launch Shortcut Guide</value> <value>Open Shortcut Guide</value>
</data> </data>
<data name="ColorPicker_ColorFormat_ToggleSwitch.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve"> <data name="ColorPicker_ColorFormat_ToggleSwitch.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Show format in editor</value> <value>Show format in editor</value>
@@ -2848,6 +2851,9 @@ Right-click to remove the key combination, thereby deactivating the shortcut.</v
<data name="FancyZones_Zone_Appearance.Header" xml:space="preserve"> <data name="FancyZones_Zone_Appearance.Header" xml:space="preserve">
<value>Zone appearance</value> <value>Zone appearance</value>
</data> </data>
<data name="LearnMore.Text" xml:space="preserve">
<value>Learn more</value>
</data>
<data name="FileExplorerPreview_ToggleSwitch_Thumbnail_GCODE.Header" xml:space="preserve"> <data name="FileExplorerPreview_ToggleSwitch_Thumbnail_GCODE.Header" xml:space="preserve">
<value>Geometric Code</value> <value>Geometric Code</value>
<comment>File type, do not translate</comment> <comment>File type, do not translate</comment>
@@ -3134,7 +3140,7 @@ Right-click to remove the key combination, thereby deactivating the shortcut.</v
<value>Create and manage Workspaces</value> <value>Create and manage Workspaces</value>
</data> </data>
<data name="Workspaces_LaunchEditorButtonControl.Header" xml:space="preserve"> <data name="Workspaces_LaunchEditorButtonControl.Header" xml:space="preserve">
<value>Launch editor</value> <value>Open editor</value>
</data> </data>
<data name="LearnMore_Workspaces.Text" xml:space="preserve"> <data name="LearnMore_Workspaces.Text" xml:space="preserve">
<value>Learn more about the Workspaces utility</value> <value>Learn more about the Workspaces utility</value>
@@ -3159,10 +3165,10 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Pick a color</value> <value>Pick a color</value>
</data> </data>
<data name="CropAndLock_Thumbnail" xml:space="preserve"> <data name="CropAndLock_Thumbnail" xml:space="preserve">
<value>Thumbnail</value> <value>Crop and create a thumbnail</value>
</data> </data>
<data name="CropAndLock_Reparent" xml:space="preserve"> <data name="CropAndLock_Reparent" xml:space="preserve">
<value>Reparent</value> <value>Crop an app's window into a cropped window</value>
</data> </data>
<data name="FancyZones_OpenEditor" xml:space="preserve"> <data name="FancyZones_OpenEditor" xml:space="preserve">
<value>Open editor</value> <value>Open editor</value>
@@ -3174,7 +3180,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Find the mouse</value> <value>Find the mouse</value>
</data> </data>
<data name="MouseHighlighter_ShortDescription" xml:space="preserve"> <data name="MouseHighlighter_ShortDescription" xml:space="preserve">
<value>Highlight clicks</value> <value>Turn on clicks highlighter</value>
</data> </data>
<data name="MouseJump_ShortDescription" xml:space="preserve"> <data name="MouseJump_ShortDescription" xml:space="preserve">
<value>Quickly move the mouse pointer</value> <value>Quickly move the mouse pointer</value>
@@ -3192,10 +3198,10 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Learn more</value> <value>Learn more</value>
</data> </data>
<data name="Peek_ShortDescription" xml:space="preserve"> <data name="Peek_ShortDescription" xml:space="preserve">
<value>Quick and easy previewer</value> <value>Preview file</value>
</data> </data>
<data name="Run_ShortDescription" xml:space="preserve"> <data name="Run_ShortDescription" xml:space="preserve">
<value>A quick launcher</value> <value>Open Run</value>
</data> </data>
<data name="PowerAccent_ShortDescription" xml:space="preserve"> <data name="PowerAccent_ShortDescription" xml:space="preserve">
<value>An alternative way to type accented characters</value> <value>An alternative way to type accented characters</value>
@@ -3205,18 +3211,21 @@ Activate by holding the key for the character you want to add an accent to, then
<comment>{Locked="Windows"}</comment> <comment>{Locked="Windows"}</comment>
</data> </data>
<data name="ScreenRuler_ShortDescription" xml:space="preserve"> <data name="ScreenRuler_ShortDescription" xml:space="preserve">
<value>Measure pixels on your screen</value> <value>Start measurement</value>
</data> </data>
<data name="ShortcutGuide_ShortDescription" xml:space="preserve"> <data name="ShortcutGuide_ShortDescription" xml:space="preserve">
<value>Show a help overlay with Windows shortcuts</value> <value>Open Shortcut Guide</value>
<comment>{Locked="Windows"}</comment> <comment>{Locked="Windows"}</comment>
</data> </data>
<data name="PowerOcr_ShortDescription" xml:space="preserve"> <data name="PowerOcr_ShortDescription" xml:space="preserve">
<value>A convenient way to copy text from anywhere on screen</value> <value>Start text extraction</value>
</data> </data>
<data name="Dashboard_Activation" xml:space="preserve"> <data name="Dashboard_Activation" xml:space="preserve">
<value>Activation</value> <value>Activation</value>
</data> </data>
<data name="Activate_Zones" xml:space="preserve">
<value>Activate zones</value>
</data>
<data name="DashboardKBMShowMappingsButton.Content" xml:space="preserve"> <data name="DashboardKBMShowMappingsButton.Content" xml:space="preserve">
<value>Show remappings</value> <value>Show remappings</value>
</data> </data>
@@ -3395,7 +3404,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Text Extractor</value> <value>Text Extractor</value>
</data> </data>
<data name="Launch_TextExtractor.Content" xml:space="preserve"> <data name="Launch_TextExtractor.Content" xml:space="preserve">
<value>Launch Text Extractor</value> <value>Open Text Extractor</value>
</data> </data>
<data name="Oobe_TextExtractor.Title" xml:space="preserve"> <data name="Oobe_TextExtractor.Title" xml:space="preserve">
<value>Text Extractor</value> <value>Text Extractor</value>
@@ -3620,11 +3629,11 @@ Activate by holding the key for the character you want to add an accent to, then
<comment>"Hosts" refers to the system hosts file, do not loc</comment> <comment>"Hosts" refers to the system hosts file, do not loc</comment>
</data> </data>
<data name="Hosts_LaunchButtonControl.Header" xml:space="preserve"> <data name="Hosts_LaunchButtonControl.Header" xml:space="preserve">
<value>Launch Hosts File Editor</value> <value>Open Hosts File Editor</value>
<comment>"Hosts File Editor" is a product name</comment> <comment>"Hosts File Editor" is a product name</comment>
</data> </data>
<data name="Hosts_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve"> <data name="Hosts_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Launch Hosts File Editor</value> <value>Open Hosts File Editor</value>
<comment>"Hosts File Editor" is a product name</comment> <comment>"Hosts File Editor" is a product name</comment>
</data> </data>
<data name="Hosts_AdditionalLinesPosition.Header" xml:space="preserve"> <data name="Hosts_AdditionalLinesPosition.Header" xml:space="preserve">
@@ -3640,7 +3649,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Behavior</value> <value>Behavior</value>
</data> </data>
<data name="Launch_Hosts.Content" xml:space="preserve"> <data name="Launch_Hosts.Content" xml:space="preserve">
<value>Launch Hosts File Editor</value> <value>Open Hosts File Editor</value>
<comment>"Hosts File Editor" is the name of the utility</comment> <comment>"Hosts File Editor" is the name of the utility</comment>
</data> </data>
<data name="LearnMore_Hosts.Text" xml:space="preserve"> <data name="LearnMore_Hosts.Text" xml:space="preserve">
@@ -3659,7 +3668,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Required in order to make changes to the hosts file</value> <value>Required in order to make changes to the hosts file</value>
</data> </data>
<data name="Hosts_Toggle_LaunchAdministrator.Header" xml:space="preserve"> <data name="Hosts_Toggle_LaunchAdministrator.Header" xml:space="preserve">
<value>Launch as administrator</value> <value>Open as administrator</value>
</data> </data>
<data name="EnvironmentVariables.ModuleDescription" xml:space="preserve"> <data name="EnvironmentVariables.ModuleDescription" xml:space="preserve">
<value>A quick utility for managing environment variables.</value> <value>A quick utility for managing environment variables.</value>
@@ -3680,13 +3689,13 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Manage your environment variables</value> <value>Manage your environment variables</value>
</data> </data>
<data name="EnvironmentVariables_LaunchButtonControl.Header" xml:space="preserve"> <data name="EnvironmentVariables_LaunchButtonControl.Header" xml:space="preserve">
<value>Launch Environment Variables</value> <value>Open Environment Variables</value>
</data> </data>
<data name="EnvironmentVariables_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve"> <data name="EnvironmentVariables_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Launch Environment Variables</value> <value>Open Environment Variables</value>
</data> </data>
<data name="Launch_EnvironmentVariables.Content" xml:space="preserve"> <data name="Launch_EnvironmentVariables.Content" xml:space="preserve">
<value>Launch Environment Variables</value> <value>Open Environment Variables</value>
</data> </data>
<data name="LearnMore_EnvironmentVariables.Text" xml:space="preserve"> <data name="LearnMore_EnvironmentVariables.Text" xml:space="preserve">
<value>Learn more about Environment Variables</value> <value>Learn more about Environment Variables</value>
@@ -3701,7 +3710,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Required in order to make changes to the system environment variables</value> <value>Required in order to make changes to the system environment variables</value>
</data> </data>
<data name="EnvironmentVariables_Toggle_LaunchAdministrator.Header" xml:space="preserve"> <data name="EnvironmentVariables_Toggle_LaunchAdministrator.Header" xml:space="preserve">
<value>Launch as administrator</value> <value>Open as administrator</value>
</data> </data>
<data name="ShortcutGuide_PressTimeForTaskbarIconShortcuts.Header" xml:space="preserve"> <data name="ShortcutGuide_PressTimeForTaskbarIconShortcuts.Header" xml:space="preserve">
<value>Press duration before showing taskbar icon shortcuts (ms)</value> <value>Press duration before showing taskbar icon shortcuts (ms)</value>
@@ -3955,6 +3964,9 @@ Activate by holding the key for the character you want to add an accent to, then
<data name="QuickAccessTxt.Text" xml:space="preserve"> <data name="QuickAccessTxt.Text" xml:space="preserve">
<value>Quick access</value> <value>Quick access</value>
</data> </data>
<data name="UpdateAvailable.Text" xml:space="preserve">
<value>Update available</value>
</data>
<data name="FileExplorerPreview_Toggle_Monaco_Max_File_Size.Header" xml:space="preserve"> <data name="FileExplorerPreview_Toggle_Monaco_Max_File_Size.Header" xml:space="preserve">
<value>Maximum file size to preview</value> <value>Maximum file size to preview</value>
<comment>Size refers to the disk space used by a file</comment> <comment>Size refers to the disk space used by a file</comment>
@@ -3997,7 +4009,7 @@ Activate by holding the key for the character you want to add an accent to, then
<comment>Registry Preview is a product name, do not loc</comment> <comment>Registry Preview is a product name, do not loc</comment>
</data> </data>
<data name="Launch_RegistryPreview.Content" xml:space="preserve"> <data name="Launch_RegistryPreview.Content" xml:space="preserve">
<value>Launch Registry Preview</value> <value>Open Registry Preview</value>
<comment>"Registry Preview" is the name of the utility</comment> <comment>"Registry Preview" is the name of the utility</comment>
</data> </data>
<data name="MouseUtils_MouseJump.Header" xml:space="preserve"> <data name="MouseUtils_MouseJump.Header" xml:space="preserve">
@@ -4145,13 +4157,13 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Consider loopback addresses as duplicates</value> <value>Consider loopback addresses as duplicates</value>
</data> </data>
<data name="RegistryPreview_Launch_GroupSettings.Header" xml:space="preserve"> <data name="RegistryPreview_Launch_GroupSettings.Header" xml:space="preserve">
<value>Launch</value> <value>Open</value>
</data> </data>
<data name="RegistryPreview_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve"> <data name="RegistryPreview_LaunchButton_Accessible.[using:Microsoft.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Launch Registry Preview</value> <value>Open Registry Preview</value>
</data> </data>
<data name="RegistryPreview_LaunchButtonControl.Header" xml:space="preserve"> <data name="RegistryPreview_LaunchButtonControl.Header" xml:space="preserve">
<value>Launch Registry Preview</value> <value>Open Registry Preview</value>
</data> </data>
<data name="RegistryPreview_DefaultRegApp.Header" xml:space="preserve"> <data name="RegistryPreview_DefaultRegApp.Header" xml:space="preserve">
<value>Make Registry Preview the default app for .reg files</value> <value>Make Registry Preview the default app for .reg files</value>
@@ -4227,10 +4239,10 @@ Activate by holding the key for the character you want to add an accent to, then
<comment>Title of the settings window when running as administrator</comment> <comment>Title of the settings window when running as administrator</comment>
</data> </data>
<data name="DashboardTitle.Text" xml:space="preserve"> <data name="DashboardTitle.Text" xml:space="preserve">
<value>Dashboard</value> <value>Home</value>
</data> </data>
<data name="Shell_Dashboard.Content" xml:space="preserve"> <data name="Shell_Dashboard.Content" xml:space="preserve">
<value>Dashboard</value> <value>Home</value>
</data> </data>
<data name="Peek_Preview_GroupSettings.Header" xml:space="preserve"> <data name="Peek_Preview_GroupSettings.Header" xml:space="preserve">
<value>Preview</value> <value>Preview</value>
@@ -4486,7 +4498,7 @@ Activate by holding the key for the character you want to add an accent to, then
<value>Workspaces</value> <value>Workspaces</value>
</data> </data>
<data name="Workspaces_ShortDescription" xml:space="preserve"> <data name="Workspaces_ShortDescription" xml:space="preserve">
<value>Create and launch Workspaces</value> <value>Open editor</value>
</data> </data>
<data name="Shell_ZoomIt.Content" xml:space="preserve"> <data name="Shell_ZoomIt.Content" xml:space="preserve">
<value>ZoomIt</value> <value>ZoomIt</value>
@@ -4913,6 +4925,9 @@ To record a specific window, enter the hotkey with the Alt key in the opposite m
<data name="CmdPal_ShortDescription" xml:space="preserve"> <data name="CmdPal_ShortDescription" xml:space="preserve">
<value>A better quick launcher</value> <value>A better quick launcher</value>
</data> </data>
<data name="CmdPal_ActivationDescription" xml:space="preserve">
<value>Open Command Palette</value>
</data>
<data name="CmdPal_Enable_CmdPal.Header" xml:space="preserve"> <data name="CmdPal_Enable_CmdPal.Header" xml:space="preserve">
<value>Enable Command Palette</value> <value>Enable Command Palette</value>
<comment>"Command Palette" is the name of the utility.</comment> <comment>"Command Palette" is the name of the utility.</comment>
@@ -5030,6 +5045,36 @@ To record a specific window, enter the hotkey with the Alt key in the opposite m
<data name="FileExplorerPreview_ToggleSwitch_Thumbnail_BGCODE.Header" xml:space="preserve"> <data name="FileExplorerPreview_ToggleSwitch_Thumbnail_BGCODE.Header" xml:space="preserve">
<value>Binary Geometric Code</value> <value>Binary Geometric Code</value>
</data> </data>
<data name="YoureUpToDate.Text" xml:space="preserve">
<value>You're up to date</value>
</data>
<data name="UpdateAvailableTextBlock.Text" xml:space="preserve">
<value>Update Available</value>
</data>
<data name="GeneralVersion.Text" xml:space="preserve">
<value>Version</value>
</data>
<data name="LearnWhatsNew.Text" xml:space="preserve">
<value>Learn what's new</value>
</data>
<data name="ConfigureShortcut" xml:space="preserve">
<value>Configure shortcut</value>
</data>
<data name="ConfigureShortcutText.Text" xml:space="preserve">
<value>Configure shortcut</value>
</data>
<data name="QuickAccessTitle.Title" xml:space="preserve">
<value>Quick access</value>
</data>
<data name="ShortcutsOverview.Title" xml:space="preserve">
<value>Shortcuts overview</value>
</data>
<data name="NoActionsToShow.Text" xml:space="preserve">
<value>No actions to show..</value>
</data>
<data name="NoShortcutsToShow.Text" xml:space="preserve">
<value>No shortcuts to show..</value>
</data>
<data name="HighlightMode.Description" xml:space="preserve"> <data name="HighlightMode.Description" xml:space="preserve">
<value>Highlight the cursor or dim the screen to spotlight it</value> <value>Highlight the cursor or dim the screen to spotlight it</value>
</data> </data>
@@ -5079,4 +5124,7 @@ To record a specific window, enter the hotkey with the Alt key in the opposite m
<data name="GeneralPage_EnableViewDiagnosticDataText.Text" xml:space="preserve"> <data name="GeneralPage_EnableViewDiagnosticDataText.Text" xml:space="preserve">
<value>Stores diagnostic data locally in .xml format; folder may include .etl files as well. May use up 1GB or more of disk space.</value> <value>Stores diagnostic data locally in .xml format; folder may include .etl files as well. May use up 1GB or more of disk space.</value>
</data> </data>
<data name="KeyBack" xml:space="preserve">
<value>Back key</value>
</data>
</root> </root>

View File

@@ -36,23 +36,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
public List<object> Shortcut { get; set; } public List<object> Shortcut { get; set; }
} }
public partial class DashboardModuleKBMItem : DashboardModuleItem public partial class DashboardModuleActivationItem : DashboardModuleItem
{ {
private List<KeysDataModel> _remapKeys = new List<KeysDataModel>(); public string Activation { get; set; }
public List<KeysDataModel> RemapKeys
{
get => _remapKeys;
set => _remapKeys = value;
}
private List<AppSpecificKeysDataModel> _remapShortcuts = new List<AppSpecificKeysDataModel>();
public List<AppSpecificKeysDataModel> RemapShortcuts
{
get => _remapShortcuts;
set => _remapShortcuts = value;
}
} }
public partial class DashboardModuleItem : INotifyPropertyChanged public partial class DashboardModuleItem : INotifyPropertyChanged

View File

@@ -8,13 +8,14 @@ using System.Collections.ObjectModel;
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Linq; using System.Linq;
using System.Windows.Threading; using System.Windows.Threading;
using CommunityToolkit.WinUI.Controls;
using global::PowerToys.GPOWrapper; using global::PowerToys.GPOWrapper;
using ManagedCommon; using ManagedCommon;
using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Helpers;
using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
using Microsoft.PowerToys.Settings.UI.Services; using Microsoft.PowerToys.Settings.UI.Services;
using Microsoft.PowerToys.Settings.UI.Views; using Microsoft.PowerToys.Settings.UI.Views;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
@@ -25,19 +26,23 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
public partial class DashboardViewModel : Observable public partial class DashboardViewModel : Observable
{ {
private const string JsonFileType = ".json"; private const string JsonFileType = ".json";
private IFileSystemWatcher _watcher;
private DashboardModuleKBMItem _kbmItem;
private Dispatcher dispatcher; private Dispatcher dispatcher;
public Func<string, int> SendConfigMSG { get; } public Func<string, int> SendConfigMSG { get; }
public ObservableCollection<DashboardListItem> ActiveModules { get; set; } = new ObservableCollection<DashboardListItem>(); public ObservableCollection<DashboardListItem> AllModules { get; set; } = new ObservableCollection<DashboardListItem>();
public ObservableCollection<DashboardListItem> DisabledModules { get; set; } = new ObservableCollection<DashboardListItem>(); public ObservableCollection<DashboardListItem> ShortcutModules { get; set; } = new ObservableCollection<DashboardListItem>();
public bool UpdateAvailable { get; set; } public ObservableCollection<DashboardListItem> ActionModules { get; set; } = new ObservableCollection<DashboardListItem>();
private List<DashboardListItem> _allModules; public string PowerToysVersion
{
get
{
return Helper.GetProductVersion();
}
}
private ISettingsRepository<GeneralSettings> _settingsRepository; private ISettingsRepository<GeneralSettings> _settingsRepository;
private GeneralSettings generalSettingsConfig; private GeneralSettings generalSettingsConfig;
@@ -53,24 +58,18 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
// set the callback functions value to handle outgoing IPC message. // set the callback functions value to handle outgoing IPC message.
SendConfigMSG = ipcMSGCallBackFunc; SendConfigMSG = ipcMSGCallBackFunc;
_allModules = new List<DashboardListItem>();
foreach (ModuleType moduleType in Enum.GetValues<ModuleType>()) foreach (ModuleType moduleType in Enum.GetValues<ModuleType>())
{ {
AddDashboardListItem(moduleType); AddDashboardListItem(moduleType);
} }
ActiveModules = new ObservableCollection<DashboardListItem>(_allModules.Where(x => x.IsEnabled)); GetShortcutModules();
DisabledModules = new ObservableCollection<DashboardListItem>(_allModules.Where(x => !x.IsEnabled));
UpdatingSettings updatingSettingsConfig = UpdatingSettings.LoadSettings();
UpdateAvailable = updatingSettingsConfig != null && (updatingSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToInstall || updatingSettingsConfig.State == UpdatingSettings.UpdatingState.ReadyToDownload);
} }
private void AddDashboardListItem(ModuleType moduleType) private void AddDashboardListItem(ModuleType moduleType)
{ {
GpoRuleConfigured gpo = ModuleHelper.GetModuleGpoConfiguration(moduleType); GpoRuleConfigured gpo = ModuleHelper.GetModuleGpoConfiguration(moduleType);
_allModules.Add(new DashboardListItem() AllModules.Add(new DashboardListItem()
{ {
Tag = moduleType, Tag = moduleType,
Label = resourceLoader.GetString(ModuleHelper.GetModuleLabelResourceName(moduleType)), Label = resourceLoader.GetString(ModuleHelper.GetModuleLabelResourceName(moduleType)),
@@ -80,47 +79,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
EnabledChangedCallback = EnabledChangedOnUI, EnabledChangedCallback = EnabledChangedOnUI,
DashboardModuleItems = GetModuleItems(moduleType), DashboardModuleItems = GetModuleItems(moduleType),
}); });
if (moduleType == ModuleType.KeyboardManager && gpo != GpoRuleConfigured.Disabled)
{
KeyboardManagerSettings kbmSettings = GetKBMSettings();
_watcher = Library.Utilities.Helper.GetFileWatcher(KeyboardManagerSettings.ModuleName, kbmSettings.Properties.ActiveConfiguration.Value + JsonFileType, () => LoadKBMSettingsFromJson());
}
}
private void LoadKBMSettingsFromJson()
{
try
{
KeyboardManagerProfile kbmProfile = GetKBMProfile();
_kbmItem.RemapKeys = kbmProfile?.RemapKeys.InProcessRemapKeys;
_kbmItem.RemapShortcuts = KeyboardManagerViewModel.CombineShortcutLists(kbmProfile?.RemapShortcuts.GlobalRemapShortcuts, kbmProfile?.RemapShortcuts.AppSpecificRemapShortcuts);
dispatcher.Invoke(new Action(() => UpdateKBMItems()));
}
catch (Exception ex)
{
Logger.LogError($"Failed to load KBM settings: {ex.Message}");
}
}
private void UpdateKBMItems()
{
_kbmItem.NotifyPropertyChanged(nameof(_kbmItem.RemapKeys));
_kbmItem.NotifyPropertyChanged(nameof(_kbmItem.RemapShortcuts));
}
private KeyboardManagerProfile GetKBMProfile()
{
KeyboardManagerSettings kbmSettings = GetKBMSettings();
const string PowerToyName = KeyboardManagerSettings.ModuleName;
string fileName = kbmSettings.Properties.ActiveConfiguration.Value + JsonFileType;
return new SettingsUtils().GetSettingsOrDefault<KeyboardManagerProfile>(PowerToyName, fileName);
}
private KeyboardManagerSettings GetKBMSettings()
{
var settingsUtils = new SettingsUtils();
ISettingsRepository<KeyboardManagerSettings> moduleSettingsRepository = SettingsRepository<KeyboardManagerSettings>.GetInstance(settingsUtils);
return moduleSettingsRepository.SettingsConfig;
} }
private void EnabledChangedOnUI(DashboardListItem dashboardListItem) private void EnabledChangedOnUI(DashboardListItem dashboardListItem)
@@ -139,25 +97,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{ {
try try
{ {
ActiveModules.Clear(); GetShortcutModules();
DisabledModules.Clear();
generalSettingsConfig = _settingsRepository.SettingsConfig; OnPropertyChanged(nameof(ShortcutModules));
foreach (DashboardListItem item in _allModules)
{
item.IsEnabled = ModuleHelper.GetIsModuleEnabled(generalSettingsConfig, item.Tag);
if (item.IsEnabled)
{
ActiveModules.Add(item);
}
else
{
DisabledModules.Add(item);
}
}
OnPropertyChanged(nameof(ActiveModules));
OnPropertyChanged(nameof(DisabledModules));
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -165,29 +107,71 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
} }
} }
private void GetShortcutModules()
{
ShortcutModules.Clear();
ActionModules.Clear();
foreach (var x in AllModules.Where(x => x.IsEnabled))
{
var filteredItems = x.DashboardModuleItems
.Where(m => m is DashboardModuleShortcutItem || m is DashboardModuleActivationItem)
.ToList();
if (filteredItems.Count != 0)
{
ShortcutModules.Add(new DashboardListItem
{
EnabledChangedCallback = x.EnabledChangedCallback,
Icon = x.Icon,
IsLocked = x.IsLocked,
Label = x.Label,
Tag = x.Tag,
IsEnabled = x.IsEnabled,
DashboardModuleItems = new ObservableCollection<DashboardModuleItem>(filteredItems),
});
}
}
foreach (var x in AllModules.Where(x => x.IsEnabled))
{
var filteredItems = x.DashboardModuleItems
.Where(m => m is DashboardModuleButtonItem)
.ToList();
if (filteredItems.Count != 0)
{
ActionModules.Add(new DashboardListItem
{
EnabledChangedCallback = x.EnabledChangedCallback,
Icon = x.Icon,
IsLocked = x.IsLocked,
Label = x.Label,
Tag = x.Tag,
IsEnabled = x.IsEnabled,
DashboardModuleItems = new ObservableCollection<DashboardModuleItem>(filteredItems),
});
}
}
}
private ObservableCollection<DashboardModuleItem> GetModuleItems(ModuleType moduleType) private ObservableCollection<DashboardModuleItem> GetModuleItems(ModuleType moduleType)
{ {
return moduleType switch return moduleType switch
{ {
ModuleType.AdvancedPaste => GetModuleItemsAdvancedPaste(), ModuleType.AdvancedPaste => GetModuleItemsAdvancedPaste(),
ModuleType.AlwaysOnTop => GetModuleItemsAlwaysOnTop(), ModuleType.AlwaysOnTop => GetModuleItemsAlwaysOnTop(),
ModuleType.Awake => GetModuleItemsAwake(),
ModuleType.CmdPal => GetModuleItemsCmdPal(), ModuleType.CmdPal => GetModuleItemsCmdPal(),
ModuleType.ColorPicker => GetModuleItemsColorPicker(), ModuleType.ColorPicker => GetModuleItemsColorPicker(),
ModuleType.CropAndLock => GetModuleItemsCropAndLock(), ModuleType.CropAndLock => GetModuleItemsCropAndLock(),
ModuleType.EnvironmentVariables => GetModuleItemsEnvironmentVariables(), ModuleType.EnvironmentVariables => GetModuleItemsEnvironmentVariables(),
ModuleType.FancyZones => GetModuleItemsFancyZones(), ModuleType.FancyZones => GetModuleItemsFancyZones(),
ModuleType.FileLocksmith => GetModuleItemsFileLocksmith(),
ModuleType.FindMyMouse => GetModuleItemsFindMyMouse(), ModuleType.FindMyMouse => GetModuleItemsFindMyMouse(),
ModuleType.Hosts => GetModuleItemsHosts(), ModuleType.Hosts => GetModuleItemsHosts(),
ModuleType.ImageResizer => GetModuleItemsImageResizer(),
ModuleType.KeyboardManager => GetModuleItemsKeyboardManager(),
ModuleType.MouseHighlighter => GetModuleItemsMouseHighlighter(), ModuleType.MouseHighlighter => GetModuleItemsMouseHighlighter(),
ModuleType.MouseJump => GetModuleItemsMouseJump(), ModuleType.MouseJump => GetModuleItemsMouseJump(),
ModuleType.MousePointerCrosshairs => GetModuleItemsMousePointerCrosshairs(), ModuleType.MousePointerCrosshairs => GetModuleItemsMousePointerCrosshairs(),
ModuleType.MouseWithoutBorders => GetModuleItemsMouseWithoutBorders(),
ModuleType.Peek => GetModuleItemsPeek(), ModuleType.Peek => GetModuleItemsPeek(),
ModuleType.PowerRename => GetModuleItemsPowerRename(),
ModuleType.PowerLauncher => GetModuleItemsPowerLauncher(), ModuleType.PowerLauncher => GetModuleItemsPowerLauncher(),
ModuleType.PowerAccent => GetModuleItemsPowerAccent(), ModuleType.PowerAccent => GetModuleItemsPowerAccent(),
ModuleType.Workspaces => GetModuleItemsWorkspaces(), ModuleType.Workspaces => GetModuleItemsWorkspaces(),
@@ -195,8 +179,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
ModuleType.MeasureTool => GetModuleItemsMeasureTool(), ModuleType.MeasureTool => GetModuleItemsMeasureTool(),
ModuleType.ShortcutGuide => GetModuleItemsShortcutGuide(), ModuleType.ShortcutGuide => GetModuleItemsShortcutGuide(),
ModuleType.PowerOCR => GetModuleItemsPowerOCR(), ModuleType.PowerOCR => GetModuleItemsPowerOCR(),
ModuleType.NewPlus => GetModuleItemsNewPlus(),
ModuleType.ZoomIt => GetModuleItemsZoomIt(),
_ => new ObservableCollection<DashboardModuleItem>(), // never called, all values listed above _ => new ObservableCollection<DashboardModuleItem>(), // never called, all values listed above
}; };
} }
@@ -211,22 +193,13 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
private ObservableCollection<DashboardModuleItem> GetModuleItemsAwake()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("Awake_ShortDescription") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsCmdPal() private ObservableCollection<DashboardModuleItem> GetModuleItemsCmdPal()
{ {
var hotkey = new CmdPalProperties().Hotkey; var hotkey = new CmdPalProperties().Hotkey;
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("CmdPal_ShortDescription"), Shortcut = hotkey.GetKeysList() }, new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("CmdPal_ActivationDescription"), Shortcut = hotkey.GetKeysList() },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -259,7 +232,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{ {
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("EnvironmentVariables_LaunchButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("EnvironmentVariables_LaunchButtonControl/Description"), ButtonGlyph = "\uEA37", ButtonClickHandler = EnvironmentVariablesLaunchClicked }, new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("EnvironmentVariables_LaunchButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("EnvironmentVariables_LaunchButtonControl/Description"), ButtonGlyph = "ms-appx:///Assets/Settings/Icons/EnvironmentVariables.png", ButtonClickHandler = EnvironmentVariablesLaunchClicked },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -268,26 +241,13 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{ {
ISettingsRepository<FancyZonesSettings> moduleSettingsRepository = SettingsRepository<FancyZonesSettings>.GetInstance(new SettingsUtils()); ISettingsRepository<FancyZonesSettings> moduleSettingsRepository = SettingsRepository<FancyZonesSettings>.GetInstance(new SettingsUtils());
var settings = moduleSettingsRepository.SettingsConfig; var settings = moduleSettingsRepository.SettingsConfig;
string activationMode = $"{resourceLoader.GetString(settings.Properties.FancyzonesShiftDrag.Value ? "FancyZones_ShiftDragCheckBoxControl_Header/Content" : "FancyZones_ActivationNoShiftDrag")}."; string activationMode = $"{resourceLoader.GetString(settings.Properties.FancyzonesShiftDrag.Value ? "FancyZones_ActivationShiftDrag" : "FancyZones_ActivationNoShiftDrag")}.";
if (settings.Properties.FancyzonesMouseSwitch.Value)
{
activationMode += $" {resourceLoader.GetString("FancyZones_MouseDragCheckBoxControl_Header/Content")}.";
}
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleTextItem() { Label = activationMode }, new DashboardModuleActivationItem() { Label = resourceLoader.GetString("Activate_Zones"), Activation = activationMode },
new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("FancyZones_OpenEditor"), Shortcut = settings.Properties.FancyzonesEditorHotkey.Value.GetKeysList() }, new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("FancyZones_OpenEditor"), Shortcut = settings.Properties.FancyzonesEditorHotkey.Value.GetKeysList() },
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Description"), ButtonGlyph = "\uEB3C", ButtonClickHandler = FancyZoneLaunchClicked }, new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Description"), ButtonGlyph = "ms-appx:///Assets/Settings/Icons/FancyZones.png", ButtonClickHandler = FancyZoneLaunchClicked },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsFileLocksmith()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("FileLocksmith_ShortDescription") },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -306,15 +266,16 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
} }
else else
{ {
string activation = string.Empty;
switch (activationMethod) switch (activationMethod)
{ {
case 2: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationShakeMouse/Content")}"; break; case 2: activation = resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationShakeMouse/Content"); break;
case 1: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationDoubleRightControlPress/Content")}"; break; case 1: activation = resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationDoubleRightControlPress/Content"); break;
case 0: case 0:
default: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationDoubleControlPress/Content")}"; break; default: activation = resourceLoader.GetString("MouseUtils_FindMyMouse_ActivationDoubleControlPress/Content"); break;
} }
list.Add(new DashboardModuleTextItem() { Label = shortDescription }); list.Add(new DashboardModuleActivationItem() { Label = resourceLoader.GetString("Dashboard_Activation"), Activation = activation });
} }
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
@@ -324,36 +285,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{ {
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("Hosts_LaunchButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("Hosts_LaunchButtonControl/Description"), ButtonGlyph = "\uEA37", ButtonClickHandler = HostLaunchClicked }, new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("Hosts_LaunchButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("Hosts_LaunchButtonControl/Description"), ButtonGlyph = "ms-appx:///Assets/Settings/Icons/Hosts.png", ButtonClickHandler = HostLaunchClicked },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsImageResizer()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("ImageResizer_ShortDescription") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsKeyboardManager()
{
KeyboardManagerProfile kbmProfile = GetKBMProfile();
_kbmItem = new DashboardModuleKBMItem() { RemapKeys = kbmProfile?.RemapKeys.InProcessRemapKeys, RemapShortcuts = KeyboardManagerViewModel.CombineShortcutLists(kbmProfile?.RemapShortcuts.GlobalRemapShortcuts, kbmProfile?.RemapShortcuts.AppSpecificRemapShortcuts) };
_kbmItem.RemapKeys = _kbmItem.RemapKeys.Concat(kbmProfile?.RemapKeysToText.InProcessRemapKeys).ToList();
var shortcutsToTextRemappings = KeyboardManagerViewModel.CombineShortcutLists(kbmProfile?.RemapShortcutsToText.GlobalRemapShortcuts, kbmProfile?.RemapShortcutsToText.AppSpecificRemapShortcuts);
_kbmItem.RemapShortcuts = _kbmItem.RemapShortcuts.Concat(shortcutsToTextRemappings).ToList();
var list = new List<DashboardModuleItem>
{
_kbmItem,
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("KeyboardManager_RemapKeyboardButton/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("KeyboardManager_RemapKeyboardButton/Description"), ButtonGlyph = "\uE92E", ButtonClickHandler = KbmKeyLaunchClicked },
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("KeyboardManager_RemapShortcutsButton/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("KeyboardManager_RemapShortcutsButton/Description"), ButtonGlyph = "\uE92E", ButtonClickHandler = KbmShortcutLaunchClicked },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -388,15 +320,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
private ObservableCollection<DashboardModuleItem> GetModuleItemsMouseWithoutBorders()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("MouseWithoutBorders_ShortDescription") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsAdvancedPaste() private ObservableCollection<DashboardModuleItem> GetModuleItemsAdvancedPaste()
{ {
ISettingsRepository<AdvancedPasteSettings> moduleSettingsRepository = SettingsRepository<AdvancedPasteSettings>.GetInstance(new SettingsUtils()); ISettingsRepository<AdvancedPasteSettings> moduleSettingsRepository = SettingsRepository<AdvancedPasteSettings>.GetInstance(new SettingsUtils());
@@ -429,15 +352,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
private ObservableCollection<DashboardModuleItem> GetModuleItemsPowerRename()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("PowerRename_ShortDescription") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsPowerLauncher() private ObservableCollection<DashboardModuleItem> GetModuleItemsPowerLauncher()
{ {
ISettingsRepository<PowerLauncherSettings> moduleSettingsRepository = SettingsRepository<PowerLauncherSettings>.GetInstance(new SettingsUtils()); ISettingsRepository<PowerLauncherSettings> moduleSettingsRepository = SettingsRepository<PowerLauncherSettings>.GetInstance(new SettingsUtils());
@@ -450,20 +364,20 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
private ObservableCollection<DashboardModuleItem> GetModuleItemsPowerAccent() private ObservableCollection<DashboardModuleItem> GetModuleItemsPowerAccent()
{ {
string shortDescription = resourceLoader.GetString("PowerAccent_ShortDescription");
var settingsUtils = new SettingsUtils(); var settingsUtils = new SettingsUtils();
PowerAccentSettings moduleSettings = settingsUtils.GetSettingsOrDefault<PowerAccentSettings>(PowerAccentSettings.ModuleName); PowerAccentSettings moduleSettings = settingsUtils.GetSettingsOrDefault<PowerAccentSettings>(PowerAccentSettings.ModuleName);
var activationMethod = moduleSettings.Properties.ActivationKey; var activationMethod = moduleSettings.Properties.ActivationKey;
string activation = string.Empty;
switch (activationMethod) switch (activationMethod)
{ {
case Library.Enumerations.PowerAccentActivationKey.LeftRightArrow: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("QuickAccent_Activation_Key_Arrows/Content")}"; break; case Library.Enumerations.PowerAccentActivationKey.LeftRightArrow: activation = resourceLoader.GetString("QuickAccent_Activation_Key_Arrows/Content"); break;
case Library.Enumerations.PowerAccentActivationKey.Space: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("QuickAccent_Activation_Key_Space/Content")}"; break; case Library.Enumerations.PowerAccentActivationKey.Space: activation = resourceLoader.GetString("QuickAccent_Activation_Key_Space/Content"); break;
case Library.Enumerations.PowerAccentActivationKey.Both: shortDescription += $". {resourceLoader.GetString("Dashboard_Activation")}: {resourceLoader.GetString("QuickAccent_Activation_Key_Either/Content")}"; break; case Library.Enumerations.PowerAccentActivationKey.Both: activation = resourceLoader.GetString("QuickAccent_Activation_Key_Either/Content"); break;
} }
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleTextItem() { Label = shortDescription }, new DashboardModuleActivationItem() { Label = resourceLoader.GetString("Dashboard_Activation"), Activation = activation },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -476,7 +390,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("Workspaces_ShortDescription"), Shortcut = settings.Properties.Hotkey.Value.GetKeysList() }, new DashboardModuleShortcutItem() { Label = resourceLoader.GetString("Workspaces_ShortDescription"), Shortcut = settings.Properties.Hotkey.Value.GetKeysList() },
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("Workspaces_LaunchEditorButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Description"), ButtonGlyph = "\uEB3C", ButtonClickHandler = WorkspacesLaunchClicked }, new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("Workspaces_LaunchEditorButtonControl/Header"), IsButtonDescriptionVisible = true, ButtonDescription = resourceLoader.GetString("FancyZones_LaunchEditorButtonControl/Description"), ButtonGlyph = "ms-appx:///Assets/Settings/Icons/Workspaces.png", ButtonClickHandler = WorkspacesLaunchClicked },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -485,7 +399,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{ {
var list = new List<DashboardModuleItem> var list = new List<DashboardModuleItem>
{ {
new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("RegistryPreview_LaunchButtonControl/Header"), ButtonGlyph = "\uEA37", ButtonClickHandler = RegistryPreviewLaunchClicked }, new DashboardModuleButtonItem() { ButtonTitle = resourceLoader.GetString("RegistryPreview_LaunchButtonControl/Header"), ButtonGlyph = "ms-appx:///Assets/Settings/Icons/RegistryPreview.png", ButtonClickHandler = RegistryPreviewLaunchClicked },
}; };
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
@@ -525,24 +439,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
return new ObservableCollection<DashboardModuleItem>(list); return new ObservableCollection<DashboardModuleItem>(list);
} }
private ObservableCollection<DashboardModuleItem> GetModuleItemsNewPlus()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("NewPlus_Product_Description/Description") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
private ObservableCollection<DashboardModuleItem> GetModuleItemsZoomIt()
{
var list = new List<DashboardModuleItem>
{
new DashboardModuleTextItem() { Label = resourceLoader.GetString("ZoomIt_ShortDescription") },
};
return new ObservableCollection<DashboardModuleItem>(list);
}
internal void SWVersionButtonClicked() internal void SWVersionButtonClicked()
{ {
NavigationService.Navigate(typeof(GeneralPage)); NavigationService.Navigate(typeof(GeneralPage));
@@ -574,20 +470,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
SendConfigMSG("{\"action\":{\"Workspaces\":{\"action_name\":\"LaunchEditor\", \"value\":\"\"}}}"); SendConfigMSG("{\"action\":{\"Workspaces\":{\"action_name\":\"LaunchEditor\", \"value\":\"\"}}}");
} }
private void KbmKeyLaunchClicked(object sender, RoutedEventArgs e)
{
var settingsUtils = new SettingsUtils();
var kbmViewModel = new KeyboardManagerViewModel(settingsUtils, SettingsRepository<GeneralSettings>.GetInstance(settingsUtils), ShellPage.SendDefaultIPCMessage, KeyboardManagerPage.FilterRemapKeysList);
kbmViewModel.OnRemapKeyboard();
}
private void KbmShortcutLaunchClicked(object sender, RoutedEventArgs e)
{
var settingsUtils = new SettingsUtils();
var kbmViewModel = new KeyboardManagerViewModel(settingsUtils, SettingsRepository<GeneralSettings>.GetInstance(settingsUtils), ShellPage.SendDefaultIPCMessage, KeyboardManagerPage.FilterRemapKeysList);
kbmViewModel.OnEditShortcut();
}
private void RegistryPreviewLaunchClicked(object sender, RoutedEventArgs e) private void RegistryPreviewLaunchClicked(object sender, RoutedEventArgs e)
{ {
var actionName = "Launch"; var actionName = "Launch";
@@ -596,20 +478,10 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
internal void DashboardListItemClick(object sender) internal void DashboardListItemClick(object sender)
{ {
Button button = sender as Button; if (sender is SettingsCard card && card.Tag is ModuleType moduleType)
if (button == null)
{ {
return;
}
if (!(button.Tag is ModuleType))
{
return;
}
ModuleType moduleType = (ModuleType)button.Tag;
NavigationService.Navigate(ModuleHelper.GetModulePageType(moduleType)); NavigationService.Navigate(ModuleHelper.GetModulePageType(moduleType));
} }
} }
} }
}