fix: 修复网格徽标菜单与标签页编号,重构样式区并新增透明度与浮动拾色器

信号列表
- 网格徽标(G1/G2)改为在左键抬起时弹出菜单,修复此前「按住才显示、松手即消失」的问题。
- 文件分组行新增关闭按钮(✕),可直接从工作区移除文件,与右键菜单「关闭该文件」等价。
- 信号名改为完整保留文件内的列名原文,不再剥离 "[n]" 序号前缀与括号内容。

标签页
- 新建标签页改用「当前未被占用的最小编号」,关闭标签页后编号可被复用,
  修复「开 3 关 2 再新建会变成视图 4」的问题。

样式编辑区(统一为固定四行网格布局,面板缩放时不再错位)
- 移除顶部「样式 · 信号名 · 文件名」标题行,选中信号即为编辑对象。
- 绘制方式取消「阶梯」,标签由「方式」改为「样式」,仅保留线段 / 散点 / 点线。
- 线宽仅保留最细与最粗两个预设,中间改为带左右箭头的数值旋钮,单位为 px;
  支持单击或双击数值框直接键入(首次键入替换原值,回车提交、Esc 取消、越界钳制到 0.5-6.0)。
- 颜色预设后新增与预设色块完全同尺寸、同外框样式的「加号」小方格,
  点击后弹出浮动拾色面板(与 G1/G2 菜单同风格的浮动窗口),支持 RGB 三通道滑块、
  实时预览与十六进制显示;点击面板外部即收起,取色实时应用到当前信号。
- 移除样式区末尾的网格选择控件,该功能统一由信号行的 G 徽标承载。
- 新增透明度滑块,默认 100%,可在 0-100% 之间调节,并实时反映到波形、
  图例色块与信号行色块的显示效果。

其他
- 信号面板默认宽度与行内间距微调,使较长的列名可以完整显示。
- 失焦时提交线宽输入并收起浮动拾色器与弹出菜单。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-09-29 17:14:27 +08:00
1 parent eb868b2679
commit 729494d1ec
9 files changed
+1254 -471

No files matched your search

+4 -80
View File
@@ -37,44 +37,9 @@ namespace jdi
return ContainsInsensitive(text, L"time") || ContainsInsensitive(text, L"时间");
}
/**
* @brief 剥离列名中的 "[n]" 序号前缀,得到显示名称。
* @param [IN] header 原始列名。
* @return 显示名称。
*/
std::wstring MakeDisplayName(const std::wstring& header)
{
const std::wstring text = Trim(header);
if (text.size() >= 3 && text[0] == L'[')
{
const std::size_t close = text.find(L']');
if (close != std::wstring::npos && close > 1 && (close + 1) < text.size())
{
bool numeric = true;
for (std::size_t i = 1; i < close; ++i)
{
if (!iswdigit(text[i]))
{
numeric = false;
break;
}
}
if (numeric)
{
const std::wstring rest = Trim(text.substr(close + 1));
if (!rest.empty())
{
return rest;
}
}
}
}
return text.empty() ? header : text;
}
/**
* @brief 从名称末尾的括号中提取单位(仅接受形如 mA / V / deg/s 的短标记)。
* @param [IN] text 已剥离 "[n]" 前缀的名称。
* @param [IN] text 列名(已去除首尾空白)。
* @return 单位文本,无法识别时返回空字符串。
*/
std::wstring ExtractUnit(const std::wstring& text)
@@ -109,46 +74,6 @@ namespace jdi
return inner;
}
/**
* @brief 从名称末尾移除已被识别为单位(或描述)的括号片段。
* @param [IN] name 已剥离 "[n]" 前缀的名称。
* @return 移除尾部括号后的名称(括号片段非单位时原样返回)。
*/
std::wstring StripBracketSuffix(const std::wstring& name)
{
if (name.size() < 3 || name.back() != L')')
{
return name;
}
const std::size_t open = name.rfind(L'(');
if (open == std::wstring::npos || open == 0 || open + 2 >= name.size())
{
return name;
}
const std::wstring inner = Trim(name.substr(open + 1, name.size() - open - 2));
if (inner.empty() || inner.size() > 10)
{
return name;
}
// 仅当括号内容为短单位标记时才剥离,避免误伤 "(5 Points)" 这类描述。
for (const wchar_t c : inner)
{
const bool allowed = iswalpha(c) || iswdigit(c) || c == L'%' || c == L'/' || c == L'^' ||
c == L'-' || c == L'.' || c == L'\u00B0' || c == L'\u00B5' ||
c == L'\u03A9' || c == L'\u00B2' || c == L'\u00B3' || c == L'\u00B7';
if (!allowed)
{
return name;
}
}
const std::wstring head = Trim(name.substr(0, open));
return head.empty() ? name : head;
}
/**
* @brief 依据全局信号序号从调色板取色,保证跨标签页配色一致。
* @param [IN] globalIndex 全局信号序号。
@@ -421,10 +346,9 @@ namespace jdi
SignalData signal;
signal.rawHeader = table.headers[column];
{
// 名称与单位分开保存:名称不再保留尾部单位括号,避免重复显示。
const std::wstring baseName = MakeDisplayName(signal.rawHeader);
signal.unit = ExtractUnit(baseName);
signal.name = StripBracketSuffix(baseName);
// 名称完整保留文件内的列名(含 "[n]" 序号与括号描述),仅用于展示不做改写。
signal.name = Trim(signal.rawHeader);
signal.unit = ExtractUnit(signal.name);
}
signal.values.resize(rowCount);