2026-08-14 14:43:11 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using CycleGUI;
|
|
|
|
|
|
|
|
|
|
|
|
namespace StandardScene.Signal.Ui
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-08-17 15:20:27 +08:00
|
|
|
|
/// CycleGUI 独立窗口打开某一类 Model 列表(进程工具栏「打开机构/握手点/放行点列表」触发)。
|
2026-08-14 14:43:11 +08:00
|
|
|
|
/// </summary>
|
2026-08-17 15:20:27 +08:00
|
|
|
|
/// <remarks>
|
|
|
|
|
|
/// 每种 T 共用一个静态窗口:已打开则前置,关掉后下次再 DeclarePanel。
|
|
|
|
|
|
/// 真正的增删改在 <see cref="ModelTableEditor{T}"/>,保存直接写 JSON,
|
|
|
|
|
|
/// 不自动 Reload 进程内 Worker,需再到进程上点「重新加载配置」。
|
|
|
|
|
|
/// </remarks>
|
2026-08-14 14:43:11 +08:00
|
|
|
|
public static class ModelListPanel<T> where T : class, new()
|
|
|
|
|
|
{
|
2026-08-17 15:20:27 +08:00
|
|
|
|
/// <summary>当前已声明的面板;关闭或异常后置 null,允许再次 Open。</summary>
|
2026-08-14 14:43:11 +08:00
|
|
|
|
private static Panel _panel;
|
|
|
|
|
|
|
2026-08-17 15:20:27 +08:00
|
|
|
|
private static readonly ModelTableEditor<T> Editor = new ModelTableEditor<T>();
|
2026-08-14 14:43:11 +08:00
|
|
|
|
|
2026-08-17 15:20:27 +08:00
|
|
|
|
/// <param name="title">窗口标题。</param>
|
|
|
|
|
|
/// <param name="path">JSON 绝对路径(应先经 SignalConfigStore.Resolve)。</param>
|
|
|
|
|
|
/// <param name="keySelector">主键,添加/保存时查重(机构名、站点号等)。</param>
|
2026-08-14 14:43:11 +08:00
|
|
|
|
public static void Open(string title, string path, Func<T, string> keySelector)
|
|
|
|
|
|
{
|
2026-08-17 15:20:27 +08:00
|
|
|
|
Editor.Bind(path, keySelector ?? (_ => ""), typeof(T).Name);
|
|
|
|
|
|
|
2026-08-14 14:43:11 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-17 15:20:27 +08:00
|
|
|
|
Editor.Render(pb);
|
2026-08-14 14:43:11 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|