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