Доработан winui
This commit is contained in:
@@ -4,188 +4,78 @@ using Lattice.UI.Docking.Abstractions;
|
||||
using Lattice.UI.Docking.Factories;
|
||||
using Microsoft.UI.Xaml;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
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;
|
||||
private readonly Dictionary<Type, Func<object, IDockControl>> _creators;
|
||||
|
||||
/// <summary>
|
||||
/// Инициализирует новый экземпляр фабрики WinUI.
|
||||
/// </summary>
|
||||
/// <param name="theme">Тема оформления для применения к создаваемым контролам.</param>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// Выбрасывается, если <paramref name="theme"/> равен null.
|
||||
/// </exception>
|
||||
/// <remarks>
|
||||
/// Конструктор создает фабрику с заданной темой оформления. Все контролы,
|
||||
/// созданные этой фабрикой, будут автоматически применять указанную тему.
|
||||
/// </remarks>
|
||||
public WinUIDockControlFactory(IDockTheme theme)
|
||||
public WinUIDockControlFactory()
|
||||
{
|
||||
_theme = theme ?? throw new ArgumentNullException(nameof(theme));
|
||||
_creators = new Dictionary<Type, Func<object, IDockControl>>
|
||||
{
|
||||
[typeof(DockGroup)] = model => CreateGroupControl((DockGroup)model),
|
||||
[typeof(DockLeaf)] = model => CreateLeafControl((DockLeaf)model),
|
||||
[typeof(DockWindow)] = model => CreateFloatingWindowControl((DockWindow)model),
|
||||
[typeof(AutoHidePanel)] = model => CreateAutoHidePanelControl((AutoHidePanel)model),
|
||||
};
|
||||
}
|
||||
|
||||
/// <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)
|
||||
{
|
||||
if (group == null) throw new ArgumentNullException(nameof(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)
|
||||
{
|
||||
if (leaf == null) throw new ArgumentNullException(nameof(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();
|
||||
throw new NotImplementedException("Floating windows not implemented yet");
|
||||
}
|
||||
|
||||
/// <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();
|
||||
throw new NotImplementedException("Auto-hide panels not implemented yet");
|
||||
}
|
||||
|
||||
/// <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
|
||||
};
|
||||
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()
|
||||
public override IDockControl? CreateControlForElement(IDockElement element)
|
||||
{
|
||||
var host = new LatticeDockHost();
|
||||
ConfigureControl(host);
|
||||
host.ApplyTheme(_theme);
|
||||
return host;
|
||||
if (element == null) throw new ArgumentNullException(nameof(element));
|
||||
|
||||
var type = element.GetType();
|
||||
if (_creators.TryGetValue(type, out var creator))
|
||||
return creator(element);
|
||||
|
||||
return base.CreateControlForElement(element);
|
||||
}
|
||||
|
||||
/// <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;
|
||||
control.LayoutManager = Lattice.UI.Docking.LatticeUIFramework.LayoutManager;
|
||||
control.ContextManager = Lattice.UI.Docking.LatticeUIFramework.ContextManager;
|
||||
|
||||
if (control is FrameworkElement frameworkElement && model != null)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user