using System.ComponentModel; using System.Runtime.CompilerServices; namespace Lattice.Core.Docking.Models; /// /// Представляет автоскрываемую панель, которая может быть прикреплена к одной из сторон окна. /// Автоскрываемые панели скрываются, оставляя только заголовок, и появляются при наведении курсора. /// /// /// Автоскрываемые панели являются ключевым элементом интерфейса современных IDE, /// позволяя экономить пространство экрана при сохранении быстрого доступа к инструментам. /// public class AutoHidePanel : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); private bool _isVisible = false; private double _slideOffset = 0; /// /// Уникальный идентификатор автоскрываемой панели. /// public string Id { get; } = Guid.NewGuid().ToString(); /// /// Содержимое панели. /// public Abstractions.IDockContent Content { get; set; } /// /// Сторона окна, к которой прикреплена панель. /// public DockSide Side { get; set; } /// /// Ширина панели (для левой/правой сторон) или высота (для верхней/нижней сторон). /// public double Size { get; set; } = 300; /// /// Признак видимости панели. /// public bool IsVisible { get => _isVisible; set { if (_isVisible != value) { _isVisible = value; OnPropertyChanged(); } } } /// /// Смещение для анимации выезда/заезда панели (0-1). /// public double SlideOffset { get => _slideOffset; set { if (Math.Abs(_slideOffset - value) > 0.001) { _slideOffset = value; OnPropertyChanged(); } } } /// /// Заголовок панели (обычно берется из содержимого). /// public string Title => Content?.Title ?? "Auto-hide Panel"; /// /// Инициализирует новый экземпляр автоскрываемой панели. /// /// Содержимое панели. /// Сторона окна для прикрепления. public AutoHidePanel(Abstractions.IDockContent content, DockSide side) { Content = content ?? throw new ArgumentNullException(nameof(content)); Side = side; } /// /// Переключает видимость панели. /// public void Toggle() { IsVisible = !IsVisible; } /// /// Показывает панель. /// public void Show() { IsVisible = true; } /// /// Скрывает панель. /// public void Hide() { IsVisible = false; } }