using System.Windows.Threading; using CursorLang.Models; using CursorLang.ViewModels; using CursorLang.Views; namespace CursorLang.Services; /// /// Управляет временем жизни подсказки: окно отвечает только за показ, /// а решение «когда показать и когда убрать» принимается здесь. /// public sealed class LayoutPopupService : ILayoutPopupService, IDisposable { private readonly LayoutPopupWindow _window; private readonly LayoutPopupViewModel _viewModel; private readonly AppSettings _settings; private readonly DispatcherTimer _hideTimer = new(); public LayoutPopupService(LayoutPopupWindow window, LayoutPopupViewModel viewModel, AppSettings settings) { _window = window; _viewModel = viewModel; _settings = settings; _hideTimer.Tick += OnHideTimerTick; } public void Show(KeyboardLayout layout) { ShowUntilHidden(layout); // Длительность читаем при каждом показе: её меняют в настройках на лету. // Перезапуск таймера заодно продлевает показ при быстрых переключениях _hideTimer.Interval = _settings.Duration; _hideTimer.Start(); } public void ShowUntilHidden(KeyboardLayout layout) { _hideTimer.Stop(); _viewModel.ShortName = layout.ShortName; _window.ShowPopup(); } public void Hide() { _hideTimer.Stop(); _window.Hide(); } public void Dispose() { _hideTimer.Stop(); _hideTimer.Tick -= OnHideTimerTick; _window.Close(); } private void OnHideTimerTick(object? sender, EventArgs e) { _hideTimer.Stop(); _window.Hide(); } }