195 lines
9.1 KiB
C#
195 lines
9.1 KiB
C#
using Lattice.Core.Docking.Abstractions;
|
||
using Lattice.Core.Docking.Models;
|
||
using Lattice.UI.Docking.Abstractions;
|
||
using Lattice.UI.Docking.Factories;
|
||
using Microsoft.UI.Xaml;
|
||
using System;
|
||
|
||
namespace Lattice.UI.Docking.WinUI.Factories;
|
||
|
||
/// <summary>
|
||
/// Фабрика контролов для платформы WinUI.
|
||
/// Создает UI-элементы для отображения компонентов системы докинга.
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// <para>
|
||
/// Фабрика реализует паттерн "Абстрактная фабрика", предоставляя единый интерфейс
|
||
/// для создания всех типов контролов док-системы. Это позволяет абстрагировать
|
||
/// конкретную UI-платформу (WinUI) от бизнес-логики системы.
|
||
/// </para>
|
||
/// <para>
|
||
/// Все создаваемые контролы автоматически настраиваются: устанавливаются связи
|
||
/// с менеджером макета, контекстным менеджером и применяется текущая тема оформления.
|
||
/// </para>
|
||
/// </remarks>
|
||
public sealed class WinUIDockControlFactory : DockControlFactoryBase, IDockControlFactory
|
||
{
|
||
private readonly IDockTheme _theme;
|
||
|
||
/// <summary>
|
||
/// Инициализирует новый экземпляр фабрики WinUI.
|
||
/// </summary>
|
||
/// <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));
|
||
}
|
||
|
||
/// <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();
|
||
ConfigureControl(control, group);
|
||
control.ApplyTheme(_theme);
|
||
return control;
|
||
}
|
||
|
||
/// <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();
|
||
ConfigureControl(control, leaf);
|
||
control.ApplyTheme(_theme);
|
||
return control;
|
||
}
|
||
|
||
/// <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();
|
||
}
|
||
|
||
/// <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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Создает контрол для разделителя.
|
||
/// </summary>
|
||
/// <param name="orientation">Ориентация разделителя.</param>
|
||
/// <returns>
|
||
/// Созданный контрол разделителя.
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// Создает экземпляр <see cref="LatticeSplitter"/>, настраивает его ориентацию
|
||
/// и применяет текущую тему оформления. Разделитель поддерживает перетаскивание
|
||
/// для изменения соотношения размеров между соседними областями.
|
||
/// </remarks>
|
||
public override IDockSplitterControl CreateSplitterControl(SplitDirection orientation)
|
||
{
|
||
var control = new LatticeSplitter
|
||
{
|
||
Orientation = orientation
|
||
};
|
||
ConfigureControl(control);
|
||
control.ApplyTheme(_theme);
|
||
return control;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Создает хост для размещения системы докинга.
|
||
/// </summary>
|
||
/// <returns>
|
||
/// Созданный док-хост.
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// Создает корневой контейнер для всей системы докинга - экземпляр <see cref="LatticeDockHost"/>.
|
||
/// Хост управляет всем макетом приложения, включая основное дерево компоновки,
|
||
/// плавающие окна и автоскрываемые панели.
|
||
/// </remarks>
|
||
public IDockHost CreateDockHost()
|
||
{
|
||
var host = new LatticeDockHost();
|
||
ConfigureControl(host);
|
||
host.ApplyTheme(_theme);
|
||
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.ContextManager = LatticeUIFramework.ContextManager;
|
||
|
||
if (control is FrameworkElement frameworkElement && model != null)
|
||
{
|
||
frameworkElement.DataContext = model;
|
||
}
|
||
}
|
||
} |