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; } }