using Lattice.Core.DragDrop.Enums;
using Lattice.Core.Geometry;
namespace Lattice.Core.DragDrop.Extensions;
///
/// Методы расширения для DropInfo.
///
public static class DropInfoExtensions
{
///
/// Проверяет, могут ли данные быть приведены к указанному типу.
///
/// Тип данных для проверки.
/// Информация о сбросе.
/// true, если данные могут быть приведены к типу T; в противном случае — false.
public static bool CanAccept(this Models.DropInfo dropInfo)
where T : class
{
return dropInfo.Data is T;
}
///
/// Пытается получить данные как указанный тип.
///
/// Тип, к которому нужно привести данные.
/// Информация о сбросе.
/// Данные как тип T или null.
public static T? GetDataAs(this Models.DropInfo dropInfo)
where T : class
{
return dropInfo.Data as T;
}
///
/// Получает данные как указанный тип или выбрасывает исключение.
///
/// Тип, к которому нужно привести данные.
/// Информация о сбросе.
/// Данные как тип T.
/// Выбрасывается, если данные не могут быть приведены к типу T.
public static T GetRequiredDataAs(this Models.DropInfo dropInfo)
where T : class
{
if (dropInfo.Data is not T data)
{
throw new InvalidCastException(
$"Ожидался тип {typeof(T).Name}, но получен {dropInfo.Data?.GetType().Name ?? "null"}");
}
return data;
}
///
/// Проверяет, содержится ли позиция в указанных границах.
///
/// Информация о сбросе.
/// Границы для проверки.
/// true, если позиция находится в границах; в противном случае — false.
public static bool IsInBounds(this Models.DropInfo dropInfo, Rect bounds)
{
return bounds.Contains(dropInfo.Position);
}
///
/// Проверяет можно ли добавить эффект перетаскивания.
///
///
///
///
public static bool CanAcceptEffect(this Models.DropInfo dropInfo, DragDropEffects effect)
{
return dropInfo.AllowedEffects.HasEffect(effect);
}
}