using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace XericUI.Form
{
#region 枚举与结构体
public enum FormRangeSpace
{
RelativeOffset,
CanvasLocal,
AnchorToSelf,
AnchorToCanvas
}
[System.Serializable]
public struct RangeRect
{
[Tooltip("坐标空间")]
public FormRangeSpace space;
[Tooltip("范围定义")]
public Rect rect;
}
#endregion
///
/// UI 窗体控制器 — 挂载到窗口根 GameObject 上,自身即为完整窗口。
/// 支持全屏/还原、边缘吸附、自动隐藏、拖拽移动、置顶。
/// 通过 WindowEntry 与 Manager 通信。
///
[AddComponentMenu("Xeric UI Vessel/Form/UI Form Controller")]
[RequireComponent(typeof(RectTransform))]
public class UIFormController : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerDownHandler
{
#region 序列化字段
[Header("窗口基本设置")]
[SerializeField, Tooltip("窗口标题")]
private string m_WindowTitle = "Window";
[Header("边缘吸附")]
[SerializeField, Tooltip("启用边缘自动吸附")]
private bool m_EnableAutoSnap = true;
[SerializeField, Tooltip("吸附阈值(像素)")]
private float m_SnapThreshold = 8f;
[Header("自动隐藏")]
[SerializeField, Tooltip("启用自动隐藏")]
private bool m_EnableAutoHide;
[SerializeField, Tooltip("自动隐藏滑动方向")]
private AutoHideDirection m_AutoHideDirection = AutoHideDirection.Left;
[Header("调试")]
[SerializeField, Tooltip("编辑器调试模式")]
private bool m_DebugMode = true;
[SerializeField, Tooltip("输出事件日志")]
private bool m_DebugLogEvents;
#endregion
#region 公开属性
public string WindowTitle => m_WindowTitle;
public bool IsMaximized => _windowState == WindowState.Maximized;
public bool IsEdgeHidden => _windowState == WindowState.EdgeHidden;
public WindowState CurrentState => _windowState;
public bool AutoSnapEnabled => m_EnableAutoSnap;
public bool AutoHideEnabled => m_EnableAutoHide;
public AutoHideDirection HideDirection => m_AutoHideDirection;
public bool DebugMode => m_DebugMode;
/// 窗口数据 Entry(由 Manager 在 CreateWindow 时注入)
public WindowEntry Entry
{
get => _entry;
set
{
_entry = value;
if (_entry != null)
m_WindowTitle = _entry.Title;
}
}
/// 父级 Manager 引用
public UIFormManager Manager => _manager;
#endregion
#region 内部状态
private RectTransform _rectTransform;
private Canvas _canvas;
private RectTransform _canvasRt;
private UIFormManager _manager;
private WindowEntry _entry;
private WindowState _windowState = WindowState.Normal;
// 拖拽
private Vector2 _dragOffset;
// 全屏还原
private Vector2 _savePos;
private Vector2 _saveSize;
private Vector2 _saveAnchorMin;
private Vector2 _saveAnchorMax;
// 边缘隐藏
private Vector2 _edgeVisiblePos;
private Vector2 _edgeHiddenPos;
private Coroutine _autoHideCoroutine;
// 悬停
private bool _isHovering;
#endregion
#region 生命周期
protected virtual void Awake()
{
_rectTransform = (RectTransform)transform;
_manager = GetComponentInParent();
_canvas = GetComponentInParent