194 lines
9.7 KiB
C#
194 lines
9.7 KiB
C#
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
|
||
} |