Files
PowerToys/src/settings-ui/Settings.UI/SettingsXAML/Views/MouseWithoutBordersPage.xaml.cs
Josh Soref 74a1a6eca2 Upgrade to check-spelling v0.0.24 (#36235)
This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24).

A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur.

There's a new accessibility forbidden pattern:

> Do not use `(click) here` links
> For more information, see:
> * https://www.w3.org/QA/Tips/noClickHere
> * https://webaim.org/techniques/hypertext/link_text
> * https://granicus.com/blog/why-click-here-links-are-bad/
> * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
```pl
(?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
```

There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month.

I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib.

- There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.
2024-12-06 10:33:08 -06:00

174 lines
5.9 KiB
C#

// 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.IO.Abstractions;
using System.Threading.Tasks;
using System.Windows.Input;
using Microsoft.PowerToys.Settings.UI.Helpers;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
using Microsoft.PowerToys.Settings.UI.ViewModels;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Windows.ApplicationModel.DataTransfer;
using WinRT;
using static Microsoft.PowerToys.Settings.UI.ViewModels.MouseWithoutBordersViewModel;
namespace Microsoft.PowerToys.Settings.UI.Views
{
public sealed partial class MouseWithoutBordersPage : Page, IRefreshablePage
{
private const string MouseWithoutBordersDragDropCheckString = "MWB Device Drag Drop";
private const string PowerToyName = "MouseWithoutBorders";
private MouseWithoutBordersViewModel ViewModel { get; set; }
private readonly IFileSystemWatcher watcher;
public MouseWithoutBordersPage()
{
var settingsUtils = new SettingsUtils();
ViewModel = new MouseWithoutBordersViewModel(
settingsUtils,
SettingsRepository<GeneralSettings>.GetInstance(settingsUtils),
ShellPage.SendDefaultIPCMessage,
DispatcherQueue);
watcher = Helper.GetFileWatcher(
PowerToyName,
"settings.json",
OnConfigFileUpdate);
DataContext = ViewModel;
InitializeComponent();
}
private void OnConfigFileUpdate()
{
// Note: FileSystemWatcher raise notification multiple times for single update operation.
// Todo: Handle duplicate events either by somehow suppress them or re-read the configuration every time since we will be updating the UI only if something is changed.
this.DispatcherQueue.TryEnqueue(() =>
{
if (ViewModel.LoadUpdatedSettings())
{
ViewModel.NotifyUpdatedSettings();
}
});
}
private static T GetChildOfType<T>(DependencyObject depObj, string tag)
where T : FrameworkElement
{
if (depObj == null)
{
return null;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child, tag);
if (result != null && (string)result.Tag == tag)
{
return result;
}
}
return null;
}
private int GetDeviceIndex(Border b)
{
return b.DataContext.As<IndexedItem<DeviceViewModel>>().Index;
}
private void Device_DragStarting(UIElement sender, DragStartingEventArgs args)
{
args.Data.RequestedOperation = DataPackageOperation.Move;
args.Data.Properties.Add("check-usage", MouseWithoutBordersDragDropCheckString);
args.Data.Properties.Add("index", GetDeviceIndex((Border)sender));
}
private void Device_Drop(object sender, DragEventArgs e)
{
if (e.DataView.Properties.TryGetValue("check-usage", out object checkUsage))
{
// Guard against values dragged from somewhere else
if (!((string)checkUsage).Equals(MouseWithoutBordersDragDropCheckString, StringComparison.Ordinal))
{
return;
}
}
else
{
return;
}
if (!e.DataView.Properties.TryGetValue("index", out object boxIndex))
{
return;
}
var draggedDeviceIndex = (int)boxIndex;
if (draggedDeviceIndex < 0 || draggedDeviceIndex >= ViewModel.MachineMatrixString.Count)
{
return;
}
var targetDeviceIndex = GetDeviceIndex((Border)e.OriginalSource);
ViewModel.MachineMatrixString.Swap(draggedDeviceIndex, targetDeviceIndex);
var itemsControl = (ItemsControl)FindName("DevicesItemsControl");
var binding = itemsControl.GetBindingExpression(ItemsControl.ItemsSourceProperty);
binding.UpdateSource();
}
private void Device_DragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Move;
}
public ICommand ShowConnectFieldsCommand => new RelayCommand(ShowConnectFields);
public ICommand ConnectCommand => new AsyncCommand(Connect);
public ICommand GenerateNewKeyCommand => new AsyncCommand(ViewModel.SubmitNewKeyRequestAsync);
public ICommand CopyPCNameCommand => new RelayCommand(ViewModel.CopyMachineNameToClipboard);
public ICommand ReconnectCommand => new AsyncCommand(ViewModel.SubmitReconnectRequestAsync);
private void ShowConnectFields()
{
ViewModel.ConnectFieldsVisible = true;
}
private async Task Connect()
{
if (ConnectPCNameTextBox.Text.Length != 0 && ConnectSecurityKeyTextBox.Text.Length != 0)
{
string pcName = ConnectPCNameTextBox.Text;
string securityKey = ConnectSecurityKeyTextBox.Text.Trim();
await ViewModel.SubmitConnectionRequestAsync(pcName, securityKey);
ConnectPCNameTextBox.Text = string.Empty;
ConnectSecurityKeyTextBox.Text = string.Empty;
}
}
public void RefreshEnabledState()
{
ViewModel.RefreshEnabledState();
}
}
}