115 lines
3.7 KiB
C#
115 lines
3.7 KiB
C#
using System.ComponentModel;
|
|
using System.Runtime.CompilerServices;
|
|
|
|
namespace Lattice.Core.Docking.Models;
|
|
|
|
/// <summary>
|
|
/// Представляет автоскрываемую панель, которая может быть прикреплена к одной из сторон окна.
|
|
/// Автоскрываемые панели скрываются, оставляя только заголовок, и появляются при наведении курсора.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Автоскрываемые панели являются ключевым элементом интерфейса современных IDE,
|
|
/// позволяя экономить пространство экрана при сохранении быстрого доступа к инструментам.
|
|
/// </remarks>
|
|
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;
|
|
|
|
/// <summary>
|
|
/// Уникальный идентификатор автоскрываемой панели.
|
|
/// </summary>
|
|
public string Id { get; } = Guid.NewGuid().ToString();
|
|
|
|
/// <summary>
|
|
/// Содержимое панели.
|
|
/// </summary>
|
|
public Abstractions.IDockContent Content { get; set; }
|
|
|
|
/// <summary>
|
|
/// Сторона окна, к которой прикреплена панель.
|
|
/// </summary>
|
|
public DockSide Side { get; set; }
|
|
|
|
/// <summary>
|
|
/// Ширина панели (для левой/правой сторон) или высота (для верхней/нижней сторон).
|
|
/// </summary>
|
|
public double Size { get; set; } = 300;
|
|
|
|
/// <summary>
|
|
/// Признак видимости панели.
|
|
/// </summary>
|
|
public bool IsVisible
|
|
{
|
|
get => _isVisible;
|
|
set
|
|
{
|
|
if (_isVisible != value)
|
|
{
|
|
_isVisible = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Смещение для анимации выезда/заезда панели (0-1).
|
|
/// </summary>
|
|
public double SlideOffset
|
|
{
|
|
get => _slideOffset;
|
|
set
|
|
{
|
|
if (Math.Abs(_slideOffset - value) > 0.001)
|
|
{
|
|
_slideOffset = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Заголовок панели (обычно берется из содержимого).
|
|
/// </summary>
|
|
public string Title => Content?.Title ?? "Auto-hide Panel";
|
|
|
|
/// <summary>
|
|
/// Инициализирует новый экземпляр автоскрываемой панели.
|
|
/// </summary>
|
|
/// <param name="content">Содержимое панели.</param>
|
|
/// <param name="side">Сторона окна для прикрепления.</param>
|
|
public AutoHidePanel(Abstractions.IDockContent content, DockSide side)
|
|
{
|
|
Content = content ?? throw new ArgumentNullException(nameof(content));
|
|
Side = side;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Переключает видимость панели.
|
|
/// </summary>
|
|
public void Toggle()
|
|
{
|
|
IsVisible = !IsVisible;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Показывает панель.
|
|
/// </summary>
|
|
public void Show()
|
|
{
|
|
IsVisible = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Скрывает панель.
|
|
/// </summary>
|
|
public void Hide()
|
|
{
|
|
IsVisible = false;
|
|
}
|
|
}
|