mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-03 17:56:44 +02:00
Mouse Utils - Mouse Pointer Crosshair (#15633)
* Apply PowerToys template * Add CppWinRt package * Add Settings reference * Use proper output dir * Proper WindowsTargetPlatformVersion * Add filters to vcxproj * Proper resource file generation * Remove boilerplate code * Initial implementation of the mouse crosshair * Add enable module to settings page * Change hotkey in settings * Add color, opacity, thickness settings * Add telemetry * Add Oobe entry * Add installer instructions * Add dll to pipelines * Add crosshair borders * Fix settings case * Tweak defaults to make it look like the specs * fix spellchecker * Fix resources and binary info * Correct composition tree comment typo * Reduce argument copy * Start disabled by default * Add maximum to crosshair thickness and border size * Set minimum border size of 0 * Fix comment * Add maximum to radius * Add comment for non-localizable strings * Rename "Inclusive Mouse"-"Mouse Pointer Crosshair"
This commit is contained in:
@@ -223,6 +223,22 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
}
|
||||
}
|
||||
|
||||
private bool mousePointerCrosshair = true;
|
||||
|
||||
[JsonPropertyName("MousePointerCrosshair")]
|
||||
public bool MousePointerCrosshair
|
||||
{
|
||||
get => mousePointerCrosshair;
|
||||
set
|
||||
{
|
||||
if (mousePointerCrosshair != value)
|
||||
{
|
||||
LogTelemetryEvent(value);
|
||||
mousePointerCrosshair = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string ToJsonString()
|
||||
{
|
||||
return JsonSerializer.Serialize(this);
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// 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.Text.Json.Serialization;
|
||||
|
||||
namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
{
|
||||
public class MousePointerCrosshairProperties
|
||||
{
|
||||
[JsonPropertyName("activation_shortcut")]
|
||||
public HotkeySettings ActivationShortcut { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_color")]
|
||||
public StringProperty CrosshairColor { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_opacity")]
|
||||
public IntProperty CrosshairOpacity { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_radius")]
|
||||
public IntProperty CrosshairRadius { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_thickness")]
|
||||
public IntProperty CrosshairThickness { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_border_color")]
|
||||
public StringProperty CrosshairBorderColor { get; set; }
|
||||
|
||||
[JsonPropertyName("crosshair_border_size")]
|
||||
public IntProperty CrosshairBorderSize { get; set; }
|
||||
|
||||
public MousePointerCrosshairProperties()
|
||||
{
|
||||
ActivationShortcut = new HotkeySettings(false, true, true, false, 0x50); // Ctrl + Alt + P
|
||||
CrosshairColor = new StringProperty("#FF0000");
|
||||
CrosshairOpacity = new IntProperty(75);
|
||||
CrosshairRadius = new IntProperty(20);
|
||||
CrosshairThickness = new IntProperty(5);
|
||||
CrosshairBorderColor = new StringProperty("#FFFFFF");
|
||||
CrosshairBorderSize = new IntProperty(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// 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.Text.Json.Serialization;
|
||||
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
|
||||
|
||||
namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
{
|
||||
public class MousePointerCrosshairSettings : BasePTModuleSettings, ISettingsConfig
|
||||
{
|
||||
public const string ModuleName = "MousePointerCrosshair";
|
||||
|
||||
[JsonPropertyName("properties")]
|
||||
public MousePointerCrosshairProperties Properties { get; set; }
|
||||
|
||||
public MousePointerCrosshairSettings()
|
||||
{
|
||||
Name = ModuleName;
|
||||
Properties = new MousePointerCrosshairProperties();
|
||||
Version = "1.0";
|
||||
}
|
||||
|
||||
public string GetModuleName()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
// This can be utilized in the future if the settings.json file is to be modified/deleted.
|
||||
public bool UpgradeSettingsConfiguration()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// 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.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
{
|
||||
public class MousePointerCrosshairSettingsIPCMessage
|
||||
{
|
||||
[JsonPropertyName("powertoys")]
|
||||
public SndMousePointerCrosshairSettings Powertoys { get; set; }
|
||||
|
||||
public MousePointerCrosshairSettingsIPCMessage()
|
||||
{
|
||||
}
|
||||
|
||||
public MousePointerCrosshairSettingsIPCMessage(SndMousePointerCrosshairSettings settings)
|
||||
{
|
||||
this.Powertoys = settings;
|
||||
}
|
||||
|
||||
public string ToJsonString()
|
||||
{
|
||||
return JsonSerializer.Serialize(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// 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.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Microsoft.PowerToys.Settings.UI.Library
|
||||
{
|
||||
public class SndMousePointerCrosshairSettings
|
||||
{
|
||||
[JsonPropertyName("MousePointerCrosshair")]
|
||||
public MousePointerCrosshairSettings MousePointerCrosshair { get; set; }
|
||||
|
||||
public SndMousePointerCrosshairSettings()
|
||||
{
|
||||
}
|
||||
|
||||
public SndMousePointerCrosshairSettings(MousePointerCrosshairSettings settings)
|
||||
{
|
||||
MousePointerCrosshair = settings;
|
||||
}
|
||||
|
||||
public string ToJsonString()
|
||||
{
|
||||
return JsonSerializer.Serialize(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
|
||||
private MouseHighlighterSettings MouseHighlighterSettingsConfig { get; set; }
|
||||
|
||||
public MouseUtilsViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, ISettingsRepository<FindMyMouseSettings> findMyMouseSettingsRepository, ISettingsRepository<MouseHighlighterSettings> mouseHighlighterSettingsRepository, Func<string, int> ipcMSGCallBackFunc)
|
||||
private MousePointerCrosshairSettings MousePointerCrosshairSettingsConfig { get; set; }
|
||||
|
||||
public MouseUtilsViewModel(ISettingsUtils settingsUtils, ISettingsRepository<GeneralSettings> settingsRepository, ISettingsRepository<FindMyMouseSettings> findMyMouseSettingsRepository, ISettingsRepository<MouseHighlighterSettings> mouseHighlighterSettingsRepository, ISettingsRepository<MousePointerCrosshairSettings> mousePointerCrosshairSettingsRepository, Func<string, int> ipcMSGCallBackFunc)
|
||||
{
|
||||
SettingsUtils = settingsUtils;
|
||||
|
||||
@@ -35,6 +37,8 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
|
||||
_isMouseHighlighterEnabled = GeneralSettingsConfig.Enabled.MouseHighlighter;
|
||||
|
||||
_isMousePointerCrosshairEnabled = GeneralSettingsConfig.Enabled.MousePointerCrosshair;
|
||||
|
||||
// To obtain the find my mouse settings, if the file exists.
|
||||
// If not, to create a file with the default settings and to return the default configurations.
|
||||
if (findMyMouseSettingsRepository == null)
|
||||
@@ -73,6 +77,24 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
_highlightFadeDelayMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDelayMs.Value;
|
||||
_highlightFadeDurationMs = MouseHighlighterSettingsConfig.Properties.HighlightFadeDurationMs.Value;
|
||||
|
||||
if (mousePointerCrosshairSettingsRepository == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(mousePointerCrosshairSettingsRepository));
|
||||
}
|
||||
|
||||
MousePointerCrosshairSettingsConfig = mousePointerCrosshairSettingsRepository.SettingsConfig;
|
||||
|
||||
string crosshairColor = MousePointerCrosshairSettingsConfig.Properties.CrosshairColor.Value;
|
||||
_mousePointerCrosshairColor = !string.IsNullOrEmpty(crosshairColor) ? crosshairColor : "#FF0000";
|
||||
|
||||
string crosshairBorderColor = MousePointerCrosshairSettingsConfig.Properties.CrosshairBorderColor.Value;
|
||||
_mousePointerCrosshairBorderColor = !string.IsNullOrEmpty(crosshairBorderColor) ? crosshairBorderColor : "#FFFFFF";
|
||||
|
||||
_mousePointerCrosshairOpacity = MousePointerCrosshairSettingsConfig.Properties.CrosshairOpacity.Value;
|
||||
_mousePointerCrosshairRadius = MousePointerCrosshairSettingsConfig.Properties.CrosshairRadius.Value;
|
||||
_mousePointerCrosshairThickness = MousePointerCrosshairSettingsConfig.Properties.CrosshairThickness.Value;
|
||||
_mousePointerCrosshairBorderSize = MousePointerCrosshairSettingsConfig.Properties.CrosshairBorderSize.Value;
|
||||
|
||||
// set the callback functions value to handle outgoing IPC message.
|
||||
SendConfigMSG = ipcMSGCallBackFunc;
|
||||
}
|
||||
@@ -398,6 +420,169 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
SettingsUtils.SaveSettings(MouseHighlighterSettingsConfig.ToJsonString(), MouseHighlighterSettings.ModuleName);
|
||||
}
|
||||
|
||||
public bool IsMousePointerCrosshairEnabled
|
||||
{
|
||||
get => _isMousePointerCrosshairEnabled;
|
||||
set
|
||||
{
|
||||
if (_isMousePointerCrosshairEnabled != value)
|
||||
{
|
||||
_isMousePointerCrosshairEnabled = value;
|
||||
|
||||
GeneralSettingsConfig.Enabled.MousePointerCrosshair = value;
|
||||
OnPropertyChanged(nameof(_isMousePointerCrosshairEnabled));
|
||||
|
||||
OutGoingGeneralSettings outgoing = new OutGoingGeneralSettings(GeneralSettingsConfig);
|
||||
SendConfigMSG(outgoing.ToString());
|
||||
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public HotkeySettings MousePointerCrosshairActivationShortcut
|
||||
{
|
||||
get
|
||||
{
|
||||
return MousePointerCrosshairSettingsConfig.Properties.ActivationShortcut;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (MousePointerCrosshairSettingsConfig.Properties.ActivationShortcut != value)
|
||||
{
|
||||
MousePointerCrosshairSettingsConfig.Properties.ActivationShortcut = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string MousePointerCrosshairColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairColor;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
// The fallback value is based on ToRGBHex's behavior, which returns
|
||||
// #FFFFFF if any exceptions are encountered, e.g. from passing in a null value.
|
||||
// This extra handling is added here to deal with FxCop warnings.
|
||||
value = (value != null) ? SettingsUtilities.ToRGBHex(value) : "#FFFFFF";
|
||||
if (!value.Equals(_mousePointerCrosshairColor, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_mousePointerCrosshairColor = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairColor.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int MousePointerCrosshairOpacity
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairOpacity;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value != _mousePointerCrosshairOpacity)
|
||||
{
|
||||
_mousePointerCrosshairOpacity = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairOpacity.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int MousePointerCrosshairRadius
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairRadius;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value != _mousePointerCrosshairRadius)
|
||||
{
|
||||
_mousePointerCrosshairRadius = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairRadius.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int MousePointerCrosshairThickness
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairThickness;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value != _mousePointerCrosshairThickness)
|
||||
{
|
||||
_mousePointerCrosshairThickness = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairThickness.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string MousePointerCrosshairBorderColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairBorderColor;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
// The fallback value is based on ToRGBHex's behavior, which returns
|
||||
// #FFFFFF if any exceptions are encountered, e.g. from passing in a null value.
|
||||
// This extra handling is added here to deal with FxCop warnings.
|
||||
value = (value != null) ? SettingsUtilities.ToRGBHex(value) : "#FFFFFF";
|
||||
if (!value.Equals(_mousePointerCrosshairBorderColor, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_mousePointerCrosshairBorderColor = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairBorderColor.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int MousePointerCrosshairBorderSize
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mousePointerCrosshairBorderSize;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value != _mousePointerCrosshairBorderSize)
|
||||
{
|
||||
_mousePointerCrosshairBorderSize = value;
|
||||
MousePointerCrosshairSettingsConfig.Properties.CrosshairBorderSize.Value = value;
|
||||
NotifyMousePointerCrosshairPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void NotifyMousePointerCrosshairPropertyChanged([CallerMemberName] string propertyName = null)
|
||||
{
|
||||
OnPropertyChanged(propertyName);
|
||||
|
||||
SndMousePointerCrosshairSettings outsettings = new SndMousePointerCrosshairSettings(MousePointerCrosshairSettingsConfig);
|
||||
SndModuleSettings<SndMousePointerCrosshairSettings> ipcMessage = new SndModuleSettings<SndMousePointerCrosshairSettings>(outsettings);
|
||||
SendConfigMSG(ipcMessage.ToJsonString());
|
||||
SettingsUtils.SaveSettings(MousePointerCrosshairSettingsConfig.ToJsonString(), MousePointerCrosshairSettings.ModuleName);
|
||||
}
|
||||
|
||||
private Func<string, int> SendConfigMSG { get; }
|
||||
|
||||
private bool _isFindMyMouseEnabled;
|
||||
@@ -416,5 +601,13 @@ namespace Microsoft.PowerToys.Settings.UI.Library.ViewModels
|
||||
private int _highlighterRadius;
|
||||
private int _highlightFadeDelayMs;
|
||||
private int _highlightFadeDurationMs;
|
||||
|
||||
private bool _isMousePointerCrosshairEnabled;
|
||||
private string _mousePointerCrosshairColor;
|
||||
private int _mousePointerCrosshairOpacity;
|
||||
private int _mousePointerCrosshairRadius;
|
||||
private int _mousePointerCrosshairThickness;
|
||||
private string _mousePointerCrosshairBorderColor;
|
||||
private int _mousePointerCrosshairBorderSize;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user