[MouseHighlighter]Add always-on pointer (#27186)

* [MouseHighlighter]Add always pointer

Make color pick UI ARGB
Delete Opacity setting

* Fix opacity and color

Fix "always color" incorrectly initialized
Revert default opacity to 65%, which was unintentionally lowered to 25% when
changing to percent

* Fix crash when opening MouseUtils settings page

Migration code was bugged, made malformed json and led to settings page crash.

* Implement migration in module side
This commit is contained in:
hayatogh
2023-07-26 23:48:00 +09:00
committed by GitHub
parent a99b2e0bc0
commit a71411d931
12 changed files with 331 additions and 74 deletions

View File

@@ -35,5 +35,33 @@ namespace Microsoft.PowerToys.Settings.UI.Library.Helpers
return "#FFFFFF";
}
}
public static string ToARGBHex(string color)
{
if (color == null)
{
return "#FFFFFFFF";
}
// Using InvariantCulture as these are expected to be hex codes.
bool success = int.TryParse(
color.Replace("#", string.Empty),
System.Globalization.NumberStyles.HexNumber,
CultureInfo.InvariantCulture,
out int argb);
if (success)
{
Color clr = Color.FromArgb(argb);
return "#" + clr.A.ToString("X2", CultureInfo.InvariantCulture) +
clr.R.ToString("X2", CultureInfo.InvariantCulture) +
clr.G.ToString("X2", CultureInfo.InvariantCulture) +
clr.B.ToString("X2", CultureInfo.InvariantCulture);
}
else
{
return "#FFFFFFFF";
}
}
}
}

View File

@@ -22,6 +22,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
[JsonPropertyName("highlight_opacity")]
public IntProperty HighlightOpacity { get; set; }
[JsonPropertyName("always_color")]
public StringProperty AlwaysColor { get; set; }
[JsonPropertyName("highlight_radius")]
public IntProperty HighlightRadius { get; set; }
@@ -34,9 +37,10 @@ namespace Microsoft.PowerToys.Settings.UI.Library
public MouseHighlighterProperties()
{
ActivationShortcut = DefaultActivationShortcut;
LeftButtonClickColor = new StringProperty("#FFFF00");
RightButtonClickColor = new StringProperty("#0000FF");
HighlightOpacity = new IntProperty(65);
LeftButtonClickColor = new StringProperty("#a6FFFF00");
RightButtonClickColor = new StringProperty("#a60000FF");
AlwaysColor = new StringProperty("#00FF0000");
HighlightOpacity = new IntProperty(166); // for migration from <=1.1 to 1.2
HighlightRadius = new IntProperty(20);
HighlightFadeDelayMs = new IntProperty(500);
HighlightFadeDurationMs = new IntProperty(250);

View File

@@ -2,6 +2,8 @@
// 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.Globalization;
using System.Runtime.InteropServices;
using System.Text.Json.Serialization;
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
@@ -18,7 +20,7 @@ namespace Microsoft.PowerToys.Settings.UI.Library
{
Name = ModuleName;
Properties = new MouseHighlighterProperties();
Version = "1.1";
Version = "1.2";
}
public string GetModuleName()
@@ -29,11 +31,22 @@ namespace Microsoft.PowerToys.Settings.UI.Library
// This can be utilized in the future if the settings.json file is to be modified/deleted.
public bool UpgradeSettingsConfiguration()
{
// Migrate settings from 1.0 to 1.1
if (Version == "1.0")
if (Version == "1.0" || Version == "1.1")
{
Version = "1.1";
Properties.HighlightOpacity = new IntProperty(Properties.HighlightOpacity.Value * 100 / 255);
string opacity;
if (Version == "1.0")
{
opacity = string.Format(CultureInfo.InvariantCulture, "{0:X2}", Properties.HighlightOpacity.Value);
}
else
{
// 1.1
opacity = string.Format(CultureInfo.InvariantCulture, "{0:X2}", Properties.HighlightOpacity.Value * 255 / 100);
}
Properties.LeftButtonClickColor = new StringProperty(string.Concat("#", opacity, Properties.LeftButtonClickColor.Value.ToString().Substring(1, 6)));
Properties.RightButtonClickColor = new StringProperty(string.Concat("#", opacity, Properties.RightButtonClickColor.Value.ToString().Substring(1, 6)));
Version = "1.2";
return true;
}

View File

@@ -0,0 +1,42 @@
<UserControl
x:Class="Microsoft.PowerToys.Settings.UI.Controls.AlphaColorPickerButton"
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"
d:DesignHeight="300"
d:DesignWidth="400"
mc:Ignorable="d">
<Grid>
<!--TODO(stefan): ToDisplayName is no longer available in ColorHelper
<DropDownButton Padding="4,4,8,4" AutomationProperties.FullDescription="{x:Bind clr:ColorHelper.ToDisplayName(SelectedColor), Mode=OneWay }">
-->
<DropDownButton Padding="4,4,8,4">
<Border
x:Name="ColorPreviewBorder"
Width="48"
Height="24"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="{ThemeResource ControlCornerRadius}">
<Border.Background>
<SolidColorBrush Color="{x:Bind SelectedColor, Mode=OneWay}" />
</Border.Background>
</Border>
<DropDownButton.Flyout>
<Flyout>
<ColorPicker
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
Color="{x:Bind SelectedColor, Mode=TwoWay}" />
</Flyout>
</DropDownButton.Flyout>
</DropDownButton>
</Grid>
</UserControl>

View File

@@ -0,0 +1,59 @@
// 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.UI;
namespace Microsoft.PowerToys.Settings.UI.Controls
{
public sealed partial class AlphaColorPickerButton : UserControl
{
private Color _selectedColor;
public Color SelectedColor
{
get
{
return _selectedColor;
}
set
{
if (_selectedColor != value)
{
_selectedColor = value;
SetValue(SelectedColorProperty, value);
}
}
}
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(AlphaColorPickerButton), new PropertyMetadata(null));
public AlphaColorPickerButton()
{
this.InitializeComponent();
IsEnabledChanged -= AlphaColorPickerButton_IsEnabledChanged;
SetEnabledState();
IsEnabledChanged += AlphaColorPickerButton_IsEnabledChanged;
}
private void AlphaColorPickerButton_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
SetEnabledState();
}
private void SetEnabledState()
{
if (this.IsEnabled)
{
ColorPreviewBorder.Opacity = 1;
}
else
{
ColorPreviewBorder.Opacity = 0.2;
}
}
}
}

