namespace Lattice.Core.DragDrop.Services;
///
/// Предоставляет централизованный сервис для управления операциями перетаскивания.
///
public interface IDragDropService : IDisposable
{
#region Свойства
///
/// Получает значение, указывающее, активна ли операция перетаскивания.
///
/// true, если операция перетаскивания активна; в противном случае — false.
bool IsDragActive { get; }
///
/// Получает информацию о текущей операции перетаскивания.
///
///
/// Объект , содержащий данные текущей операции,
/// или null, если операция не активна.
///
Models.DragInfo? CurrentDragInfo { get; }
///
/// Получает текущую цель сброса.
///
///
/// Объект , над которым находится курсор,
/// или null, если курсор не над зарегистрированной целью.
///
Abstractions.IDropTarget? CurrentDropTarget { get; }
///
/// Получает или задает порог начала перетаскивания в пикселях.
///
///
/// Минимальное расстояние, которое должен пройти курсор мыши, чтобы начать операцию перетаскивания.
/// Значение по умолчанию: .
///
double DragStartThreshold { get; set; }
///
/// Получает или задает значение, указывающее, включены ли асинхронные операции.
///
/// true, если асинхронные операции включены; в противном случае — false.
bool EnableAsyncOperations { get; set; }
///
/// Получает или задает максимальное время ожидания асинхронной операции в миллисекундах.
///
///
/// Время ожидания в миллисекундах. Значение 0 или меньше означает отсутствие таймаута.
/// Значение по умолчанию: .
///
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 Регистрация целей сброса
///
/// Регистрирует цель сброса в системе.
///
/// Цель сброса для регистрации.
/// Границы области цели в координатах экрана.
/// Приоритет цели (высшие значения обрабатываются первыми).
/// Имя группы для групповой отмены регистрации.
/// Уникальный идентификатор зарегистрированной цели.
/// Выбрасывается, когда равен null.
/// Выбрасывается, если сервис был удален.
string RegisterDropTarget(Abstractions.IDropTarget target, Geometry.Rect bounds, int priority = 0, string? group = null);
///
/// Обновляет границы цели сброса.
///
/// Идентификатор цели сброса.
/// Новые границы области цели.
/// true, если границы успешно обновлены; в противном случае — false.
/// Выбрасывается, если сервис был удален.
bool UpdateDropTargetBounds(string id, Geometry.Rect bounds);
///
/// Отменяет регистрацию цели сброса.
///
/// Идентификатор цели сброса.
/// true, если цель успешно удалена; в противном случае — false.
/// Выбрасывается, если сервис был удален.
bool UnregisterDropTarget(string id);
///
/// Отменяет регистрацию всех целей сброса в указанной группе.
///
/// Имя группы для удаления.
/// Выбрасывается, если сервис был удален.
void UnregisterDropTargetsInGroup(string group);
#endregion
#region Асинхронные операции
///
/// Начинает операцию перетаскивания из указанной позиции.
///
/// Источник данных для перетаскивания.
/// Начальная позиция операции в координатах экрана.
///
/// Задача, представляющая асинхронную операцию. Результат содержит true, если операция успешно начата;
/// в противном случае — false.
///
/// Выбрасывается, когда равен null.
/// Выбрасывается, если сервис был удален.
///
/// Этот метод следует вызывать в ответ на событие нажатия кнопки мыши или начала жеста перетаскивания.
///
Task StartDragAsync(Abstractions.IDragSource source, Geometry.Point startPosition);
///
/// Обновляет позицию текущей операции перетаскивания.
///
/// Новая позиция курсора в координатах экрана.
/// Задача, представляющая асинхронную операцию.
/// Выбрасывается, если сервис был удален.
///
/// Этот метод следует вызывать при каждом перемещении мыши во время операции перетаскивания.
///
Task UpdateDragAsync(Geometry.Point position);
///
/// Завершает текущую операцию перетаскивания в указанной позиции.
///
/// Позиция завершения операции в координатах экрана.
///
/// Задача, представляющая асинхронную операцию. Результат содержит эффекты, примененные при завершении операции.
///
/// Выбрасывается, если сервис был удален.
///
/// Этот метод следует вызывать при отпускании кнопки мыши или завершении жеста перетаскивания.
///
Task EndDragAsync(Geometry.Point position);
///
/// Отменяет текущую операцию перетаскивания.
///
/// Задача, представляющая асинхронную операцию.
/// Выбрасывается, если сервис был удален.
///
/// Этот метод следует вызывать при отмене операции пользователем (например, нажатием клавиши Escape)
/// или при возникновении ошибки.
///
Task CancelDragAsync();
#endregion
#region Утилиты
///
/// Очищает все зарегистрированные цели сброса.
///
/// Выбрасывается, если сервис был удален.
void ClearAllDropTargets();
///
/// Получает статистику использования системы перетаскивания.
///
/// Объект со статистикой использования.
DragDropStats GetStats();
#endregion
}
///
/// Содержит статистику использования системы перетаскивания.
///
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; }
}