62 lines
2.1 KiB
C#
62 lines
2.1 KiB
C#
using System.Windows.Threading;
|
|
using CursorLang.Models;
|
|
using CursorLang.ViewModels;
|
|
using CursorLang.Views;
|
|
|
|
namespace CursorLang.Services;
|
|
|
|
/// <summary>
|
|
/// Настройки подсказки у курсора.
|
|
/// </summary>
|
|
public sealed class PopupOptions
|
|
{
|
|
/// <summary>Сколько подсказка держится на экране после последнего переключения.</summary>
|
|
public TimeSpan Duration { get; init; } = TimeSpan.FromMilliseconds(500);
|
|
|
|
/// <summary>Отступ от курсора в единицах WPF, чтобы подсказка не оказалась под ним.</summary>
|
|
public double CursorOffset { get; init; } = 16;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Управляет временем жизни подсказки: окно отвечает только за показ,
|
|
/// а решение «когда показать и когда убрать» принимается здесь.
|
|
/// </summary>
|
|
public sealed class LayoutPopupService : ILayoutPopupService, IDisposable
|
|
{
|
|
private readonly LayoutPopupWindow _window;
|
|
private readonly LayoutPopupViewModel _viewModel;
|
|
private readonly DispatcherTimer _hideTimer;
|
|
|
|
public LayoutPopupService(LayoutPopupWindow window, LayoutPopupViewModel viewModel, PopupOptions options)
|
|
{
|
|
_window = window;
|
|
_viewModel = viewModel;
|
|
|
|
_hideTimer = new DispatcherTimer { Interval = options.Duration };
|
|
_hideTimer.Tick += OnHideTimerTick;
|
|
}
|
|
|
|
public void Show(KeyboardLayout layout)
|
|
{
|
|
_viewModel.ShortName = layout.ShortName;
|
|
_window.ShowAtCursor();
|
|
|
|
// Перезапускаем таймер, чтобы быстрые переключения продлевали показ
|
|
_hideTimer.Stop();
|
|
_hideTimer.Start();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_hideTimer.Stop();
|
|
_hideTimer.Tick -= OnHideTimerTick;
|
|
_window.Close();
|
|
}
|
|
|
|
private void OnHideTimerTick(object? sender, EventArgs e)
|
|
{
|
|
_hideTimer.Stop();
|
|
_window.Hide();
|
|
}
|
|
}
|