GFramework/GFramework.Godot/ui/CanvasItemUiPageBehaviorBase.cs
GeWuYou 35a06d2565 refactor(ui): 将CanvasItemUiPageBehavior重构为分层行为基类和工厂模式
- 移除原有的CanvasItemUiPageBehavior类
- 创建CanvasItemUiPageBehaviorBase抽象基类,统一管理生命周期逻辑
- 实现PageLayerUiPageBehavior处理页面层UI行为
- 实现OverlayLayerUiPageBehavior处理覆盖层UI行为
- 实现ModalLayerUiPageBehavior处理模态层UI行为
- 实现ToastLayerUiPageBehavior处理Toast层UI行为
- 实现TopmostLayerUiPageBehavior处理顶层UI行为
- 创建UiPageBehaviorFactory工厂类按层级创建对应的行为实例
- 添加Apache License 2.0版权声明到所有新文件
2026-02-07 21:28:15 +08:00

185 lines
5.2 KiB
C#

// Copyright (c) 2026 GeWuYou
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using GFramework.Game.Abstractions.enums;
using GFramework.Game.Abstractions.ui;
using GFramework.Godot.extensions;
using Godot;
namespace GFramework.Godot.ui;
/// <summary>
/// UI 页面行为基类,封装通用的生命周期管理逻辑。
/// 提供对 CanvasItem 类型视图节点的统一管理,包括显示、隐藏、进入、退出等操作。
/// </summary>
/// <typeparam name="T">CanvasItem 类型的视图节点。</typeparam>
public abstract class CanvasItemUiPageBehaviorBase<T> : IUiPageBehavior
where T : CanvasItem
{
/// <summary>
/// UI 的唯一标识键。
/// </summary>
private readonly string _key;
/// <summary>
/// IUiPage 接口引用(如果视图实现了该接口)。
/// </summary>
private readonly IUiPage? _page;
/// <summary>
/// 视图节点的所有者实例。
/// </summary>
protected readonly T Owner;
/// <summary>
/// 初始化 CanvasItemUiPageBehaviorBase 实例。
/// </summary>
/// <param name="owner">视图节点的所有者实例。</param>
/// <param name="key">UI 的唯一标识键。</param>
protected CanvasItemUiPageBehaviorBase(T owner, string key)
{
Owner = owner;
_key = key;
_page = owner as IUiPage;
}
#region -
/// <summary>
/// 获取 UI 所属的层级。
/// 由子类指定具体值。
/// </summary>
public abstract UiLayer Layer { get; }
/// <summary>
/// 获取是否支持重入。
/// 由子类指定具体值。
/// </summary>
public abstract bool IsReentrant { get; }
/// <summary>
/// 获取是否为模态窗口。
/// 由子类指定默认值。
/// </summary>
public abstract bool IsModal { get; }
/// <summary>
/// 获取是否阻止下层输入。
/// 由子类指定默认值。
/// </summary>
public abstract bool BlocksInput { get; }
#endregion
#region
/// <summary>
/// 获取视图节点实例。
/// </summary>
public object View => Owner;
/// <summary>
/// 获取 UI 的唯一标识键。
/// </summary>
public string Key => _key;
/// <summary>
/// 获取视图节点是否有效。
/// </summary>
public bool IsAlive => Owner.IsValidNode();
/// <summary>
/// 获取视图节点是否可见。
/// </summary>
public bool IsVisible => Owner.Visible;
#endregion
#region
/// <summary>
/// 当 UI 进入时调用。
/// 默认调用 IUiPage 接口的 OnEnter 方法(如果存在)。
/// </summary>
/// <param name="param">进入参数。</param>
public virtual void OnEnter(IUiPageEnterParam? param)
{
_page?.OnEnter(param);
}
/// <summary>
/// 当 UI 退出时调用。
/// 默认调用 IUiPage 接口的 OnExit 方法(如果存在),并释放视图节点。
/// </summary>
public virtual void OnExit()
{
_page?.OnExit();
Owner.QueueFreeX();
}
/// <summary>
/// 当 UI 暂停时调用。
/// 默认调用 IUiPage 接口的 OnPause 方法(如果存在),并根据 BlocksInput 决定是否暂停处理逻辑。
/// </summary>
public virtual void OnPause()
{
_page?.OnPause();
// 只有阻止输入的 UI 才需要暂停处理
if (!BlocksInput) return;
Owner.SetProcess(false);
Owner.SetPhysicsProcess(false);
Owner.SetProcessInput(false);
}
/// <summary>
/// 当 UI 恢复时调用。
/// 默认调用 IUiPage 接口的 OnResume 方法(如果存在),并恢复处理逻辑。
/// </summary>
public virtual void OnResume()
{
if (Owner.IsInvalidNode())
return;
_page?.OnResume();
// 恢复处理
Owner.SetProcess(true);
Owner.SetPhysicsProcess(true);
Owner.SetProcessInput(true);
}
/// <summary>
/// 当 UI 隐藏时调用。
/// 默认调用 IUiPage 接口的 OnHide 方法(如果存在),并隐藏视图节点。
/// </summary>
public virtual void OnHide()
{
_page?.OnHide();
Owner.Hide();
}
/// <summary>
/// 当 UI 显示时调用。
/// 默认调用 IUiPage 接口的 OnShow 方法(如果存在),并显示视图节点,同时触发恢复逻辑。
/// </summary>
public virtual void OnShow()
{
_page?.OnShow();
Owner.Show();
OnResume();
}
#endregion
}