2023-10-11 15:58:19 +01:00
|
|
|
|
// 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;
|
|
|
|
|
|
using System.IO.Abstractions;
|
|
|
|
|
|
using System.Threading;
|
2024-09-16 16:09:43 -04:00
|
|
|
|
|
2023-10-11 15:58:19 +01:00
|
|
|
|
using ManagedCommon;
|
|
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Library;
|
|
|
|
|
|
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
|
2024-11-26 15:37:59 +00:00
|
|
|
|
using MouseJump.Common.Helpers;
|
|
|
|
|
|
using MouseJump.Common.Models.Drawing;
|
|
|
|
|
|
using MouseJump.Common.Models.Settings;
|
|
|
|
|
|
using MouseJump.Common.Models.Styles;
|
2023-10-11 15:58:19 +01:00
|
|
|
|
|
|
|
|
|
|
namespace MouseJumpUI.Helpers;
|
|
|
|
|
|
|
2024-10-21 17:38:07 +01:00
|
|
|
|
internal sealed class SettingsHelper
|
2023-10-11 15:58:19 +01:00
|
|
|
|
{
|
|
|
|
|
|
public SettingsHelper()
|
|
|
|
|
|
{
|
|
|
|
|
|
this.LockObject = new();
|
|
|
|
|
|
this.CurrentSettings = this.LoadSettings();
|
|
|
|
|
|
|
|
|
|
|
|
// delay loading settings on change by some time to avoid file in use exception
|
|
|
|
|
|
var throttledActionInvoker = new ThrottledActionInvoker();
|
|
|
|
|
|
this.FileSystemWatcher = Helper.GetFileWatcher(
|
|
|
|
|
|
moduleName: MouseJumpSettings.ModuleName,
|
|
|
|
|
|
fileName: "settings.json",
|
|
|
|
|
|
onChangedCallback: () => throttledActionInvoker.ScheduleAction(this.ReloadSettings, 250));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private IFileSystemWatcher FileSystemWatcher
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private object LockObject
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public MouseJumpSettings CurrentSettings
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
private set;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private MouseJumpSettings LoadSettings()
|
|
|
|
|
|
{
|
|
|
|
|
|
lock (this.LockObject)
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
2025-12-08 04:55:51 +01:00
|
|
|
|
var settingsUtils = SettingsUtils.Default;
|
2023-10-11 15:58:19 +01:00
|
|
|
|
|
|
|
|
|
|
// set this to 1 to disable retries
|
|
|
|
|
|
var remainingRetries = 5;
|
|
|
|
|
|
|
|
|
|
|
|
while (remainingRetries > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!settingsUtils.SettingsExists(MouseJumpSettings.ModuleName))
|
|
|
|
|
|
{
|
|
|
|
|
|
Logger.LogInfo("MouseJump settings.json was missing, creating a new one");
|
|
|
|
|
|
var defaultSettings = new MouseJumpSettings();
|
|
|
|
|
|
defaultSettings.Save(settingsUtils);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var settings = settingsUtils.GetSettingsOrDefault<MouseJumpSettings>(MouseJumpSettings.ModuleName);
|
|
|
|
|
|
return settings;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (IOException ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Logger.LogError("Failed to read changed settings", ex);
|
|
|
|
|
|
Thread.Sleep(250);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Logger.LogError("Failed to read changed settings", ex);
|
|
|
|
|
|
Thread.Sleep(250);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
remainingRetries--;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const string message = "Failed to read changed settings - ran out of retries";
|
|
|
|
|
|
Logger.LogError(message);
|
|
|
|
|
|
throw new InvalidOperationException(message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReloadSettings()
|
|
|
|
|
|
{
|
|
|
|
|
|
this.CurrentSettings = this.LoadSettings();
|
|
|
|
|
|
}
|
2024-11-26 15:37:59 +00:00
|
|
|
|
|
|
|
|
|
|
public static PreviewStyle GetActivePreviewStyle(MouseJumpSettings settings)
|
|
|
|
|
|
{
|
|
|
|
|
|
var previewType = Enum.TryParse<PreviewType>(settings.Properties.PreviewType, true, out var previewTypeResult)
|
|
|
|
|
|
? previewTypeResult
|
|
|
|
|
|
: PreviewType.Bezelled;
|
|
|
|
|
|
|
|
|
|
|
|
var canvasSize = new SizeInfo(
|
|
|
|
|
|
settings.Properties.ThumbnailSize.Width,
|
|
|
|
|
|
settings.Properties.ThumbnailSize.Height);
|
|
|
|
|
|
|
|
|
|
|
|
var properties = settings.Properties;
|
|
|
|
|
|
|
|
|
|
|
|
var previewStyle = previewType switch
|
|
|
|
|
|
{
|
|
|
|
|
|
PreviewType.Compact => StyleHelper.CompactPreviewStyle.WithCanvasSize(canvasSize),
|
|
|
|
|
|
PreviewType.Bezelled => StyleHelper.BezelledPreviewStyle.WithCanvasSize(canvasSize),
|
|
|
|
|
|
PreviewType.Custom => new PreviewStyle(
|
|
|
|
|
|
canvasSize: canvasSize,
|
|
|
|
|
|
canvasStyle: new(
|
|
|
|
|
|
marginStyle: new(0),
|
|
|
|
|
|
borderStyle: new(
|
|
|
|
|
|
color: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.BorderColor),
|
|
|
|
|
|
all: properties.BorderThickness,
|
|
|
|
|
|
depth: properties.Border3dDepth
|
|
|
|
|
|
),
|
|
|
|
|
|
paddingStyle: new(
|
|
|
|
|
|
all: properties.BorderPadding
|
|
|
|
|
|
),
|
|
|
|
|
|
backgroundStyle: new(
|
|
|
|
|
|
color1: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.BackgroundColor1),
|
|
|
|
|
|
color2: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.BackgroundColor2)
|
|
|
|
|
|
)
|
|
|
|
|
|
),
|
|
|
|
|
|
screenStyle: new(
|
|
|
|
|
|
marginStyle: new(
|
|
|
|
|
|
all: properties.ScreenMargin
|
|
|
|
|
|
),
|
|
|
|
|
|
borderStyle: new(
|
|
|
|
|
|
color: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.BezelColor),
|
|
|
|
|
|
all: properties.BezelThickness,
|
|
|
|
|
|
depth: properties.Bezel3dDepth
|
|
|
|
|
|
),
|
|
|
|
|
|
paddingStyle: new(0),
|
|
|
|
|
|
backgroundStyle: new(
|
|
|
|
|
|
color1: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.ScreenColor1),
|
|
|
|
|
|
color2: ConfigHelper.DeserializeFromConfigColorString(
|
|
|
|
|
|
properties.ScreenColor2)
|
|
|
|
|
|
)
|
|
|
|
|
|
)),
|
|
|
|
|
|
_ => throw new InvalidOperationException(
|
|
|
|
|
|
$"Unhandled {nameof(PreviewType)} '{previewType}'"),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return previewStyle;
|
|
|
|
|
|
}
|
2023-10-11 15:58:19 +01:00
|
|
|
|
}
|