DragAndDrop core
This commit is contained in:
114
Lattice.Core.Docking/Models/AutoHidePanel.cs
Normal file
114
Lattice.Core.Docking/Models/AutoHidePanel.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user