using System; using CycleGUI; namespace StandardScene.Signal.Ui { /// /// CycleGUI 独立窗口打开某一类 Model 列表(进程工具栏「打开机构/握手点/放行点列表」触发)。 /// /// /// 每种 T 共用一个静态窗口:已打开则前置,关掉后下次再 DeclarePanel。 /// 真正的增删改在 ,保存直接写 JSON, /// 不自动 Reload 进程内 Worker,需再到进程上点「重新加载配置」。 /// public static class ModelListPanel where T : class, new() { /// 当前已声明的面板;关闭或异常后置 null,允许再次 Open。 private static Panel _panel; private static readonly ModelTableEditor Editor = new ModelTableEditor(); /// 窗口标题。 /// JSON 绝对路径(应先经 SignalConfigStore.Resolve)。 /// 主键,添加/保存时查重(机构名、站点号等)。 public static void Open(string title, string path, Func keySelector) { Editor.Bind(path, keySelector ?? (_ => ""), typeof(T).Name); if (_panel != null) { try { _panel.BringToFront(); return; } catch { _panel = null; } } var panel = GUI.DeclarePanel() .ShowTitle(title) .SetDefaultDocking(Panel.Docking.None) .InitSize(1100, 720) .InitPos(false, 0, 0, 0.5f, 0.5f, 0.5f, 0.5f); _panel = panel; panel.IfTerminalQuit(() => { if (_panel == panel) _panel = null; }); panel.Define(pb => { if (pb.Closing()) { panel.Exit(); _panel = null; return; } Editor.Render(pb); }); } } }