// 文件位置: TH1_Presentation/Sequencer/Task/UISequencerTask.cs using System; using TH1_UI.Controller.Announce; using TH1_UI.Controller.Base; using TH1_UI.Core; using UnityEngine; namespace TH1_Presentation.Sequencer.Task { /// /// 一个专门用于按顺序显示 UI (ViewController) 的任务。 /// public class UISequencerTask : ISequencerTask { private readonly IViewControllerInterface _viewController; private readonly object _data; // 用于传递给UI的数据,可以是任何类型 private Action _onCompleteCallback; // 保存来自 PresentationManager 的完成回调 private bool _callbackRegistered = false; /// /// 创建一个UI显示任务。 /// /// 要显示的UI的控制器实例。 /// 可选,需要传递给UI的数据(例如,包含标题和内容的自定义类或元组)。 public UISequencerTask(IViewControllerInterface viewController, object data = null) { if (viewController == null) { throw new ArgumentNullException(nameof(viewController), "UISequencerTask cannot be created with a null ViewController."); } _viewController = viewController; _data = data; } public object GetData() { return _data; } public Type GetControllerType() { return _viewController.GetType(); } public string GetDescString() { return "UISequencerTask : " + _viewController.GetType().ToString(); } /// /// 执行任务:打开UI,并等待其关闭。 /// public void Execute(Action onComplete) { // 1. 保存 PresentationManager 的完成回调 _onCompleteCallback = onComplete; // 添加调试日志 //Debug.Log($"[TASK] Execute: {_viewController.Name}. Subscribing 'OnViewClosed'. Callback is currently '{(object)_viewController.OnClosedCallback ?? "null"}'."); // 2. 注册自己的回调到 ViewController 的关闭事件上 _viewController.OnClosedCallback += OnViewClosed; _callbackRegistered = true; // 添加调试日志 //Debug.Log($"[TASK] After Subscribe: {_viewController.Name}. Callback is now '{(object)_viewController.OnClosedCallback ?? "null"}'."); // 3. 打开界面 if (_data != null) _viewController.OpenWithParam(_data); else _viewController.Open(); } private void OnViewClosed() { // step #1 在通知前,立刻注销自己的回调 if (_callbackRegistered) { _viewController.OnClosedCallback -= OnViewClosed; _callbackRegistered = false; } //_viewController.OnClosedCallback -= OnViewClosed; // step #2. 通知 PresentationManager 任务已完成 _onCompleteCallback?.Invoke(); } public IViewControllerInterface GetController() { return _viewController; } /// /// 检查是否可以通过Esc/右键关闭 /// public bool CanCloseByEsc() { if (_viewController is IEscClosable closable) return closable.CanCloseByEsc(); return false; // 默认可关闭 } public void CancelMapHighlights() { if (_viewController is IEscClosable closable) closable.CancelMapHighlightsOrDoNothing(); } } }