using Lattice.Core.DragDrop.Services;
using Lattice.UI.DragDrop.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Lattice.UI.DragDrop.Extensions;
///
/// Методы расширения для регистрации сервисов перетаскивания в контейнере зависимостей.
///
public static class ServiceCollectionExtensions
{
///
/// Добавляет сервисы перетаскивания в контейнер зависимостей.
///
/// Коллекция сервисов для регистрации.
/// Коллекция сервисов с зарегистрированными сервисами перетаскивания.
///
///
/// Этот метод регистрирует основные сервисы перетаскивания, необходимые для работы системы:
///
///
/// - Основной сервис управления перетаскиванием ()
/// - Абстракции для визуального представления и обратной связи
/// - Провайдеры по умолчанию с безопасной реализацией
///
///
/// Для полноценной работы в конкретной UI-платформе (WPF, Avalonia, MAUI и т.д.)
/// необходимо переопределить регистрации платформенными реализациями.
///
///
public static IServiceCollection AddLatticeDragDrop(this IServiceCollection services)
{
// Регистрация основного сервиса перетаскивания
services.TryAddSingleton();
// Регистрация UI-специфичных абстракций с реализациями по умолчанию
// Эти реализации безопасны (ничего не делают), но могут быть переопределены платформенными реализациями
services.TryAddSingleton();
services.TryAddSingleton();
services.TryAddSingleton();
return services;
}
///
/// Добавляет или заменяет реализацию поставщика визуального представления перетаскивания.
///
/// Тип поставщика визуального представления.
/// Коллекция сервисов.
/// Коллекция сервисов.
///
/// Используйте этот метод для регистрации платформенной реализации поставщика визуального представления.
///
public static IServiceCollection AddDragVisualProvider(this IServiceCollection services)
where TProvider : class, IDragVisualProvider
{
services.Replace(ServiceDescriptor.Singleton());
return services;
}
///
/// Добавляет или заменяет реализацию визуальной обратной связи для цели сброса.
///
/// Тип элемента визуальной обратной связи.
/// Коллекция сервисов.
/// Коллекция сервисов.
///
/// Используйте этот метод для регистрации платформенной реализации визуальной обратной связи.
///
public static IServiceCollection AddDropVisualAdorner(this IServiceCollection services)
where TAdorner : class, IDropVisualAdorner
{
services.Replace(ServiceDescriptor.Singleton());
return services;
}
///
/// Добавляет или заменяет реализацию хоста для отображения визуальных элементов.
///
/// Тип хоста визуальных элементов.
/// Коллекция сервисов.
/// Коллекция сервисов.
///
/// Используйте этот метод для регистрации платформенной реализации хоста визуальных элементов.
///
public static IServiceCollection AddDragDropHost(this IServiceCollection services)
where THost : class, IDragDropHost
{
services.Replace(ServiceDescriptor.Singleton());
return services;
}
#region Default Implementations
///
/// Безопасная реализация поставщика визуального представления по умолчанию.
///
///
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
///
private class DefaultDragVisualProvider : IDragVisualProvider
{
///
public object? CreateDragVisual(Core.DragDrop.Models.DragInfo dragInfo, Core.Geometry.Point initialPosition)
{
// Безопасная реализация: не создает визуальное представление
return null;
}
///
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальное представление не было создано
}
///
public void ReleaseDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальное представление не было создано
}
}
///
/// Безопасная реализация визуальной обратной связи по умолчанию.
///
///
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
///
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()
{
// Ничего не делаем, так как обратная связь не отображается
}
}
///
/// Безопасная реализация хоста визуальных элементов по умолчанию.
///
///
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
///
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)
{
// Ничего не делаем, так как обратная связь не отображается
}
}
#endregion
}