using System.Text.Json.Serialization; using System.Windows.Media; using CommunityToolkit.Mvvm.ComponentModel; namespace CursorLang.Models; /// /// Настройки приложения. Все изменения применяются на лету: подсказка и окно /// настроек привязаны к этим свойствам, а SettingsService сохраняет их на диск. /// public sealed partial class AppSettings : ObservableObject { /// Язык интерфейса в виде кода культуры: «ru», «en». [ObservableProperty] private string _language = "en"; /// Оформление окна настроек. [ObservableProperty] private AppTheme _theme = AppTheme.System; [ObservableProperty] private PopupPlacementMode _placementMode = PopupPlacementMode.AtCursor; // Сторона и отступ хранятся отдельно для каждого режима: у курсора и у // каретки удобны разные настройки, и переключение режима их не сбрасывает [ObservableProperty] private AnchorSide _cursorSide = AnchorSide.BottomRight; /// Отступ от курсора в единицах WPF. [ObservableProperty] private double _cursorOffset = 16; [ObservableProperty] private AnchorSide _caretSide = AnchorSide.BottomRight; /// Отступ от каретки в единицах WPF. [ObservableProperty] private double _caretOffset = 16; [ObservableProperty] private ScreenPosition _screenPosition = ScreenPosition.BottomRight; /// Отступ от края монитора в единицах WPF. [ObservableProperty] private double _screenMargin = 24; [ObservableProperty] private double _fontSize = 20; /// Непрозрачность подсказки: 1.0 — полностью непрозрачная. [ObservableProperty] private double _opacity = 0.9; /// Сколько подсказка держится на экране, в миллисекундах. [ObservableProperty] private double _durationMilliseconds = 500; /// /// Перехватывать Caps Lock и переключать по ней раскладку вместо смены регистра. /// По умолчанию выключено: приложение не должно менять поведение системы, /// пока его об этом не попросили. /// [ObservableProperty] private bool _useCapsLockHotkey; /// /// С какого времени удержания Caps Lock переключение отменяется, в миллисекундах. /// [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); }