Доработан 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

@@ -11,6 +11,17 @@ namespace Lattice.UI.Docking.WinUI.Factories;
/// Фабрика контролов для платформы WinUI.
/// Создает UI-элементы для отображения компонентов системы докинга.
/// </summary>
/// <remarks>
/// <para>
/// Фабрика реализует паттерн "Абстрактная фабрика", предоставляя единый интерфейс
/// для создания всех типов контролов док-системы. Это позволяет абстрагировать
/// конкретную UI-платформу (WinUI) от бизнес-логики системы.
/// </para>
/// <para>
/// Все создаваемые контролы автоматически настраиваются: устанавливаются связи
/// с менеджером макета, контекстным менеджером и применяется текущая тема оформления.
/// </para>
/// </remarks>
public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockControlFactory
{
private readonly IDockTheme _theme;
@@ -18,13 +29,33 @@ public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockContr
/// <summary>
/// Инициализирует новый экземпляр фабрики WinUI.
/// </summary>
/// <param name="theme">Тема оформления.</param>
/// <param name="theme">Тема оформления для применения к создаваемым контролам.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="theme"/> равен null.
/// </exception>
/// <remarks>
/// Конструктор создает фабрику с заданной темой оформления. Все контролы,
/// созданные этой фабрикой, будут автоматически применять указанную тему.
/// </remarks>
public WinUIDockControlFactory(IDockTheme theme)
{
_theme = theme ?? throw new ArgumentNullException(nameof(theme));
}
/// <inheritdoc/>
/// <summary>
/// Создает контрол для группы разделения.
/// </summary>
/// <param name="group">Модель группы разделения.</param>
/// <returns>
/// Созданный контрол группы.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="group"/> равен null.
/// </exception>
/// <remarks>
/// Создает экземпляр <see cref="LatticeDockGroup"/>, настраивает его связи
/// с моделью и другими сервисами, применяет текущую тему оформления.
/// </remarks>
public override IDockGroupControl CreateGroupControl(DockGroup group)
{
var control = new LatticeDockGroup();
@@ -33,7 +64,21 @@ public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockContr
return control;
}
/// <inheritdoc/>
/// <summary>
/// Создает контрол для контейнера вкладок.
/// </summary>
/// <param name="leaf">Модель контейнера вкладок.</param>
/// <returns>
/// Созданный контрол листа.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="leaf"/> равен null.
/// </exception>
/// <remarks>
/// Создает экземпляр <see cref="LatticeTabControl"/>, настраивает его связи
/// с моделью и другими сервисами, применяет текущую тему оформления.
/// Контрол поддерживает все положения панели вкладок и операции с вкладками.
/// </remarks>
public override IDockLeafControl CreateLeafControl(DockLeaf leaf)
{
var control = new LatticeTabControl();
@@ -42,21 +87,58 @@ public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockContr
return control;
}
/// <inheritdoc/>
/// <summary>
/// Создает контрол для плавающего окна.
/// </summary>
/// <param name="window">Модель плавающего окна.</param>
/// <returns>
/// Созданный контрол окна.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="window"/> равен null.
/// </exception>
/// <remarks>
/// В текущей реализации метод не реализован. Плавающие окна требуют
/// дополнительной интеграции с оконной системой платформы.
/// </remarks>
public override IFloatingWindowControl CreateFloatingWindowControl(DockWindow window)
{
// TODO: Реализовать создание плавающего окна
throw new NotImplementedException();
}
/// <inheritdoc/>
/// <summary>
/// Создает контрол для автоскрываемой панели.
/// </summary>
/// <param name="panel">Модель автоскрываемой панели.</param>
/// <returns>
/// Созданный контрол панели.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, если <paramref name="panel"/> равен null.
/// </exception>
/// <remarks>
/// В текущей реализации метод не реализован. Автоскрываемые панели требуют
/// сложной логики анимации и взаимодействия с краями окна.
/// </remarks>
public override IAutoHidePanelControl CreateAutoHidePanelControl(AutoHidePanel panel)
{
// TODO: Реализовать создание автоскрываемой панели
throw new NotImplementedException();
}
/// <inheritdoc/>
/// <summary>
/// Создает контрол для разделителя.
/// </summary>
/// <param name="orientation">Ориентация разделителя.</param>
/// <returns>
/// Созданный контрол разделителя.
/// </returns>
/// <remarks>
/// Создает экземпляр <see cref="LatticeSplitter"/>, настраивает его ориентацию
/// и применяет текущую тему оформления. Разделитель поддерживает перетаскивание
/// для изменения соотношения размеров между соседними областями.
/// </remarks>
public override IDockSplitterControl CreateSplitterControl(SplitDirection orientation)
{
var control = new LatticeSplitter
@@ -71,6 +153,14 @@ public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockContr
/// <summary>
/// Создает хост для размещения системы докинга.
/// </summary>
/// <returns>
/// Созданный док-хост.
/// </returns>
/// <remarks>
/// Создает корневой контейнер для всей системы докинга - экземпляр <see cref="LatticeDockHost"/>.
/// Хост управляет всем макетом приложения, включая основное дерево компоновки,
/// плавающие окна и автоскрываемые панели.
/// </remarks>
public IDockHost CreateDockHost()
{
var host = new LatticeDockHost();
@@ -79,13 +169,22 @@ public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockContr
return host;
}
/// <summary>
/// Настраивает созданный контрол.
/// </summary>
/// <param name="control">Контрол для настройки.</param>
/// <param name="model">Модель данных для контрола (опционально).</param>
/// <remarks>
/// Устанавливает основные связи контрола: модель данных, менеджер макета,
/// контекстный менеджер. Также настраивает привязку данных через DataContext.
/// Этот метод вызывается для всех создаваемых контролов.
/// </remarks>
private void ConfigureControl(IDockControl control, IDockElement? model = null)
{
if (control == null) return;
control.Model = model;
control.LayoutManager = LatticeUIFramework.LayoutManager;
control.DragDropService = LatticeUIFramework.DragDropService;
control.ContextManager = LatticeUIFramework.ContextManager;
if (control is FrameworkElement frameworkElement && model != null)