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; } }