Доработан Docking
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Lattice.Core.Docking.Models;
|
||||
using Lattice.Core.Docking.Abstractions;
|
||||
using Lattice.Core.Docking.Models;
|
||||
using Lattice.UI.Docking.Abstractions;
|
||||
|
||||
namespace Lattice.UI.Docking.Factories;
|
||||
@@ -6,96 +7,82 @@ namespace Lattice.UI.Docking.Factories;
|
||||
/// <summary>
|
||||
/// Определяет контракт для фабрики, создающей UI-контролы для элементов док-системы.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Фабрика обеспечивает абстракцию над созданием конкретных UI-контролов,
|
||||
/// что позволяет легко заменять реализации для разных платформ или тем оформления.
|
||||
/// </remarks>
|
||||
public interface IDockControlFactory
|
||||
{
|
||||
/// <summary>
|
||||
/// Создает контрол для группы разделения.
|
||||
/// </summary>
|
||||
/// <param name="group">Модель группы.</param>
|
||||
/// <returns>Созданный контрол группы.</returns>
|
||||
/// <returns>
|
||||
/// Созданный контрол группы.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="group"/> равен null.
|
||||
/// </exception>
|
||||
IDockGroupControl CreateGroupControl(DockGroup group);
|
||||
|
||||
/// <summary>
|
||||
/// Создает контрол для контейнера вкладок.
|
||||
/// </summary>
|
||||
/// <param name="leaf">Модель листа.</param>
|
||||
/// <returns>Созданный контрол листа.</returns>
|
||||
/// <returns>
|
||||
/// Созданный контрол листа.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="leaf"/> равен null.
|
||||
/// </exception>
|
||||
IDockLeafControl CreateLeafControl(DockLeaf leaf);
|
||||
|
||||
/// <summary>
|
||||
/// Создает контрол для плавающего окна.
|
||||
/// </summary>
|
||||
/// <param name="window">Модель окна.</param>
|
||||
/// <returns>Созданный контрол окна.</returns>
|
||||
/// <returns>
|
||||
/// Созданный контрол окна.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="window"/> равен null.
|
||||
/// </exception>
|
||||
IFloatingWindowControl CreateFloatingWindowControl(DockWindow window);
|
||||
|
||||
/// <summary>
|
||||
/// Создает контрол для автоскрываемой панели.
|
||||
/// </summary>
|
||||
/// <param name="panel">Модель панели.</param>
|
||||
/// <returns>Созданный контрол панели.</returns>
|
||||
/// <returns>
|
||||
/// Созданный контрол панели.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="panel"/> равен null.
|
||||
/// </exception>
|
||||
IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel);
|
||||
|
||||
/// <summary>
|
||||
/// Создает контрол для разделителя.
|
||||
/// </summary>
|
||||
/// <param name="orientation">Ориентация разделителя.</param>
|
||||
/// <returns>Созданный контрол разделителя.</returns>
|
||||
/// <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;
|
||||
}
|
||||
/// <param name="element">Элемент для создания контрола.</param>
|
||||
/// <returns>
|
||||
/// Созданный контрол или null, если тип элемента не поддерживается.
|
||||
/// </returns>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="element"/> равен null.
|
||||
/// </exception>
|
||||
/// <remarks>
|
||||
/// Метод использует сопоставление с шаблоном для определения типа элемента
|
||||
/// и вызова соответствующего метода создания.
|
||||
/// </remarks>
|
||||
IDockControl? CreateControlForElement(IDockElement element);
|
||||
}
|
||||
Reference in New Issue
Block a user