Переработаны методы.

This commit is contained in:
2026-01-25 02:37:16 +03:00
parent a6ee6fcb36
commit be12154262
17 changed files with 897 additions and 1116 deletions

View File

@@ -5,57 +5,80 @@
/// в операции перетаскивания.
/// </summary>
/// <remarks>
/// <para>
/// Объекты, реализующие этот интерфейс, могут инициировать операции перетаскивания
/// и предоставлять данные для передачи другим элементам через механизм drag-and-drop.
/// </para>
/// <para>
/// Интерфейс полностью асинхронный и поддерживает отмену операций через CancellationToken.
/// Все методы должны быть потокобезопасными и поддерживать вызов из любого потока.
/// </para>
/// </remarks>
public interface IDragSource
{
/// <summary>
/// Определяет, может ли объект начать операцию перетаскивания.
/// Пытается начать операцию перетаскивания из указанной позиции.
/// </summary>
/// <param name="startPosition">Начальная позиция операции в координатах экрана.</param>
/// <param name="cancellationToken">Токен отмены операции.</param>
/// <returns>
/// Кортеж, содержащий флаг возможности начала перетаскивания и информацию о перетаскивании.
/// Информация о перетаскивании, если операция может быть начата; в противном случае — null.
/// Возвращаемый объект <see cref="Models.DragInfo"/> должен быть полностью инициализирован,
/// включая данные, разрешенные эффекты и ссылку на источник.
/// </returns>
/// <remarks>
/// Этот метод вызывается системой перетаскивания для проверки возможности
/// начала операции. Если метод возвращает true, он должен заполнить
/// DragInfo необходимыми данными.
/// <para>
/// Этот метод вызывается сервисом перетаскивания при попытке начать операцию
/// (обычно при нажатии и перемещении мыши). Метод должен проверить, может ли
/// источник начать перетаскивание в текущем контексте.
/// </para>
/// <para>
/// Реализация должна быть быстрой и не выполнять длительных операций.
/// Если подготовка данных требует времени, ее следует выполнить асинхронно
/// после подтверждения возможности начала.
/// </para>
/// </remarks>
Task<(bool CanStart, Models.DragInfo? DragInfo)> CanStartDragAsync(CancellationToken cancellationToken = default);
Task<Models.DragInfo?> TryStartDragAsync(Geometry.Point startPosition, CancellationToken cancellationToken = default);
/// <summary>
/// Начинает операцию перетаскивания.
/// Уведомляет источник о завершении операции перетаскивания.
/// </summary>
/// <param name="dragInfo">Информация о перетаскивании.</param>
/// <returns>
/// true, если операция перетаскивания успешно начата; в противном случае — false.
/// </returns>
/// <remarks>
/// Этот метод вызывается, когда пользователь начинает перетаскивание элемента.
/// Реализация должна подготовить данные для перетаскивания и, возможно,
/// создать визуальное представление перетаскиваемого объекта.
/// </remarks>
Task<bool> StartDragAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
/// <summary>
/// Вызывается при завершении операции перетаскивания.
/// </summary>
/// <param name="dragInfo">Исходная информация о перетаскивании.</param>
/// <param name="dragInfo">Информация о перетаскивании, полученная при начале операции.</param>
/// <param name="effects">Эффекты, которые были применены при сбросе.</param>
/// <param name="cancellationToken">Токен отмены операции.</param>
/// <returns>Задача, представляющая асинхронную операцию.</returns>
/// <remarks>
/// <para>
/// Этот метод вызывается после завершения операции перетаскивания
/// (успешного или неуспешного). Реализация может выполнить очистку
/// или обновить состояние на основе результата операции.
/// (успешного или неуспешного). Реализация может:
/// </para>
/// <list type="bullet">
/// <item>Выполнить очистку ресурсов, связанных с операцией</item>
/// <item>Обновить состояние на основе результата (например, удалить данные при перемещении)</item>
/// <item>Отобразить визуальную обратную связь о результате</item>
/// </list>
/// <para>
/// Если операция завершилась с эффектом <see cref="Enums.DragDropEffects.Move"/>,
/// источник обычно должен удалить или обновить исходные данные.
/// </para>
/// </remarks>
Task DragCompletedAsync(Models.DragInfo dragInfo, Enums.DragDropEffects effects, CancellationToken cancellationToken = default);
Task OnDragCompletedAsync(Models.DragInfo dragInfo, Enums.DragDropEffects effects, CancellationToken cancellationToken = default);
/// <summary>
/// Вызывается при отмене операции перетаскивания.
/// Уведомляет источник об отмене операции перетаскивания.
/// </summary>
/// <param name="dragInfo">Исходная информация о перетаскивании.</param>
/// <param name="dragInfo">Информация о перетаскивании, полученная при начале операции.</param>
/// <param name="cancellationToken">Токен отмены операции.</param>
/// <returns>Задача, представляющая асинхронную операцию.</returns>
/// <remarks>
/// <para>
/// Этот метод вызывается, когда операция перетаскивания была отменена
/// пользователем (например, нажатием клавиши Escape).
/// пользователем (например, нажатием клавиши Escape) или системой.
/// </para>
/// <para>
/// Реализация должна выполнить очистку и восстановить исходное состояние.
/// Обычно это включает освобождение ресурсов и сброс визуальных индикаторов.
/// </para>
/// </remarks>
Task DragCancelledAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
Task OnDragCancelledAsync(Models.DragInfo dragInfo, CancellationToken cancellationToken = default);
}