Доработан проект UI под новый Core

This commit is contained in:
2026-01-25 02:52:07 +03:00
parent be12154262
commit 2bd7d3c474
7 changed files with 923 additions and 181 deletions

View File

@@ -1,52 +1,194 @@
using Lattice.UI.DragDrop.Abstractions;
using Lattice.Core.DragDrop.Services;
using Lattice.UI.DragDrop.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Lattice.UI.DragDrop.Extensions;
/// <summary>
/// Методы расширения для регистрации сервисов перетаскивания.
/// Методы расширения для регистрации сервисов перетаскивания в контейнере зависимостей.
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Добавляет сервисы перетаскивания.
/// Добавляет сервисы перетаскивания в контейнер зависимостей.
/// </summary>
/// <param name="services">Коллекция сервисов для регистрации.</param>
/// <returns>Коллекция сервисов с зарегистрированными сервисами перетаскивания.</returns>
/// <remarks>
/// <para>
/// Этот метод регистрирует основные сервисы перетаскивания, необходимые для работы системы:
/// </para>
/// <list type="bullet">
/// <item>Основной сервис управления перетаскиванием (<see cref="IDragDropService"/>)</item>
/// <item>Абстракции для визуального представления и обратной связи</item>
/// <item>Провайдеры по умолчанию с безопасной реализацией</item>
/// </list>
/// <para>
/// Для полноценной работы в конкретной UI-платформе (WPF, Avalonia, MAUI и т.д.)
/// необходимо переопределить регистрации платформенными реализациями.
/// </para>
/// </remarks>
public static IServiceCollection AddLatticeDragDrop(this IServiceCollection services)
{
// Регистрируем абстракции, которые будут реализованы в платформенных проектах
services.AddSingleton(typeof(IDragVisualProvider), typeof(DefaultDragVisualProvider));
services.AddSingleton(typeof(IDropVisualAdorner), typeof(DefaultDropVisualAdorner));
services.AddSingleton(typeof(IDragDropHost), typeof(DefaultDragDropHost));
// Регистрация основного сервиса перетаскивания
services.TryAddSingleton<IDragDropService, DragDropService>();
// Регистрация UI-специфичных абстракций с реализациями по умолчанию
// Эти реализации безопасны (ничего не делают), но могут быть переопределены платформенными реализациями
services.TryAddSingleton<IDragVisualProvider, DefaultDragVisualProvider>();
services.TryAddSingleton<IDropVisualAdorner, DefaultDropVisualAdorner>();
services.TryAddSingleton<IDragDropHost, DefaultDragDropHost>();
return services;
}
/// <summary>
/// Реализация по умолчанию для платформ, которые еще не имеют своей реализации.
/// Добавляет или заменяет реализацию поставщика визуального представления перетаскивания.
/// </summary>
/// <typeparam name="TProvider">Тип поставщика визуального представления.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации поставщика визуального представления.
/// </remarks>
public static IServiceCollection AddDragVisualProvider<TProvider>(this IServiceCollection services)
where TProvider : class, IDragVisualProvider
{
services.Replace(ServiceDescriptor.Singleton<IDragVisualProvider, TProvider>());
return services;
}
/// <summary>
/// Добавляет или заменяет реализацию визуальной обратной связи для цели сброса.
/// </summary>
/// <typeparam name="TAdorner">Тип элемента визуальной обратной связи.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации визуальной обратной связи.
/// </remarks>
public static IServiceCollection AddDropVisualAdorner<TAdorner>(this IServiceCollection services)
where TAdorner : class, IDropVisualAdorner
{
services.Replace(ServiceDescriptor.Singleton<IDropVisualAdorner, TAdorner>());
return services;
}
/// <summary>
/// Добавляет или заменяет реализацию хоста для отображения визуальных элементов.
/// </summary>
/// <typeparam name="THost">Тип хоста визуальных элементов.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации хоста визуальных элементов.
/// </remarks>
public static IServiceCollection AddDragDropHost<THost>(this IServiceCollection services)
where THost : class, IDragDropHost
{
services.Replace(ServiceDescriptor.Singleton<IDragDropHost, THost>());
return services;
}
#region Default Implementations
/// <summary>
/// Безопасная реализация поставщика визуального представления по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDragVisualProvider : IDragVisualProvider
{
public object CreateDragVisual(Core.DragDrop.Models.DragInfo dragInfo, Core.Geometry.Point initialPosition)
=> new object();
/// <inheritdoc/>
public object? CreateDragVisual(Core.DragDrop.Models.DragInfo dragInfo, Core.Geometry.Point initialPosition)
{
// Безопасная реализация: не создает визуальное представление
return null;
}
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position) { }
/// <inheritdoc/>
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальное представление не было создано
}
public void ReleaseDragVisual(object dragVisual) { }
/// <inheritdoc/>
public void ReleaseDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальное представление не было создано
}
}
/// <summary>
/// Безопасная реализация визуальной обратной связи по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDropVisualAdorner : IDropVisualAdorner
{
public void Show(Core.DragDrop.Models.DropInfo dropInfo, Core.Geometry.Rect targetBounds) { }
public void Update(Core.DragDrop.Models.DropInfo dropInfo) { }
public void Hide() { }
/// <inheritdoc/>
public void Show(Core.DragDrop.Models.DropInfo dropInfo, Core.Geometry.Rect targetBounds)
{
// Безопасная реализация: не отображает визуальную обратную связь
}
/// <inheritdoc/>
public void Update(Core.DragDrop.Models.DropInfo dropInfo)
{
// Ничего не делаем, так как обратная связь не отображается
}
/// <inheritdoc/>
public void Hide()
{
// Ничего не делаем, так как обратная связь не отображается
}
}
/// <summary>
/// Безопасная реализация хоста визуальных элементов по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDragDropHost : IDragDropHost
{
public void ShowDragVisual(object dragVisual, Core.Geometry.Point position) { }
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position) { }
public void HideDragVisual(object dragVisual) { }
public void ShowDropAdorner(IDropVisualAdorner adorner) { }
public void HideDropAdorner(IDropVisualAdorner adorner) { }
/// <inheritdoc/>
public void ShowDragVisual(object dragVisual, Core.Geometry.Point position)
{
// Безопасная реализация: не отображает визуальный элемент
}
/// <inheritdoc/>
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальный элемент не отображается
}
/// <inheritdoc/>
public void HideDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальный элемент не отображается
}
/// <inheritdoc/>
public void ShowDropAdorner(IDropVisualAdorner adorner)
{
// Безопасная реализация: не отображает обратную связь
}
/// <inheritdoc/>
public void HideDropAdorner(IDropVisualAdorner adorner)
{
// Ничего не делаем, так как обратная связь не отображается
}
}
#endregion
}