Files
Lattice/Lattice.UI.DragDrop/Extensions/ServiceCollectionExtensions.cs

194 lines
9.7 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.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.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
{
/// <inheritdoc/>
public object? CreateDragVisual(Core.DragDrop.Models.DragInfo dragInfo, Core.Geometry.Point initialPosition)
{
// Безопасная реализация: не создает визуальное представление
return null;
}
/// <inheritdoc/>
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальное представление не было создано
}
/// <inheritdoc/>
public void ReleaseDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальное представление не было создано
}
}
/// <summary>
/// Безопасная реализация визуальной обратной связи по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDropVisualAdorner : IDropVisualAdorner
{
/// <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
{
/// <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
}