DragAndDrop core

This commit is contained in:
FrigaT
2026-01-18 16:33:35 +03:00
parent 9ea82af329
commit 79bdd8bc62
229 changed files with 21214 additions and 2494 deletions

View File

@@ -0,0 +1,65 @@
using Lattice.Core.Docking.Abstractions;
using Lattice.Core.Docking.Models;
using Lattice.UI.Docking.Abstractions;
namespace Lattice.UI.Docking.Factories;
/// <summary>
/// Базовая фабрика для создания UI-контролов док-системы.
/// </summary>
public abstract class DockControlFactoryBase : IDockControlFactory
{
/// <summary>
/// Получает или задает сервис перетаскивания для создаваемых контролов.
/// </summary>
public Services.IDockDragDropService? DragDropService { get; set; }
/// <summary>
/// Получает или задает менеджер контекста для создаваемых контролов.
/// </summary>
public Services.IDockContextManager? ContextManager { get; set; }
/// <inheritdoc/>
public abstract IDockGroupControl CreateGroupControl(DockGroup group);
/// <inheritdoc/>
public abstract IDockLeafControl CreateLeafControl(DockLeaf leaf);
/// <inheritdoc/>
public abstract IFloatingWindowControl CreateFloatingWindowControl(DockWindow window);
/// <inheritdoc/>
public abstract IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel);
/// <inheritdoc/>
public abstract IDockSplitterControl CreateSplitterControl(SplitDirection orientation);
/// <summary>
/// Создает контрол для произвольного элемента док-системы.
/// </summary>
public virtual IDockControl? CreateControlForElement(IDockElement element)
{
return element switch
{
DockGroup group => CreateGroupControl(group),
DockLeaf leaf => CreateLeafControl(leaf),
_ => null
};
}
/// <summary>
/// Настраивает общие свойства контрола.
/// </summary>
protected virtual void ConfigureControl(IDockControl control)
{
if (DragDropService != null)
{
control.DragDropService = DragDropService;
}
if (ContextManager != null)
{
control.ContextManager = ContextManager;
}
}
}

View File

@@ -0,0 +1,101 @@
using Lattice.Core.Docking.Models;
using Lattice.UI.Docking.Abstractions;
namespace Lattice.UI.Docking.Factories;
/// <summary>
/// Определяет контракт для фабрики, создающей UI-контролы для элементов док-системы.
/// </summary>
public interface IDockControlFactory
{
/// <summary>
/// Создает контрол для группы разделения.
/// </summary>
/// <param name="group">Модель группы.</param>
/// <returns>Созданный контрол группы.</returns>
IDockGroupControl CreateGroupControl(DockGroup group);
/// <summary>
/// Создает контрол для контейнера вкладок.
/// </summary>
/// <param name="leaf">Модель листа.</param>
/// <returns>Созданный контрол листа.</returns>
IDockLeafControl CreateLeafControl(DockLeaf leaf);
/// <summary>
/// Создает контрол для плавающего окна.
/// </summary>
/// <param name="window">Модель окна.</param>
/// <returns>Созданный контрол окна.</returns>
IFloatingWindowControl CreateFloatingWindowControl(DockWindow window);
/// <summary>
/// Создает контрол для автоскрываемой панели.
/// </summary>
/// <param name="panel">Модель панели.</param>
/// <returns>Созданный контрол панели.</returns>
IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel);
/// <summary>
/// Создает контрол для разделителя.
/// </summary>
/// <param name="orientation">Ориентация разделителя.</param>
/// <returns>Созданный контрол разделителя.</returns>
IDockSplitterControl CreateSplitterControl(SplitDirection orientation);
}
/// <summary>
/// Определяет контракт для контрола разделителя.
/// </summary>
public interface IDockSplitterControl : IDockControl
{
/// <summary>
/// Получает или задает ориентацию разделителя.
/// </summary>
SplitDirection Orientation { get; set; }
/// <summary>
/// Получает или задает признак того, что разделитель активен.
/// </summary>
bool IsActive { get; set; }
/// <summary>
/// Событие, возникающее при начале перетаскивания разделителя.
/// </summary>
event EventHandler DragStarted;
/// <summary>
/// Событие, возникающее при перетаскивании разделителя.
/// </summary>
event EventHandler<SplitterDraggedEventArgs> DragDelta;
/// <summary>
/// Событие, возникающее при завершении перетаскивания разделителя.
/// </summary>
event EventHandler DragCompleted;
}
/// <summary>
/// Аргументы события перетаскивания разделителя.
/// </summary>
public class SplitterDraggedEventArgs : EventArgs
{
/// <summary>
/// Изменение по горизонтали.
/// </summary>
public double HorizontalChange { get; }
/// <summary>
/// Изменение по вертикали.
/// </summary>
public double VerticalChange { get; }
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="SplitterDraggedEventArgs"/>.
/// </summary>
public SplitterDraggedEventArgs(double horizontalChange, double verticalChange)
{
HorizontalChange = horizontalChange;
VerticalChange = verticalChange;
}
}