using Lattice.Core.DragDrop.Models;
using Lattice.Core.Geometry;
namespace Lattice.UI.DragDrop.Abstractions;
///
/// Поставщик визуального представления для перетаскиваемого элемента.
///
///
///
/// Интерфейс предоставляет абстракцию для создания и управления визуальными
/// представлениями элементов при операции перетаскивания.
///
///
/// Реализации могут предоставлять различные стили визуального представления:
/// от простого клонирования оригинального элемента до сложных анимированных представлений.
///
///
public interface IDragVisualProvider
{
///
/// Создает визуальное представление для перетаскивания на основе информации о перетаскивании.
///
/// Информация о перетаскивании, содержащая данные и метаданные операции.
/// Начальная позиция в экранных координатах.
/// Объект, представляющий визуальное отображение для перетаскивания.
///
///
/// Созданный визуальный элемент должен:
/// 1. Отображать репрезентативное представление перетаскиваемых данных
/// 2. Иметь прозрачный фон или альфа-канал для плавного отображения
/// 3. Быть легковесным для обеспечения плавной анимации
/// 4. Поддерживать возможность изменения позиции через
///
///
/// Метод может возвращать null, если визуальное представление не требуется.
///
///
object? CreateDragVisual(DragInfo dragInfo, Point initialPosition);
///
/// Обновляет позицию визуального представления перетаскивания.
///
/// Визуальное представление, созданное методом .
/// Новая позиция в экранных координатах.
///
/// Метод должен обновить позицию визуального элемента максимально эффективно,
/// так как он вызывается часто во время операции перетаскивания.
///
void UpdateDragVisualPosition(object dragVisual, Point position);
///
/// Освобождает ресурсы визуального представления.
///
/// Визуальное представление для освобождения.
///
///
/// Метод должен освободить все ресурсы, связанные с визуальным представлением,
/// включая графические ресурсы, подписки на события и временные данные.
///
///
/// Этот метод гарантированно вызывается после завершения операции перетаскивания,
/// независимо от её успешности.
///
///
void ReleaseDragVisual(object dragVisual);
}