Files
Lattice/Lattice.UI.Docking.WinUI/DockBuilder.cs
2026-02-01 09:26:13 +03:00

189 lines
7.1 KiB
C#
Raw Permalink 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.Engine;
using Lattice.Core.Docking.Services;
using Lattice.UI.Docking.Abstractions;
using Lattice.UI.Docking.Factories;
using Lattice.UI.Docking.WinUI.Factories;
using Lattice.UI.Docking.WinUI.Services;
using System;
namespace Lattice.UI.Docking;
/// <summary>
/// Предоставляет упрощенный статический API для инициализации и конфигурации системы докинга Lattice.
/// </summary>
public static class LatticeDock
{
/// <summary>
/// Создает новый строитель конфигурации системы докинга для WinUI.
/// </summary>
/// <returns>Экземпляр <see cref="DockBuilder"/> для настройки системы.</returns>
public static DockBuilder CreateWinUIBuilder()
{
return new DockBuilder()
.WithWinUIFactory()
.WithWinUIContextManager()
.WithWinUIService();
}
/// <summary>
/// Настраивает строитель для использования фабрики WinUI.
/// </summary>
public static DockBuilder WithWinUIFactory(this DockBuilder builder)
{
return builder.WithControlFactory(new WinUIDockControlFactory());
}
/// <summary>
/// Настраивает строитель для использования контекстного менеджера WinUI.
/// </summary>
public static DockBuilder WithWinUIContextManager(this DockBuilder builder)
{
return builder.WithContextManager(new WinUIDockContextManager());
}
/// <summary>
/// Настраивает строитель для использования UI-сервиса WinUI.
/// </summary>
public static DockBuilder WithWinUIService(this DockBuilder builder)
{
return builder.WithUIService(new WinUIDockUIService());
}
}
/// <summary>
/// Предоставляет fluent-интерфейс для конфигурации системы докинга Lattice.
/// </summary>
public sealed class DockBuilder
{
private readonly LayoutManager _layoutManager;
private readonly ContentRegistry _contentRegistry;
private IDockControlFactory? _factory;
private IDockContextManager? _contextManager;
private IDockUIService? _uiService;
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="DockBuilder"/>.
/// Создает менеджер макета и реестр контента по умолчанию.
/// </summary>
public DockBuilder()
{
_layoutManager = new LayoutManager();
_contentRegistry = new ContentRegistry();
_layoutManager.ContentRegistry = _contentRegistry;
}
/// <summary>
/// Регистрирует фабрику контролов для создания UI-элементов.
/// </summary>
/// <param name="factory">Фабрика контролов.</param>
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
public DockBuilder WithControlFactory(IDockControlFactory factory)
{
_factory = factory;
return this;
}
/// <summary>
/// Регистрирует менеджер контекстных меню.
/// </summary>
/// <param name="contextManager">Менеджер контекстных меню.</param>
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
public DockBuilder WithContextManager(IDockContextManager contextManager)
{
_contextManager = contextManager;
return this;
}
/// <summary>
/// Регистрирует UI-сервис для выполнения платформенно-зависимых операций.
/// </summary>
/// <param name="uiService">UI-сервис.</param>
/// <returns>Текущий экземпляр <see cref="DockBuilder"/> для цепочки вызовов.</returns>
public DockBuilder WithUIService(IDockUIService uiService)
{
_uiService = uiService;
return this;
}
/// <summary>
/// Регистрирует тип контента в реестре.
/// </summary>
public DockBuilder RegisterContentType<T>(string contentTypeId, Func<T> factory, ContentMetadata? metadata = null)
where T : Core.Docking.Abstractions.IDockContent
{
_contentRegistry.Register(contentTypeId, factory, metadata);
return this;
}
/// <summary>
/// Завершает конфигурацию системы докинга и возвращает настроенный экземпляр <see cref="IDockSystem"/>.
/// </summary>
/// <returns>Настроенная система докинга.</returns>
public IDockSystem Build()
{
// Настраиваем связи между компонентами
if (_factory is DockControlFactoryBase factoryBase && _contextManager != null)
{
factoryBase.ContextManager = _contextManager;
}
return new DockSystem(_layoutManager, _contentRegistry, _factory, _contextManager, _uiService);
}
}
/// <summary>
/// Представляет настроенную систему докинга с доступом ко всем основным компонентам.
/// </summary>
public interface IDockSystem
{
/// <summary>
/// Получает менеджер макета.
/// </summary>
LayoutManager LayoutManager { get; }
/// <summary>
/// Получает реестр контента.
/// </summary>
ContentRegistry ContentRegistry { get; }
/// <summary>
/// Получает фабрику контролов.
/// </summary>
IDockControlFactory? ControlFactory { get; }
/// <summary>
/// Получает менеджер контекстных меню.
/// </summary>
IDockContextManager? ContextManager { get; }
/// <summary>
/// Получает UI-сервис.
/// </summary>
IDockUIService? UIService { get; }
}
/// <summary>
/// Реализация интерфейса <see cref="IDockSystem"/>.
/// </summary>
internal sealed class DockSystem : IDockSystem
{
public LayoutManager LayoutManager { get; }
public ContentRegistry ContentRegistry { get; }
public IDockControlFactory? ControlFactory { get; }
public IDockContextManager? ContextManager { get; }
public IDockUIService? UIService { get; }
public DockSystem(
LayoutManager layoutManager,
ContentRegistry contentRegistry,
IDockControlFactory? controlFactory,
IDockContextManager? contextManager,
IDockUIService? uiService)
{
LayoutManager = layoutManager ?? throw new ArgumentNullException(nameof(layoutManager));
ContentRegistry = contentRegistry ?? throw new ArgumentNullException(nameof(contentRegistry));
ControlFactory = controlFactory;
ContextManager = contextManager;
UIService = uiService;
}
}