85 lines
3.4 KiB
C#
85 lines
3.4 KiB
C#
using System.Text.Json.Serialization;
|
|
using System.Windows.Media;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
namespace CursorLang.Models;
|
|
|
|
/// <summary>
|
|
/// Настройки приложения. Все изменения применяются на лету: подсказка и окно
|
|
/// настроек привязаны к этим свойствам, а <c>SettingsService</c> сохраняет их на диск.
|
|
/// </summary>
|
|
public sealed partial class AppSettings : ObservableObject
|
|
{
|
|
/// <summary>Язык интерфейса в виде кода культуры: «ru», «en».</summary>
|
|
[ObservableProperty]
|
|
private string _language = "en";
|
|
|
|
/// <summary>Оформление окна настроек.</summary>
|
|
[ObservableProperty]
|
|
private AppTheme _theme = AppTheme.System;
|
|
|
|
[ObservableProperty]
|
|
private PopupPlacementMode _placementMode = PopupPlacementMode.AtCursor;
|
|
|
|
// Сторона и отступ хранятся отдельно для каждого режима: у курсора и у
|
|
// каретки удобны разные настройки, и переключение режима их не сбрасывает
|
|
|
|
[ObservableProperty]
|
|
private AnchorSide _cursorSide = AnchorSide.BottomRight;
|
|
|
|
/// <summary>Отступ от курсора в единицах WPF.</summary>
|
|
[ObservableProperty]
|
|
private double _cursorOffset = 16;
|
|
|
|
[ObservableProperty]
|
|
private AnchorSide _caretSide = AnchorSide.BottomRight;
|
|
|
|
/// <summary>Отступ от каретки в единицах WPF.</summary>
|
|
[ObservableProperty]
|
|
private double _caretOffset = 16;
|
|
|
|
[ObservableProperty]
|
|
private ScreenPosition _screenPosition = ScreenPosition.BottomRight;
|
|
|
|
/// <summary>Отступ от края монитора в единицах WPF.</summary>
|
|
[ObservableProperty]
|
|
private double _screenMargin = 24;
|
|
|
|
[ObservableProperty]
|
|
private double _fontSize = 20;
|
|
|
|
/// <summary>Непрозрачность подсказки: 1.0 — полностью непрозрачная.</summary>
|
|
[ObservableProperty]
|
|
private double _opacity = 0.9;
|
|
|
|
/// <summary>Сколько подсказка держится на экране, в миллисекундах.</summary>
|
|
[ObservableProperty]
|
|
private double _durationMilliseconds = 500;
|
|
|
|
/// <summary>
|
|
/// Перехватывать Caps Lock и переключать по ней раскладку вместо смены регистра.
|
|
/// По умолчанию выключено: приложение не должно менять поведение системы,
|
|
/// пока его об этом не попросили.
|
|
/// </summary>
|
|
[ObservableProperty]
|
|
private bool _useCapsLockHotkey;
|
|
|
|
/// <summary>
|
|
/// С какого времени удержания Caps Lock переключение отменяется, в миллисекундах.
|
|
/// </summary>
|
|
[ObservableProperty]
|
|
private double _capsLockHoldMilliseconds = 300;
|
|
|
|
[ObservableProperty]
|
|
private Color _backgroundColor = Color.FromRgb(0x20, 0x20, 0x20);
|
|
|
|
[ObservableProperty]
|
|
private Color _foregroundColor = Color.FromRgb(0xFF, 0xFF, 0xFF);
|
|
|
|
[JsonIgnore]
|
|
public TimeSpan Duration => TimeSpan.FromMilliseconds(DurationMilliseconds);
|
|
|
|
[JsonIgnore]
|
|
public TimeSpan CapsLockHoldDelay => TimeSpan.FromMilliseconds(CapsLockHoldMilliseconds);
|
|
}
|