namespace Lattice.Core.DragDrop.Abstractions;
///
/// Определяет контракт для объектов, которые могут быть источником данных
/// в операции перетаскивания.
///
///
/// Объекты, реализующие этот интерфейс, могут инициировать операции перетаскивания
/// и предоставлять данные для передачи другим элементам через механизм drag-and-drop.
///
public interface IDragSource
{
///
/// Определяет, может ли объект начать операцию перетаскивания.
///
///
/// Кортеж, содержащий флаг возможности начала перетаскивания и информацию о перетаскивании.
///
///
/// Этот метод вызывается системой перетаскивания для проверки возможности
/// начала операции. Если метод возвращает true, он должен заполнить
/// DragInfo необходимыми данными.
///
Task<(bool CanStart, Models.DragInfo? DragInfo)> CanStartDragAsync(CancellationToken cancellationToken = default);
///
/// Начинает операцию перетаскивания.
///
/// Информация о перетаскивании.
///
/// true, если операция перетаскивания успешно начата; в противном случае — false.
///
///
/// Этот метод вызывается, когда пользователь начинает перетаскивание элемента.
/// Реализация должна подготовить данные для перетаскивания и, возможно,
/// создать визуальное представление перетаскиваемого объекта.
///
Task StartDragAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
///
/// Вызывается при завершении операции перетаскивания.
///
/// Исходная информация о перетаскивании.
/// Эффекты, которые были применены при сбросе.
///
/// Этот метод вызывается после завершения операции перетаскивания
/// (успешного или неуспешного). Реализация может выполнить очистку
/// или обновить состояние на основе результата операции.
///
Task DragCompletedAsync(Models.DragInfo dragInfo, Enums.DragDropEffects effects, CancellationToken cancellationToken = default);
///
/// Вызывается при отмене операции перетаскивания.
///
/// Исходная информация о перетаскивании.
///
/// Этот метод вызывается, когда операция перетаскивания была отменена
/// пользователем (например, нажатием клавиши Escape).
///
Task DragCancelledAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
}