using System;
using System.Collections.Generic;
using System.ComponentModel;
using Newtonsoft.Json;
using PropertyGridLib.Attributes;
namespace TeamAAS.FlowEditor.ProductModels
{
/// 主页画面排列方式
public enum FrameArrangeMode
{
水平优先 = 1,
垂直优先 = 2
}
/// 主页画面项:一个画面框的名称 + 状态圆点开关(在属性编辑器的画面列表中添加/删除)
[Serializable]
public class HomeFrameItem
{
[DisplayName("1.画面名称")]
[Description("显示在画面框顶部标题栏")]
public string Name { get; set; } = "";
[DisplayName("2.显示状态圆点")]
[Description("勾选后该画面框右上角显示 OK/NG 状态圆点")]
public bool ShowDot { get; set; } = false;
public override string ToString() => Name;
}
/// 产品元数据:画面列表 / 排列 / 描述 / 序号,持久化到 Products/<productName>/product.json。
[Serializable]
public class ProductMeta
{
[Browsable(false)]
public int Sequence { get; set; }
[Browsable(false)]
public string Name { get; set; } = "";
[Category("I.基本信息")]
[DisplayName("1.画面列表")]
[Description("添加/删除主页画面;空列表 = 主页面不显示画面框")]
[CollectionEditor(CanAdd = true, CanRemove = true, CanSort = true)]
public List HomeFrames { get; set; } = new List();
[Category("I.基本信息")]
[DisplayName("2.画面排列")]
[Description("水平优先 = 按行铺设;垂直优先 = 按列铺设")]
public FrameArrangeMode HomeFrameArrange { get; set; } = FrameArrangeMode.水平优先;
[Category("I.基本信息")]
[DisplayName("3.产品描述")]
[Description("产品的备注说明")]
public string Description { get; set; } = "";
// ── 以下为旧版画面配置字段(画面数/分号名称/分号圆点),仅用于旧配置自动迁移,不再使用 ──
[Browsable(false)]
public int HomeFrameCount { get; set; } = 0;
[Browsable(false)]
public string HomeFrameNames { get; set; } = "";
[Browsable(false)]
public string HomeFrameShowDot { get; set; } = "";
/// 取第 index 个画面名称(越界/缺失时补"画面N")
public string GetFrameName(int index)
{
if (index >= 0 && HomeFrames != null && index < HomeFrames.Count)
{
var name = HomeFrames[index].Name;
if (!string.IsNullOrWhiteSpace(name)) return name;
}
return $"画面{index + 1}";
}
/// 取第 index 个画面是否显示状态圆点(越界/缺失时 false=不显示)
public bool GetFrameShowDot(int index)
{
if (index >= 0 && HomeFrames != null && index < HomeFrames.Count)
return HomeFrames[index].ShowDot;
return false;
}
///
/// 旧版配置迁移:把旧字段(画面数/分号名称/分号圆点)转换成 HomeFrames 列表。
/// 在 LoadProductMeta 反序列化后调用一次;新格式(HomeFrames 非空)直接跳过。
///
public void MigrateLegacyFrames()
{
if (HomeFrames != null && HomeFrames.Count > 0) return; // 已是新格式
if (HomeFrameCount <= 0) return;
var names = (HomeFrameNames ?? "").Split(new[] { ';', ';' }, StringSplitOptions.RemoveEmptyEntries);
var dots = (HomeFrameShowDot ?? "").Split(new[] { ';', ';' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < HomeFrameCount; i++)
{
var name = i < names.Length ? names[i].Trim() : "";
if (string.IsNullOrWhiteSpace(name)) name = $"画面{i + 1}";
bool showDot = i < dots.Length && bool.TryParse(dots[i].Trim(), out var d) && d;
HomeFrames.Add(new HomeFrameItem { Name = name, ShowDot = showDot });
}
// 迁移完成,清空旧字段避免重复迁移
HomeFrameCount = 0;
HomeFrameNames = "";
HomeFrameShowDot = "";
}
/// 主页画面框水平排列(HomeFrameArrange=水平优先)
[JsonIgnore]
public bool IsHorizontalArrange
{
get => HomeFrameArrange == FrameArrangeMode.水平优先;
set { if (value) HomeFrameArrange = FrameArrangeMode.水平优先; }
}
/// 主页画面框垂直排列(HomeFrameArrange=垂直优先)
[JsonIgnore]
public bool IsVerticalArrange
{
get => HomeFrameArrange == FrameArrangeMode.垂直优先;
set { if (value) HomeFrameArrange = FrameArrangeMode.垂直优先; }
}
}
}