namespace Lattice.Core.DragDrop.Services;
///
/// Предоставляет централизованный сервис для управления операциями перетаскивания.
///
public interface IDragDropService : IDisposable
{
#region Свойства
///
/// Активна ли операция перетаскивания.
///
bool IsDragActive { get; }
///
/// Информация о текущей операции.
///
Models.DragInfo? CurrentDragInfo { get; }
///
/// Текущая цель сброса.
///
Abstractions.IDropTarget? CurrentDropTarget { get; }
///
/// Порог начала перетаскивания в пикселях.
///
double DragStartThreshold { get; set; }
///
/// Включены ли асинхронные операции.
///
bool EnableAsyncOperations { get; set; }
///
/// Максимальное время ожидания асинхронной операции (мс).
///
int AsyncOperationTimeout { get; set; }
#endregion
#region События
///
/// Событие начала операции перетаскивания.
///
event EventHandler DragStarted;
///
/// Событие обновления позиции перетаскивания.
///
event EventHandler DragUpdated;
///
/// Событие изменения цели сброса.
///
event EventHandler DropTargetChanged;
///
/// Событие завершения операции перетаскивания.
///
event EventHandler DragCompleted;
///
/// Событие отмены операции перетаскивания.
///
event EventHandler DragCancelled;
///
/// Событие ошибки в операции перетаскивания.
///
event EventHandler ErrorOccurred;
#endregion
#region Регистрация целей сброса
///
/// Регистрирует цель сброса.
///
string RegisterDropTarget(Abstractions.IDropTarget target, Geometry.Rect bounds, int priority = 0, string? group = null);
///
/// Обновляет границы цели сброса.
///
bool UpdateDropTargetBounds(string id, Geometry.Rect bounds);
///
/// Отменяет регистрацию цели сброса.
///
bool UnregisterDropTarget(string id);
///
/// Отменяет регистрацию всех целей в группе.
///
void UnregisterDropTargetsInGroup(string group);
#endregion
#region Асинхронные операции
///
/// Начинает операцию перетаскивания (асинхронно).
///
Task StartDragAsync(Abstractions.IDragSource source, Geometry.Point startPosition);
///
/// Обновляет позицию перетаскивания (асинхронно).
///
Task UpdateDragAsync(Geometry.Point position);
///
/// Завершает операцию перетаскивания (асинхронно).
///
Task EndDragAsync(Geometry.Point position);
///
/// Отменяет операцию перетаскивания (асинхронно).
///
Task CancelDragAsync();
#endregion
#region Синхронные операции (для обратной совместимости)
///
/// Начинает операцию перетаскивания (синхронно).
///
bool StartDrag(Abstractions.IDragSource source, Geometry.Point startPosition);
///
/// Обновляет позицию перетаскивания (синхронно).
///
void UpdateDrag(Geometry.Point position);
///
/// Завершает операцию перетаскивания (синхронно).
///
Enums.DragDropEffects EndDrag(Geometry.Point position);
///
/// Отменяет операцию перетаскивания (синхронно).
///
void CancelDrag();
#endregion
#region Утилиты
///
/// Очищает все зарегистрированные цели.
///
void ClearAllDropTargets();
///
/// Получает статистику использования.
///
DragDropStats GetStats();
#endregion
}
///
/// Статистика использования Drag & Drop.
///
public class DragDropStats
{
public int TotalDragOperations { get; set; }
public int SuccessfulDrops { get; set; }
public int CancelledOperations { get; set; }
public int ErrorCount { get; set; }
public int RegisteredTargets { get; set; }
public TimeSpan AverageOperationTime { get; set; }
}