View File

@@ -163,17 +163,13 @@
IsEnabled="{x:Bind ViewModel.IsMouseHighlighterEnabled, Mode=OneWay}">
<labs:SettingsExpander.Items>
<labs:SettingsCard x:Uid="MouseUtils_MouseHighlighter_PrimaryButtonClickColor">
<controls:ColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterLeftButtonClickColor, Mode=TwoWay}" />
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterLeftButtonClickColor, Mode=TwoWay}" />
</labs:SettingsCard>
<labs:SettingsCard x:Uid="MouseUtils_MouseHighlighter_SecondaryButtonClickColor">
<controls:ColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterRightButtonClickColor, Mode=TwoWay}" />
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterRightButtonClickColor, Mode=TwoWay}" />
</labs:SettingsCard>
<labs:SettingsCard x:Uid="MouseUtils_MouseHighlighter_HighlightOpacity">
<Slider
MinWidth="{StaticResource SettingActionControlMinWidth}"
Maximum="100"
Minimum="1"
Value="{x:Bind Mode=TwoWay, Path=ViewModel.MouseHighlighterOpacity}" />
<labs:SettingsCard x:Uid="MouseUtils_MouseHighlighter_AlwaysColor">
<controls:AlphaColorPickerButton SelectedColor="{x:Bind Path=ViewModel.MouseHighlighterAlwaysColor, Mode=TwoWay}" />
</labs:SettingsCard>
<labs:SettingsCard x:Uid="MouseUtils_MouseHighlighter_HighlightRadius">
<NumberBox

View File

