74 lines
3.2 KiB
C#
74 lines
3.2 KiB
C#
using Lattice.Core.DragDrop.Enums;
|
||
using Lattice.Core.Geometry;
|
||
|
||
namespace Lattice.Core.DragDrop.Extensions;
|
||
|
||
/// <summary>
|
||
/// Методы расширения для DropInfo.
|
||
/// </summary>
|
||
public static class DropInfoExtensions
|
||
{
|
||
/// <summary>
|
||
/// Проверяет, могут ли данные быть приведены к указанному типу.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип данных для проверки.</typeparam>
|
||
/// <param name="dropInfo">Информация о сбросе.</param>
|
||
/// <returns>true, если данные могут быть приведены к типу T; в противном случае — false.</returns>
|
||
public static bool CanAccept<T>(this Models.DropInfo dropInfo)
|
||
where T : class
|
||
{
|
||
return dropInfo.Data is T;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Пытается получить данные как указанный тип.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип, к которому нужно привести данные.</typeparam>
|
||
/// <param name="dropInfo">Информация о сбросе.</param>
|
||
/// <returns>Данные как тип T или null.</returns>
|
||
public static T? GetDataAs<T>(this Models.DropInfo dropInfo)
|
||
where T : class
|
||
{
|
||
return dropInfo.Data as T;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Получает данные как указанный тип или выбрасывает исключение.
|
||
/// </summary>
|
||
/// <typeparam name="T">Тип, к которому нужно привести данные.</typeparam>
|
||
/// <param name="dropInfo">Информация о сбросе.</param>
|
||
/// <returns>Данные как тип T.</returns>
|
||
/// <exception cref="InvalidCastException">Выбрасывается, если данные не могут быть приведены к типу T.</exception>
|
||
public static T GetRequiredDataAs<T>(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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверяет, содержится ли позиция в указанных границах.
|
||
/// </summary>
|
||
/// <param name="dropInfo">Информация о сбросе.</param>
|
||
/// <param name="bounds">Границы для проверки.</param>
|
||
/// <returns>true, если позиция находится в границах; в противном случае — false.</returns>
|
||
public static bool IsInBounds(this Models.DropInfo dropInfo, Rect bounds)
|
||
{
|
||
return bounds.Contains(dropInfo.Position);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверяет можно ли добавить эффект перетаскивания.
|
||
/// </summary>
|
||
/// <param name="dropInfo"></param>
|
||
/// <param name="effect"></param>
|
||
/// <returns></returns>
|
||
public static bool CanAcceptEffect(this Models.DropInfo dropInfo, DragDropEffects effect)
|
||
{
|
||
return dropInfo.AllowedEffects.HasEffect(effect);
|
||
}
|
||
} |