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