using System.Text.Json.Serialization; using System.Windows.Media; using CommunityToolkit.Mvvm.ComponentModel; namespace CursorLang.Models; /// /// The application settings. Every change applies on the fly: the popup and the /// settings window are bound to these properties, and SettingsService saves /// them to disk. /// public sealed partial class AppSettings : ObservableObject { /// The interface language as a culture code: "ru", "en". [ObservableProperty] private string _language = "en"; /// The look of the settings window. [ObservableProperty] private AppTheme _theme = AppTheme.System; [ObservableProperty] private PopupPlacementMode _placementMode = PopupPlacementMode.AtCursor; // The side and the offset are stored per mode: the cursor and the caret call for // different settings, and switching the mode does not reset them [ObservableProperty] private AnchorSide _cursorSide = AnchorSide.BottomRight; /// The offset from the cursor in WPF units. [ObservableProperty] private double _cursorOffset = 16; [ObservableProperty] private AnchorSide _caretSide = AnchorSide.BottomRight; /// The offset from the caret in WPF units. [ObservableProperty] private double _caretOffset = 16; [ObservableProperty] private ScreenPosition _screenPosition = ScreenPosition.BottomRight; /// The offset from the monitor edge in WPF units. [ObservableProperty] private double _screenMargin = 24; [ObservableProperty] private double _fontSize = 20; /// The popup opacity: 1.0 is fully opaque. [ObservableProperty] private double _opacity = 0.9; /// How long the popup stays on screen, in milliseconds. [ObservableProperty] private double _durationMilliseconds = 500; /// /// Intercept Caps Lock and switch the layout with it instead of changing the case. /// Off by default: the application must not change the behaviour of the system /// until it is asked to. /// [ObservableProperty] private bool _useCapsLockHotkey; /// /// After how long a Caps Lock hold cancels the switch, in milliseconds. /// [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); }