using Lattice.Core.Models.Enums;
using Microsoft.UI.Xaml;
using Windows.Foundation;
namespace Lattice.UI.Services;
///
/// Сервис для анализа визуального дерева и расчета зон взаимодействия.
///
public static class VisualTreeService
{
///
/// Определяет зону докинга на основе позиции курсора относительно элемента.
///
/// Визуальный элемент (панель), над которым находится курсор.
/// Координаты курсора относительно левого верхнего угла элемента.
/// Направление докинга (DockDirection).
public static DockDirection GetHitZone(FrameworkElement element, Point relativePoint)
{
double w = element.ActualWidth;
double h = element.ActualHeight;
// 1. Зона центра (обычно это 40% центральной области)
// Если курсор в центре, вкладка просто добавится в текущий TabView.
double centerX = w * 0.3;
double centerY = h * 0.3;
Rect centerRect = new Rect(centerX, centerY, w * 0.4, h * 0.4);
if (centerRect.Contains(relativePoint))
{
return DockDirection.Center;
}
// 2. Расчет по диагоналям для боковых зон
// Представьте конверт: линии из углов в центр. Это самый точный способ
// определения стороны в стиле Visual Studio.
// Нормализуем координаты в диапазон от 0 до 1
double nx = relativePoint.X / w;
double ny = relativePoint.Y / h;
// Уравнения диагоналей: y = x и y = 1 - x
bool isAbovePrimary = ny < nx;
bool isAboveSecondary = ny < (1 - nx);
if (isAbovePrimary && isAboveSecondary) return DockDirection.Top;
if (isAbovePrimary && !isAboveSecondary) return DockDirection.Right;
if (!isAbovePrimary && isAboveSecondary) return DockDirection.Left;
return DockDirection.Bottom;
}
}