moved to MVVM architecture

This commit is contained in:
2026-08-08 21:24:02 +05:00
parent a1ff8cc923
commit 3d614255d8
19 changed files with 565 additions and 346 deletions
+61
View File
@@ -0,0 +1,61 @@
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();
}
}