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));
}
}