Доработан проект UI под новый Core
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user