using Lattice.Core.DragDrop.Abstractions;
using Lattice.Core.DragDrop.Enums;
using Lattice.Core.DragDrop.Models;
using Lattice.Core.DragDrop.Services;
using Lattice.Core.Geometry;
namespace Lattice.Core.DragDrop.Factories;
///
/// Фабрика для создания компонентов системы перетаскивания.
/// Предоставляет методы для создания сервисов, источников и целей перетаскивания.
///
///
/// Эта фабрика позволяет создавать компоненты системы перетаскивания без использования
/// Dependency Injection, предоставляя простой и понятный API для наиболее распространенных сценариев.
///
public static class DragDropFactory
{
#region Сервисы перетаскивания
///
/// Создает новый экземпляр сервиса перетаскивания с настройками по умолчанию.
///
///
/// Экземпляр с настройками по умолчанию.
///
///
/// Созданный сервис имеет следующие настройки по умолчанию:
///
/// Порог начала перетаскивания: 3.0 пикселей
/// Таймаут асинхронных операций: 5000 миллисекунд
/// Асинхронные операции: включены
///
///
public static IDragDropService CreateDragDropService()
{
return new DragDropService();
}
///
/// Создает новый экземпляр сервиса перетаскивания с пользовательскими настройками.
///
///
/// Делегат для настройки опций сервиса. Передает экземпляр
/// для настройки параметров.
///
///
/// Настроенный экземпляр .
///
///
///
/// var service = DragDropFactory.CreateDragDropService(options =>
/// {
/// options.DragStartThreshold = 5.0;
/// options.AsyncOperationTimeout = 3000;
/// options.EnableAsyncOperations = true;
/// });
///
///
public static IDragDropService CreateDragDropService(Action configure)
{
var options = new DragDropServiceOptions();
configure(options);
return new DragDropService
{
DragStartThreshold = options.DragStartThreshold,
AsyncOperationTimeout = options.AsyncOperationTimeout,
EnableAsyncOperations = options.EnableAsyncOperations
};
}
///
/// Создает сервис перетаскивания, оптимизированный для сенсорных устройств.
///
///
/// Экземпляр с увеличенным порогом перетаскивания.
///
///
/// Этот метод создает сервис с увеличенным порогом начала перетаскивания (10.0 пикселей),
/// что уменьшает вероятность случайного начала перетаскивания при использовании сенсорного экрана.
///
public static IDragDropService CreateTouchOptimizedService()
{
return new DragDropService
{
DragStartThreshold = 10.0,
AsyncOperationTimeout = 3000,
EnableAsyncOperations = true
};
}
///
/// Создает сервис перетаскивания для точных операций (графические редакторы, карты).
///
///
/// Экземпляр с уменьшенным порогом перетаскивания.
///
///
/// Этот метод создает сервис с минимальным порогом начала перетаскивания (1.0 пиксель),
/// что позволяет начинать перетаскивание с максимальной точностью.
///
public static IDragDropService CreatePrecisionDragService()
{
return new DragDropService
{
DragStartThreshold = 1.0,
AsyncOperationTimeout = 10000, // Больше времени для сложных операций
EnableAsyncOperations = true
};
}
#endregion
#region Источники перетаскивания
///
/// Создает простой источник перетаскивания с фиксированными данными.
///
///
/// Данные, которые будут перетаскиваться. Не может быть null.
///
///
/// Разрешенные эффекты перетаскивания. По умолчанию разрешены копирование и перемещение.
///
///
/// Экземпляр , который всегда предоставляет указанные данные.
///
///
/// Выбрасывается, когда равен null.
///
///
/// Этот источник подходит для случаев, когда данные для перетаскивания известны заранее
/// и не изменяются в процессе операции.
///
public static IDragSource CreateSimpleSource(object data, DragDropEffects allowedEffects = DragDropEffects.Copy | DragDropEffects.Move)
{
if (data == null)
throw new ArgumentNullException(nameof(data));
return new SimpleDragSource(data, allowedEffects);
}
///
/// Создает источник перетаскивания с отложенной загрузкой данных.
///
///
/// Фабрика данных, которая будет вызвана при начале перетаскивания.
///
///
/// Функция проверки возможности начала перетаскивания.
///
///
/// Разрешенные эффекты перетаскивания.
///
///
/// Экземпляр с отложенной загрузкой данных.
///
///
/// Этот источник полезен, когда данные для перетаскивания дорого создавать заранее
/// или зависят от контекста в момент начала операции.
///
public static IDragSource CreateLazySource(
Func