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