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);
}