using Lattice.Core.DragDrop.Enums; using Lattice.Core.Geometry; namespace Lattice.Core.DragDrop.Models; /// /// Содержит информацию о потенциальном или фактическом сбросе в операции перетаскивания. /// Этот класс используется для передачи данных между системой перетаскивания /// и целью сброса (). /// /// /// /// предоставляет цель сброса всей необходимой информацией /// для принятия решения о возможности сброса и выполнения соответствующей операции. /// Ключевые аспекты включают: /// /// /// Предлагаемые для сброса данные /// Текущую позицию курсора /// Разрешенные эффекты от источника /// Предлагаемые эффекты для сброса /// Ссылку на цель сброса /// Флаг обработки операции /// /// /// Этот класс является изменяемым, позволяя цели сброса обновлять предлагаемые /// эффекты и помечать операцию как обработанную. /// /// public class DropInfo { private DragDropEffects _effects = DragDropEffects.None; /// /// Получает или задает позицию сброса относительно цели. /// public DropPosition DropPosition { get; set; } = DropPosition.Inside; /// /// Получает или задает значение, указывающее, нужно ли показывать визуальную обратную связь. /// public bool ShowVisualFeedback { get; set; } = true; /// /// Получает или задает данные для визуальной обратной связи. /// public object? VisualFeedbackData { get; set; } /// /// Получает данные, которые предлагаются для сброса. /// /// /// Данные, переданные от источника перетаскивания, или null, если данные /// не доступны или операция была отменена. /// /// /// Эти данные соответствуют свойству из /// исходной информации о перетаскивании. /// public object? Data { get; } /// /// Получает текущую позицию курсора в координатах экрана. /// /// /// Точка в экранных координатах, представляющая текущее положение курсора /// мыши во время операции перетаскивания. /// /// /// Эта позиция используется для определения точного места сброса и может /// влиять на предлагаемые эффекты (например, различные операции для /// разных областей цели сброса). /// public Point Position { get; } /// /// Получает разрешенные эффекты от источника перетаскивания. /// /// /// Комбинация флагов , определяющая, /// какие операции разрешил источник. /// /// /// Цель сброса должна уважать эти ограничения и не предлагать эффекты, /// которые не разрешены источником. /// public Enums.DragDropEffects AllowedEffects { get; } /// /// Получает или задает предлагаемые эффекты для операции сброса. /// /// /// Комбинация флагов , предлагаемая /// целью сброса. По умолчанию равно . /// /// /// /// Цель сброса должна установить это свойство в методе /// на основе анализа предоставленных данных и текущего контекста. /// /// /// Если цель не устанавливает это свойство, система перетаскивания /// будет использовать эффекты по умолчанию. /// /// public Enums.DragDropEffects SuggestedEffects { get => _effects; set => _effects = value; } /// /// Получает цель сброса, которая обрабатывает эту информацию. /// /// /// Объект, реализующий , или null, /// если цель не определена. /// /// /// Эта ссылка позволяет системе идентифицировать, какая цель обрабатывает /// информацию о сбросе, и используется для отслеживания изменений цели /// во время операции перетаскивания. /// public object? Target { get; } /// /// Получает или задает дополнительные параметры, специфичные для конкретной /// реализации перетаскивания. /// /// /// Словарь, содержащий пары ключ-значение с дополнительными параметрами. /// /// /// Может использоваться для передачи контекстной информации между /// различными компонентами системы перетаскивания или для хранения /// временных данных во время обработки операции. /// public Dictionary Parameters { get; set; } /// /// Получает значение, указывающее, был ли сброс уже обработан. /// /// /// true, если операция сброса была помечена как обработанная; /// в противном случае — false. /// /// /// /// Это свойство используется для предотвращения множественной обработки /// одной и той же операции сброса. После вызова метода , /// свойство становится true. /// /// /// Система перетаскивания может проверять это свойство, чтобы определить, /// нужно ли выполнять дополнительную обработку по умолчанию. /// /// public bool Handled { get; private set; } /// /// Получает дополнительные параметры, специфичные для конкретной /// реализации перетаскивания. /// public T? GetParameter(string key, T? defaultValue = default) { if (Parameters.TryGetValue(key, out var value) && value is T typedValue) { return typedValue; } return defaultValue; } /// /// Получает дополнительные параметры, специфичные для конкретной /// реализации перетаскивания. /// public bool TryGetParameter(string key, out T? value) { value = default; if (Parameters.TryGetValue(key, out var objValue) && objValue is T typedValue) { value = typedValue; return true; } return false; } /// /// Задает дополнительные параметры, специфичные для конкретной /// реализации перетаскивания. /// public void SetParameter(string key, T value) { Parameters[key] = value!; } /// /// Инициализирует новый экземпляр класса . /// /// /// Данные, которые предлагаются для сброса. Может быть null. /// /// /// Текущая позиция курсора в координатах экрана. /// /// /// Разрешенные эффекты от источника перетаскивания. /// /// /// Цель сброса, которая обрабатывает эту информацию. Может быть null. /// /// /// Конструктор создает экземпляр с указанными /// параметрами, инициализирует коллекцию параметров пустым словарем /// и устанавливает флаг в false. /// public DropInfo(object? data, Point position, Enums.DragDropEffects allowedEffects, object? target = null) { Data = data; Position = position; AllowedEffects = allowedEffects; Target = target; Parameters = new Dictionary(); Handled = false; } /// /// Помечает сброс как обработанный. /// /// /// /// Этот метод должен вызываться целью сброса в методе , /// если она успешно обработала операцию сброса. /// /// /// После вызова этого метода свойство становится true, /// что сигнализирует системе перетаскивания о том, что дополнительная /// обработка не требуется. /// /// public void MarkAsHandled() { Handled = true; } /// /// Создает новый экземпляр с теми же данными, /// но новой позицией. /// /// /// Новая позиция для информации о сбросе. /// /// /// Новый экземпляр с обновленной позицией. /// /// /// Этот метод используется для обновления информации о сбросе при /// перемещении курсора, сохраняя исходные данные и параметры. /// public DropInfo WithPosition(Point newPosition) { return new DropInfo(Data, newPosition, AllowedEffects, Target) { Parameters = new Dictionary(Parameters), SuggestedEffects = _effects, DropPosition = DropPosition, ShowVisualFeedback = ShowVisualFeedback, VisualFeedbackData = VisualFeedbackData }; } /// /// Проверка установки эффекта перетаскивания в разрешенные эффекты. /// public bool CanAcceptEffect(Enums.DragDropEffects effect) { return (AllowedEffects & effect) != Enums.DragDropEffects.None; } }