using Lattice.Core.DragDrop.Models;
using Lattice.Core.Geometry;
namespace Lattice.Core.DragDrop.Services;
///
/// Предоставляет базовые данные для событий перетаскивания.
///
///
/// Этот класс содержит общие свойства, которые используются в большинстве событий
/// системы перетаскивания. Является базовым классом для специализированных событий.
///
public abstract class DragEventArgs : EventArgs
{
///
/// Получает информацию о текущей операции перетаскивания.
///
///
/// Объект , содержащий данные, эффекты и метаданные операции.
/// Всегда возвращает актуальную информацию на момент возникновения события.
///
public DragInfo DragInfo { get; }
///
/// Получает текущую позицию курсора в координатах экрана.
///
///
/// Точка, представляющая положение курсора мыши в момент события.
/// Используется для точного позиционирования и визуальной обратной связи.
///
public Point Position { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Текущая позиция курсора.
///
/// Выбрасывается, когда равен null.
///
protected DragEventArgs(DragInfo dragInfo, Point position)
{
DragInfo = dragInfo ?? throw new ArgumentNullException(nameof(dragInfo));
Position = position;
}
}
///
/// Предоставляет данные для события начала перетаскивания.
///
///
/// Возникает, когда пользователь начинает операцию перетаскивания.
/// Это первое событие в жизненном цикле операции.
///
public sealed class DragStartedEventArgs : DragEventArgs
{
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Начальная позиция перетаскивания.
public DragStartedEventArgs(DragInfo dragInfo, Point position)
: base(dragInfo, position)
{
}
}
///
/// Предоставляет данные для события обновления позиции перетаскивания.
///
///
/// Возникает при каждом перемещении курсора во время операции перетаскивания.
/// Может вызываться многократно с высокой частотой, поэтому обработчики
/// должны быть оптимизированы для производительности.
///
public sealed class DragUpdatedEventArgs : DragEventArgs
{
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Текущая позиция курсора.
public DragUpdatedEventArgs(DragInfo dragInfo, Point position)
: base(dragInfo, position)
{
}
}
///
/// Предоставляет данные для события завершения перетаскивания.
///
///
/// Возникает, когда пользователь завершает операцию перетаскивания
/// (отпускает кнопку мыши над целью или вне области сброса).
/// Содержит информацию о примененных эффектах и результатах операции.
///
public sealed class DragCompletedEventArgs : DragEventArgs
{
///
/// Получает эффекты, примененные при завершении операции.
///
///
/// Комбинация флагов , указывающая,
/// как были обработаны данные (копирование, перемещение и т.д.).
///
public Enums.DragDropEffects Effects { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Позиция завершения операции.
/// Примененные эффекты перетаскивания.
public DragCompletedEventArgs(DragInfo dragInfo, Point position, Enums.DragDropEffects effects)
: base(dragInfo, position)
{
Effects = effects;
}
}
///
/// Предоставляет данные для события отмены перетаскивания.
///
///
/// Возникает, когда операция перетаскивания была отменена пользователем
/// (например, нажатием клавиши Escape) или системой (например, при ошибке).
/// После этого события система возвращается в исходное состояние.
///
public sealed class DragCancelledEventArgs : DragEventArgs
{
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Позиция в момент отмены.
public DragCancelledEventArgs(DragInfo dragInfo, Point position)
: base(dragInfo, position)
{
}
}
///
/// Предоставляет данные для события изменения цели сброса.
///
///
/// Возникает, когда курсор перемещается с одной цели сброса на другую
/// или покидает область всех целей. Позволяет обновлять визуальную
/// обратную связь при изменении контекста сброса.
///
public sealed class DropTargetChangedEventArgs : DragEventArgs
{
///
/// Получает новую цель сброса, над которой находится курсор.
///
///
/// Объект , готовый принять данные,
/// или null, если курсор покинул область всех целей.
///
public Abstractions.IDropTarget? Target { get; }
///
/// Получает границы новой цели сброса.
///
///
/// Прямоугольник, определяющий область цели в координатах экрана.
/// Может использоваться для точного позиционирования визуальной обратной связи.
///
public Rect TargetBounds { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Информация о перетаскивании.
/// Текущая позиция курсора.
/// Новая цель сброса.
/// Границы цели сброса.
public DropTargetChangedEventArgs(DragInfo dragInfo, Point position, Abstractions.IDropTarget? target, Rect targetBounds)
: base(dragInfo, position)
{
Target = target;
TargetBounds = targetBounds;
}
}
///
/// Предоставляет данные для события ошибки в операции перетаскивания.
///
///
/// Возникает при возникновении исключения в любом из компонентов
/// системы перетаскивания. Позволяет централизованно обрабатывать ошибки
/// и предоставлять пользователю информацию о проблемах.
///
public sealed class DragDropErrorEventArgs : EventArgs
{
///
/// Получает исключение, вызвавшее ошибку.
///
///
/// Объект , содержащий информацию об ошибке.
/// Может быть любого типа, в зависимости от источника ошибки.
///
public Exception Exception { get; }
///
/// Получает название операции, во время которой произошла ошибка.
///
///
/// Строка, идентифицирующая операцию (например, "StartDragAsync",
/// "OnDropAsync", "UpdateDropTargetBounds").
///
public string Operation { get; }
///
/// Получает контекст, в котором произошла ошибка.
///
///
/// Объект, содержащий дополнительную информацию о контексте ошибки,
/// или null, если контекст недоступен.
///
public object? Context { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Исключение, вызвавшее ошибку.
/// Название операции.
/// Контекст ошибки.
///
/// Выбрасывается, когда или равны null.
///
public DragDropErrorEventArgs(Exception exception, string operation, object? context = null)
{
Exception = exception ?? throw new ArgumentNullException(nameof(exception));
Operation = operation ?? throw new ArgumentNullException(nameof(operation));
Context = context;
}
}