@@ -2601,9 +2601,6 @@ Right-click to remove the key combination, thereby deactivating the shortcut.</v
<data name="MouseUtils_MouseHighlighter_SecondaryButtonClickColor.Header" xml:space="preserve">
<value>Secondary button highlight color</value>
</data>
<data name="MouseUtils_MouseHighlighter_HighlightOpacity.Header" xml:space="preserve">
<value>Opacity (%)</value>
</data>
<data name="MouseUtils_MouseHighlighter_HighlightRadius.Header" xml:space="preserve">
<value>Radius (px)</value>
<comment>px = pixels</comment>
@@ -3590,6 +3587,9 @@ Activate by holding the key for the character you want to add an accent to, then
<data name="Hosts_Encoding_Utf8Bom.Content" xml:space="preserve">
<value>UTF-8 with BOM</value>
</data>
<data name="MouseUtils_MouseHighlighter_AlwaysColor.Header" xml:space="preserve">
<value>Always highlight color</value>
</data>
<data name="MouseUtils_MousePointerCrosshairs_CrosshairsAutoHide.Content" xml:space="preserve">
<value>Automatically hide crosshairs when the mouse pointer is hidden</value>
</data>

View File

@@ -71,12 +71,14 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
MouseHighlighterSettingsConfig = mouseHighlighterSettingsRepository.SettingsConfig;
string leftClickColor = MouseHighlighterSettingsConfig.Properties.LeftButtonClickColor.Value;
_highlighterLeftButtonClickColor = !string.IsNullOrEmpty(leftClickColor) ? leftClickColor : "#FFFF00";
_highlighterLeftButtonClickColor = !string.IsNullOrEmpty(leftClickColor) ? leftClickColor : "#a6FFFF00";
string rightClickColor = MouseHighlighterSettingsConfig.Properties.RightButtonClickColor.Value;
_highlighterRightButtonClickColor = !string.IsNullOrEmpty(rightClickColor) ? rightClickColor : "#0000FF";
_highlighterRightButtonClickColor = !string.IsNullOrEmpty(rightClickColor) ? rightClickColor : "#a60000FF";
string alwaysColor = MouseHighlighterSettingsConfig.Properties.AlwaysColor.Value;
_highlighterAlwaysColor = !string.IsNullOrEmpty(alwaysColor) ? alwaysColor : "#00FF0000";
_highlighterOpacity = MouseHighlighterSettingsConfig.Properties.HighlightOpacity.Value;
_highlighterRadius = MouseHighlighterSettingsConfig.Properties.HighlightRadius.Value;
_highlightFadeDelayMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDelayMs.Value;
_highlightFadeDurationMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDurationMs.Value;
@@ -445,7 +447,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
set
{
value = SettingsUtilities.ToRGBHex(value);
value = SettingsUtilities.ToARGBHex(value);
if (!value.Equals(_highlighterLeftButtonClickColor, StringComparison.OrdinalIgnoreCase))
{
_highlighterLeftButtonClickColor = value;
@@ -464,7 +466,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
set
{
value = SettingsUtilities.ToRGBHex(value);
value = SettingsUtilities.ToARGBHex(value);
if (!value.Equals(_highlighterRightButtonClickColor, StringComparison.OrdinalIgnoreCase))
{
_highlighterRightButtonClickColor = value;
@@ -474,19 +476,20 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
}
}
public int MouseHighlighterOpacity
public string MouseHighlighterAlwaysColor
{
get
{
return _highlighterOpacity;
return _highlighterAlwaysColor;
}
set
{
if (value != _highlighterOpacity)
value = SettingsUtilities.ToARGBHex(value);
if (!value.Equals(_highlighterAlwaysColor, StringComparison.OrdinalIgnoreCase))
{
_highlighterOpacity = value;
MouseHighlighterSettingsConfig.Properties.HighlightOpacity.Value = value;
_highlighterAlwaysColor = value;
MouseHighlighterSettingsConfig.Properties.AlwaysColor.Value = value;
NotifyMouseHighlighterPropertyChanged();
}
}
@@ -889,7 +892,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
private bool _isMouseHighlighterEnabled;
private string _highlighterLeftButtonClickColor;
private string _highlighterRightButtonClickColor;
private int _highlighterOpacity;
private string _highlighterAlwaysColor;
private int _highlighterRadius;
private int _highlightFadeDelayMs;
private int _highlightFadeDurationMs;