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