namespace Lattice.UI.Docking.Abstractions;
///
/// Предоставляет сервис для операций перетаскивания в UI-слое док-системы.
/// Абстрагирует платформенно-зависимую логику перетаскивания и обеспечивает
/// единый интерфейс для управления операциями drag-and-drop.
///
///
/// Этот интерфейс служит мостом между базовым менеджером перетаскивания из Core
/// и UI-контролами, добавляя визуальную обратную связь и обработку событий,
/// специфичных для пользовательского интерфейса.
///
public interface IDockDragDropService
{
///
/// Начинает операцию перетаскивания для указанного элемента.
///
/// UI-контрол, который инициирует перетаскивание.
///
/// Информация о перетаскивании, содержащая данные и параметры операции.
///
///
/// Выбрасывается, если или равны null.
///
///
/// Этот метод должен создавать визуальное представление перетаскиваемого элемента
/// и инициировать отслеживание перемещения мыши.
///
void StartDrag(IDockControl element, Core.DragDrop.Models.DragInfo dragInfo);
///
/// Обновляет позицию текущей операции перетаскивания.
///
/// Новая координата X курсора в экранных координатах.
/// Новая координата Y курсора в экранных координатах.
///
/// Вызывается при каждом перемещении мыши во время операции перетаскивания.
/// Должен обновлять позицию визуального представления и проверять возможные цели сброса.
///
void UpdateDrag(double x, double y);
///
/// Завершает текущую операцию перетаскивания в указанной позиции.
///
/// Координата X завершения перетаскивания.
/// Координата Y завершения перетаскивания.
///
/// Выполняет сброс данных на текущую цель (если она есть) и очищает ресурсы,
/// выделенные для операции перетаскивания.
///
void EndDrag(double x, double y);
///
/// Отменяет текущую операцию перетаскивания.
///
///
/// Вызывается при нажатии клавиши Escape или других действиях, приводящих к отмене.
/// Должен восстанавливать исходное состояние элементов и очищать ресурсы.
///
void CancelDrag();
///
/// Показывает визуальную подсказку о возможной позиции сброса.
///
/// UI-контрол, для которого показывается подсказка.
/// Предполагаемая позиция сброса.
///
/// Используется для визуальной обратной связи, чтобы пользователь видел,
/// куда будет помещен элемент при отпускании кнопки мыши.
///
void ShowDropHint(IDockControl element, Models.DropPosition position);
///
/// Скрывает текущую визуальную подсказку о сбросе.
///
///
/// Вызывается, когда курсор покидает допустимую область сброса
/// или операция перетаскивания завершается.
///
void HideDropHint();
///
/// Событие, возникающее при начале операции перетаскивания.
///
event EventHandler DragStarted;
///
/// Событие, возникающее при обновлении позиции перетаскивания.
///
event EventHandler DragUpdated;
///
/// Событие, возникающее при завершении операции перетаскивания.
///
event EventHandler DragCompleted;
///
/// Событие, возникающее при отмене операции перетаскивания.
///
event EventHandler DragCancelled;
}
///
/// Предоставляет данные для события начала перетаскивания.
///
public class DragStartedEventArgs : EventArgs
{
///
/// Получает UI-контрол, который инициировал перетаскивание.
///
///
/// Экземпляр , представляющий источник перетаскивания.
/// Может быть null, если перетаскивание инициировано не из UI-элемента.
///
public IDockControl? Source { get; }
///
/// Получает информацию о перетаскивании.
///
///
/// Экземпляр с данными перетаскивания.
///
public Core.DragDrop.Models.DragInfo DragInfo { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Источник перетаскивания.
/// Информация о перетаскивании.
public DragStartedEventArgs(IDockControl? source, Core.DragDrop.Models.DragInfo dragInfo)
{
Source = source;
DragInfo = dragInfo;
}
}
///
/// Предоставляет данные для события обновления перетаскивания.
///
public class DragUpdatedEventArgs : EventArgs
{
///
/// Получает UI-контрол, который инициировал перетаскивание.
///
///
/// Экземпляр , представляющий источник перетаскивания.
///
public IDockControl? Source { get; }
///
/// Получает текущую координату X курсора.
///
///
/// Координата X в экранных координатах.
///
public double X { get; }
///
/// Получает текущую координату Y курсора.
///
///
/// Координата Y в экранных координатах.
///
public double Y { get; }
///
/// Получает информацию о перетаскивании.
///
///
/// Экземпляр с текущими данными перетаскивания.
///
public Core.DragDrop.Models.DragInfo DragInfo { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Источник перетаскивания.
/// Текущая координата X.
/// Текущая координата Y.
/// Информация о перетаскивании.
public DragUpdatedEventArgs(IDockControl? source, double x, double y, Core.DragDrop.Models.DragInfo dragInfo)
{
Source = source;
X = x;
Y = y;
DragInfo = dragInfo;
}
}
///
/// Предоставляет данные для события завершения перетаскивания.
///
public class DragCompletedEventArgs : EventArgs
{
///
/// Получает UI-контрол, который инициировал перетаскивание.
///
///
/// Экземпляр , представляющий источник перетаскивания.
/// Может быть null, если операция была инициирована не из UI.
///
public IDockControl? Source { get; }
///
/// Получает UI-контрол, на который был выполнен сброс.
///
///
/// Экземпляр , представляющий цель сброса.
/// Может быть null, если сброс был выполнен вне допустимой области.
///
public IDockControl? Target { get; }
///
/// Получает позицию сброса относительно целевого элемента.
///
///
/// Значение перечисления , указывающее позицию сброса.
///
public Models.DropPosition DropPosition { get; }
///
/// Получает информацию о перетаскивании.
///
///
/// Экземпляр с данными завершенной операции.
/// Может быть null, если операция была отменена.
///
public Core.DragDrop.Models.DragInfo? DragInfo { get; }
///
/// Получает значение, указывающее успешность операции сброса.
///
///
/// true, если данные были успешно сброшены на цель; false, если операция была отменена
/// или сброс не был выполнен.
///
public bool Success { get; }
///
/// Инициализирует новый экземпляр класса .
///
/// Источник перетаскивания.
/// Цель сброса.
/// Позиция сброса.
/// Информация о перетаскивании.
/// Признак успешности операции.
public DragCompletedEventArgs(IDockControl? source, IDockControl? target,
Models.DropPosition dropPosition, Core.DragDrop.Models.DragInfo? dragInfo, bool success)
{
Source = source;
Target = target;
DropPosition = dropPosition;
DragInfo = dragInfo;
Success = success;
}
}