using System; using System.Collections.Generic; using System.ComponentModel; using TeamAAS.FlowEditor; using TeamAAS.FlowEditor.ProductModels; namespace Plugins.Vpp.Core { /// /// 「目标画面」名称下拉转换器:下拉项来自当前编辑产品的「画面列表」(ProductMeta.HomeFrames), /// 显示画面名称;选择名称后由 映射回画面序号存储。 /// 产品没有配置画面时允许手动输入名称/数字兜底。 /// public class FrameNameConverter : StringConverter { /// 当前编辑产品的画面列表(读不到返回空列表) internal static List GetFrames() { try { var pm = ProductManager.Instance; var cfg = pm.GetHomeFrameConfig(pm.CurrentProductName); return cfg?.HomeFrames ?? new List(); } catch { return new List(); } } /// 第 no 个画面的显示名称(越界/空名时补"画面N") internal static string GetFrameName(List frames, int no) { if (frames != null && no >= 1 && no <= frames.Count) { var name = frames[no - 1]?.Name; if (!string.IsNullOrWhiteSpace(name)) return name; } return $"画面{no}"; } /// 画面名称 → 序号(重名取第一个;"画面N"格式兜底;纯数字直接解析;找不到返回 0) internal static int ResolveFrameNo(string name) { if (string.IsNullOrWhiteSpace(name)) return 0; name = name.Trim(); var frames = GetFrames(); for (int i = 0; i < frames.Count; i++) { if (string.Equals((frames[i]?.Name ?? "").Trim(), name, StringComparison.Ordinal)) return i + 1; } if (int.TryParse(name, out int no)) return no; if (name.StartsWith("画面") && int.TryParse(name.Substring(2), out no)) return no; return 0; } public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true; // 有画面列表时排他(只能从下拉选),没有时允许手动输入 public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) => GetFrames().Count > 0; public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { var frames = GetFrames(); var names = new string[frames.Count]; for (int i = 0; i < frames.Count; i++) names[i] = GetFrameName(frames, i + 1); return new StandardValuesCollection(names); } } }