using GFramework.Game.Abstractions.enums; using GFramework.Game.Abstractions.ui; using GFramework.Godot.extensions; using Godot; namespace GFramework.Godot.ui; /// /// 控制 UI 页面行为的泛型行为类, /// 支持所有继承自 CanvasItem 的节点 /// /// CanvasItem 类型的视图节点 public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior where T : CanvasItem { private readonly IUiPage? _page = owner as IUiPage; /// /// 获取当前UI层的类型。 /// 返回值表示当前页面所属的UI层级,此处固定返回UiLayer.Page。 /// public UiLayer Layer => UiLayer.Page; /// /// 判断当前Page是否允许重入。 /// 返回值为false,表示该Page不支持重入操作。 /// public bool IsReentrant => false; /// /// 获取页面视图对象 /// /// 返回与当前实例关联的视图对象 public object View => owner; /// /// 获取当前实例的键值标识符 /// /// 返回用于标识当前实例的键字符串 public string Key => key; /// /// 获取页面是否存活状态 /// /// 如果页面节点有效则返回true,否则返回false public bool IsAlive => owner.IsValidNode(); /// /// 获取页面是否可见状态 /// /// 如果页面可见则返回true,否则返回false public bool IsVisible => owner.Visible; /// /// 页面进入时调用 /// /// 页面进入参数 public void OnEnter(IUiPageEnterParam? param) { _page?.OnEnter(param); } /// /// 页面退出时调用 /// public void OnExit() { _page?.OnExit(); owner.QueueFreeX(); } /// /// 页面暂停时调用 /// public void OnPause() { _page?.OnPause(); // 暂停节点的处理、物理处理和输入处理 if (!BlocksInput) return; owner.SetProcess(false); owner.SetPhysicsProcess(false); owner.SetProcessInput(false); } /// /// 页面恢复时调用 /// public void OnResume() { if (owner.IsInvalidNode()) { return; } _page?.OnResume(); // 恢复节点的处理、物理处理和输入处理 owner.SetProcess(true); owner.SetPhysicsProcess(true); owner.SetProcessInput(true); } /// /// 页面隐藏时调用 /// public void OnHide() { _page?.OnHide(); owner.Hide(); } /// /// 页面显示时调用 /// public void OnShow() { _page?.OnShow(); owner.Show(); OnResume(); } /// /// 获取或设置页面是否为模态对话框 /// public bool IsModal { get; set; } /// /// 获取或设置页面是否阻止输入 /// public bool BlocksInput { get; set; } = true; }