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