78 lines
2.5 KiB
C#
78 lines
2.5 KiB
C#
using System.ComponentModel;
|
|
using CursorLang.Models;
|
|
|
|
namespace CursorLang.Services;
|
|
|
|
/// <summary>
|
|
/// Превращает нажатия Caps Lock в действия: короткое — переключает раскладку,
|
|
/// длинное — только показывает подсказку. Он же включает и выключает перехват
|
|
/// вслед за галочкой в настройках.
|
|
/// </summary>
|
|
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();
|
|
}
|