namespace Lattice.Core.DragDrop.Abstractions; /// /// Определяет контракт для объектов, которые могут принимать сбрасываемые данные /// в операции перетаскивания. /// /// /// /// Объекты, реализующие этот интерфейс, могут обрабатывать данные, сброшенные /// пользователем, и предоставлять визуальную обратную связь во время перетаскивания. /// /// /// Интерфейс поддерживает асинхронные операции и отмену через CancellationToken. /// Все методы должны быть потокобезопасными и идемпотентными (многократный вызов /// с одинаковыми параметрами должен давать одинаковый результат). /// /// public interface IDropTarget { /// /// Определяет, может ли объект принять сбрасываемые данные. /// /// Информация о потенциальном сбросе. /// Токен отмены операции. /// /// true, если объект может принять данные; в противном случае — false. /// /// /// /// Этот метод вызывается, когда перетаскиваемый объект находится над целью. /// Реализация должна проверить, совместимы ли данные с целью, и установить /// предлагаемые эффекты в свойстве . /// /// /// Метод может вызываться многократно при перемещении курсора над целью. /// Реализация должна быть эффективной и избегать длительных операций. /// /// /// Если метод возвращает false, система не будет вызывать другие методы /// для этой цели до тех пор, пока курсор не покинет ее область. /// /// Task CanAcceptDropAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default); /// /// Вызывается, когда перетаскиваемый объект перемещается над целью. /// /// Информация о текущем положении перетаскивания. /// Токен отмены операции. /// Задача, представляющая асинхронную операцию. /// /// /// Этот метод вызывается постоянно, пока пользователь перемещает объект над целью. /// Реализация может: /// /// /// Обновить визуальную обратную связь (подсветка, изменение курсора) /// Вычислить точную позицию сброса (например, между элементами списка) /// Уточнить предлагаемые эффекты на основе текущей позиции /// Прокрутить содержимое, если цель поддерживает прокрутку /// /// /// Метод должен быть оптимизирован для частого вызова. Длительные операции /// должны выполняться асинхронно без блокировки потока. /// /// Task OnDragOverAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default); /// /// Вызывается, когда пользователь сбрасывает данные на цель. /// /// Информация о сбросе, включая данные и позицию. /// Токен отмены операции. /// Задача, представляющая асинхронную операцию. /// /// /// Этот метод вызывается, когда пользователь отпускает кнопку мыши над целью. /// Реализация должна обработать принятие данных и выполнить соответствующее действие: /// /// /// Добавить данные в коллекцию (для копирования) /// Переместить данные (при поддержке перемещения) /// Создать ссылку на данные /// Выполнить пользовательскую логику обработки /// /// /// После успешной обработки данных следует вызвать , /// чтобы указать системе, что операция обработана и дополнительная обработка не требуется. /// /// /// Если операция завершилась успешно, система уведомит источник через /// с соответствующими эффектами. /// /// Task OnDropAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default); /// /// Вызывается, когда перетаскиваемый объект покидает область цели. /// /// Токен отмены операции. /// Задача, представляющая асинхронную операцию. /// /// /// Этот метод вызывается, когда пользователь перемещает объект за пределы цели. /// Реализация должна: /// /// /// Очистить любую визуальную обратную связь, установленную ранее /// Сбросить временное состояние, связанное с операцией /// Освободить ресурсы, выделенные для предварительного просмотра /// /// /// Метод гарантированно вызывается после любого успешного или неуспешного /// вызова , если курсор покидает область цели. /// /// Task OnDragLeaveAsync(CancellationToken cancellationToken = default); }