Доработан Docking

This commit is contained in:
2026-01-27 05:17:35 +03:00
parent 33abd94f6e
commit 584df249f6
99 changed files with 2270 additions and 12792 deletions

View File

@@ -5,57 +5,136 @@ using Lattice.UI.Docking.Abstractions;
namespace Lattice.UI.Docking.Factories;
/// <summary>
/// Базовая фабрика для создания UI-контролов док-системы.
/// Предоставляет базовую реализацию фабрики для создания UI-контролов док-системы.
/// </summary>
/// <remarks>
/// Этот класс реализует общую логику для фабрик контролов, включая настройку
/// общих свойств и создание контролов для произвольных элементов.
/// </remarks>
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);
/// <value>
/// Экземпляр <see cref="IDockContextManager"/> или null, если не установлен.
/// </value>
public IDockContextManager? ContextManager { get; set; }
/// <summary>
/// Создает контрол для произвольного элемента док-системы.
/// Создает контрол для группы разделения.
/// </summary>
/// <param name="group">Модель группы.</param>
/// <returns>
/// Созданный контрол группы.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="group"/> равен null.
/// </exception>
/// <remarks>
/// Этот метод должен быть реализован в производных классах.
/// </remarks>
public abstract IDockGroupControl CreateGroupControl(DockGroup group);
/// <summary>
/// Создает контрол для контейнера вкладок.
/// </summary>
/// <param name="leaf">Модель листа.</param>
/// <returns>
/// Созданный контрол листа.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="leaf"/> равен null.
/// </exception>
/// <remarks>
/// Этот метод должен быть реализован в производных классах.
/// </remarks>
public abstract IDockLeafControl CreateLeafControl(DockLeaf leaf);
/// <summary>
/// Создает контрол для плавающего окна.
/// </summary>
/// <param name="window">Модель окна.</param>
/// <returns>
/// Созданный контрол окна.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="window"/> равен null.
/// </exception>
/// <remarks>
/// Этот метод должен быть реализован в производных классах.
/// </remarks>
public abstract IFloatingWindowControl CreateFloatingWindowControl(DockWindow window);
/// <summary>
/// Создает контрол для автоскрываемой панели.
/// </summary>
/// <param name="panel">Модель панели.</param>
/// <returns>
/// Созданный контрол панели.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="panel"/> равен null.
/// </exception>
/// <remarks>
/// Этот метод должен быть реализован в производных классах.
/// </remarks>
public abstract IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel);
/// <summary>
/// Создает контрол для разделителя.
/// </summary>
/// <param name="orientation">Ориентация разделителя.</param>
/// <returns>
/// Созданный контрол разделителя.
/// </returns>
/// <remarks>
/// Этот метод должен быть реализован в производных классах.
/// </remarks>
public abstract IDockSplitterControl CreateSplitterControl(SplitDirection orientation);
/// <inheritdoc/>
public virtual IDockControl? CreateControlForElement(IDockElement element)
{
return element switch
if (element == null) throw new ArgumentNullException(nameof(element));
IDockControl? control = null;
switch (element)
{
DockGroup group => CreateGroupControl(group),
DockLeaf leaf => CreateLeafControl(leaf),
_ => null
};
case DockGroup group:
control = CreateGroupControl(group);
break;
case DockLeaf leaf:
control = CreateLeafControl(leaf);
break;
default:
control = null;
break;
}
if (control != null)
{
ConfigureControl(control);
}
return control;
}
/// <summary>
/// Настраивает общие свойства контрола.
/// </summary>
/// <param name="control">Контрол для настройки.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="control"/> равен null.
/// </exception>
/// <remarks>
/// Устанавливает общие свойства, такие как контекстный менеджер,
/// для всех создаваемых контролов.
/// </remarks>
protected virtual void ConfigureControl(IDockControl control)
{
if (DragDropService != null)
{
control.DragDropService = DragDropService;
}
if (control == null) throw new ArgumentNullException(nameof(control));
if (ContextManager != null)
{