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 }