using System.ComponentModel; using CursorLang.Models; namespace CursorLang.Services; /// /// Превращает нажатия Caps Lock в действия: короткое — переключает раскладку, /// длинное — только показывает подсказку. Он же включает и выключает перехват /// вслед за галочкой в настройках. /// public sealed class CapsLockSwitchCoordinator : IDisposable { private readonly ICapsLockHotkeyService _hotkeyService; private readonly IKeyboardLayoutService _layoutService; private readonly ILayoutPopupService _popupService; private readonly AppSettings _settings; public CapsLockSwitchCoordinator( ICapsLockHotkeyService hotkeyService, IKeyboardLayoutService layoutService, ILayoutPopupService popupService, AppSettings settings) { _hotkeyService = hotkeyService; _layoutService = layoutService; _popupService = popupService; _settings = settings; } public void Start() { _hotkeyService.Tapped += OnTapped; _hotkeyService.HoldStarted += OnHoldStarted; _hotkeyService.HoldEnded += OnHoldEnded; _settings.PropertyChanged += OnSettingsChanged; ApplySetting(); } public void Dispose() { _settings.PropertyChanged -= OnSettingsChanged; _hotkeyService.Tapped -= OnTapped; _hotkeyService.HoldStarted -= OnHoldStarted; _hotkeyService.HoldEnded -= OnHoldEnded; _hotkeyService.Stop(); } private void OnSettingsChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(AppSettings.UseCapsLockHotkey)) { ApplySetting(); } } private void ApplySetting() { if (_settings.UseCapsLockHotkey) { _hotkeyService.Start(); } else { _hotkeyService.Stop(); } } private void OnTapped(object? sender, EventArgs e) => _layoutService.SwitchToNext(); // Раскладку не меняем, но и молчать нельзя: без подсказки долгое нажатие // выглядит как то, что клавиша просто не сработала private void OnHoldStarted(object? sender, EventArgs e) => _popupService.ShowUntilHidden(_layoutService.Current); private void OnHoldEnded(object? sender, EventArgs e) => _popupService.Hide(); }