namespace Lattice.Core.DragDrop.Abstractions;
///
/// Определяет контракт для объектов, которые могут быть источником данных
/// в операции перетаскивания.
///
///
///
/// Объекты, реализующие этот интерфейс, могут инициировать операции перетаскивания
/// и предоставлять данные для передачи другим элементам через механизм drag-and-drop.
///
///
/// Интерфейс полностью асинхронный и поддерживает отмену операций через CancellationToken.
/// Все методы должны быть потокобезопасными и поддерживать вызов из любого потока.
///
///
public interface IDragSource
{
///
/// Пытается начать операцию перетаскивания из указанной позиции.
///
/// Начальная позиция операции в координатах экрана.
/// Токен отмены операции.
///
/// Информация о перетаскивании, если операция может быть начата; в противном случае — null.
/// Возвращаемый объект должен быть полностью инициализирован,
/// включая данные, разрешенные эффекты и ссылку на источник.
///
///
///
/// Этот метод вызывается сервисом перетаскивания при попытке начать операцию
/// (обычно при нажатии и перемещении мыши). Метод должен проверить, может ли
/// источник начать перетаскивание в текущем контексте.
///
///
/// Реализация должна быть быстрой и не выполнять длительных операций.
/// Если подготовка данных требует времени, ее следует выполнить асинхронно
/// после подтверждения возможности начала.
///
///
Task TryStartDragAsync(Geometry.Point startPosition, CancellationToken cancellationToken = default);
///
/// Уведомляет источник о завершении операции перетаскивания.
///
/// Информация о перетаскивании, полученная при начале операции.
/// Эффекты, которые были применены при сбросе.
/// Токен отмены операции.
/// Задача, представляющая асинхронную операцию.
///
///
/// Этот метод вызывается после завершения операции перетаскивания
/// (успешного или неуспешного). Реализация может:
///
///
/// - Выполнить очистку ресурсов, связанных с операцией
/// - Обновить состояние на основе результата (например, удалить данные при перемещении)
/// - Отобразить визуальную обратную связь о результате
///
///
/// Если операция завершилась с эффектом ,
/// источник обычно должен удалить или обновить исходные данные.
///
///
Task OnDragCompletedAsync(Models.DragInfo dragInfo, Enums.DragDropEffects effects, CancellationToken cancellationToken = default);
///
/// Уведомляет источник об отмене операции перетаскивания.
///
/// Информация о перетаскивании, полученная при начале операции.
/// Токен отмены операции.
/// Задача, представляющая асинхронную операцию.
///
///
/// Этот метод вызывается, когда операция перетаскивания была отменена
/// пользователем (например, нажатием клавиши Escape) или системой.
///
///
/// Реализация должна выполнить очистку и восстановить исходное состояние.
/// Обычно это включает освобождение ресурсов и сброс визуальных индикаторов.
///
///
Task OnDragCancelledAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
}