Files
Lattice/Lattice.UI.Docking.WinUI/Factories/WinUIDockControlFactory.cs
2026-01-27 06:07:15 +03:00

195 lines
9.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}