- 信号悬停提示改为"锚定在首次出现位置":新增 m_hoverAnchorX/Y, PaintSignalInteraction 用锚点而非当前鼠标位置;同时补回 OnMouseMove 里 漏写的 m_hoverSignal 赋值(该行缺失会导致悬停提示完全不显示)。 - 选区放大(RUBBER_SELECT)的提示文字按阶段切换: 开启开关 -> 「横向或纵向拖动以放大选择区域,ESC退出选区模式」; 左键按下不显示提示;开始拖动后维持「右键取消选区,ESC退出选区模式」; 松开左键后淡出。新增 SetHintSticky/ReleaseHint(m_hintSticky 期间阻塞淡出), HintNeedsAnimation() 驱动宿主的淡出定时器。 - 两个时间光标统一为同一颜色与样式(去掉 theme.cursorAlt,仅保留 theme.cursor); 光标把手统一为同一形状。工具栏按钮文案动态化: 未选中「光标」/ 单光标「光标x1」/ 双光标「光标x2」 (Toolbar::SetActionLabel 返回是否变化,变化时 Application::Relayout() 以重算按钮宽度)。 - 取值胶囊避让重叠:PaintCursor 先把两条时间读数标签与 Δt 标签的矩形预填进 m_cursorLabelRects,取值标签逐条检测重叠并向下/向上让位, 多信号数据点重合或过近时读数不再互相覆盖。 两光标靠近时,光标 2 的时间读数标签自动上移一层叠放,避免互相覆盖。 - 双光标时间读数与 Δt 差值标签支持拖拽,并区分悬停与拖拽: 悬停显示手形(IDC_HAND),拖拽统一使用抓握图标(IDC_SIZEALL, 用 m_dragOnLabel 与"直接在光标线上抓取"的左右箭头区分); Δt 标签拖拽时两条光标整体平移,差值保持不变。 - Δt 差值显示样式与光标时间读数一致,文案为「Δt <时间差值>」,单位复合化: >= 60s 一路整合到 h/min/s(3662s -> 「1h 1min 2s」);1~60s 显示整秒, 非整数时补 ms(5.06s -> 「5s 60ms」,5s -> 「5s」);< 1s 逐级降到 ms/us/ns/ps 且只降一级,顶级单位为 ps 时不再降级并保留小数(「5.123 ps」)。 - 双击 Δt 进入编辑时数值量级始终为秒(例如显示 1min 时编辑框为 60.0), 修正进入高级单位后(如 1.5min)编辑框只显示 1.5 的问题。 验证(使用 TestData/VERY_BIG_DATA.CSV,1.77GB / 5 信号): - 悬停提示停留在首次出现位置,网格内继续移动鼠标不再跟随。 - 选区放大提示:开启/按下/拖动/松开四个阶段的文案与淡出均符合预期。 - 工具栏文案 光标 / 光标x1 / 光标x2 正常;两光标样式与颜色完全一致。 - 5 条信号合并网格时取值标签全部完整可见,无覆盖。 - 光标形态探测:时间读数标签与 Δt 标签悬停 HAND、拖拽 SIZEALL; 直接在光标线上拖拽仍为 SIZEWE。 - Δt 分别输入 3662 / 5.06 / 5.123e-12 秒得到「Δt 1h 1min 2s」/ 「Δt 5s 60ms」/「Δt 5.11591 ps」;整数秒显示「Δt 5s」。 - 双击 Δt(显示 15s 457.214ms)编辑框内容为 15.4572(秒)。 - Δt 标签拖拽 (-320px):光标 64.4051/79.8623 -> 30.743/46.2002,差值保持 15.4572。 - 两光标靠近时时间读数标签上下叠放、Δt 标签落位正确,取值标签不重叠。 - [1].CSV 回归正常;make clean && make all 无警告无错误。
89 lines
2.8 KiB
C++
89 lines
2.8 KiB
C++
#include "Theme.hpp"
|
||
|
||
namespace jdi
|
||
{
|
||
|
||
namespace
|
||
{
|
||
// Solarised Light 基础色板。
|
||
const std::uint32_t kBase03 = 0x002B36u; // #002B36
|
||
const std::uint32_t kBase02 = 0x073642u; // #073642
|
||
const std::uint32_t kBase01 = 0x586E75u; // #586E75
|
||
const std::uint32_t kBase00 = 0x657B83u; // #657B83
|
||
const std::uint32_t kBase0 = 0x839496u; // #839496
|
||
const std::uint32_t kBase1 = 0x93A1A1u; // #93A1A1
|
||
const std::uint32_t kBase2 = 0xEEE8D5u; // #EEE8D5
|
||
const std::uint32_t kBase3 = 0xFDF6E3u; // #FDF6E3
|
||
|
||
// Solarised 强调色。
|
||
const std::uint32_t kYellow = 0xB58900u; // #B58900
|
||
const std::uint32_t kOrange = 0xCB4B16u; // #CB4B16
|
||
const std::uint32_t kRed = 0xDC322Fu; // #DC322F
|
||
const std::uint32_t kMagenta = 0xD33682u; // #D33682
|
||
const std::uint32_t kViolet = 0x6C71C4u; // #6C71C4
|
||
const std::uint32_t kBlue = 0x268BD2u; // #268BD2
|
||
const std::uint32_t kCyan = 0x2AA198u; // #2AA198
|
||
const std::uint32_t kGreen = 0x859900u; // #859900
|
||
|
||
/** @brief 波形默认配色,按视觉对比度排序。 */
|
||
const std::uint32_t kSignalPalette[] = {
|
||
MakeArgb(kBlue), MakeArgb(kGreen), MakeArgb(kRed), MakeArgb(kViolet),
|
||
MakeArgb(kYellow), MakeArgb(kCyan), MakeArgb(kMagenta), MakeArgb(kOrange),
|
||
MakeArgb(kBase01), MakeArgb(kBase0),
|
||
};
|
||
|
||
/** @brief 全局唯一主题实例。 */
|
||
const Theme kSolarizedLight = []
|
||
{
|
||
Theme theme;
|
||
theme.windowBg = MakeArgb(kBase3);
|
||
theme.toolbarBg = MakeArgb(kBase2);
|
||
theme.panelBg = MakeArgb(kBase2);
|
||
theme.cardBg = MakeArgb(kBase3);
|
||
theme.statusBg = MakeArgb(kBase2);
|
||
theme.plotBg = MakeArgb(kBase3);
|
||
theme.border = MakeArgb(0xD9D1BCu);
|
||
theme.borderStrong = MakeArgb(kBase1);
|
||
|
||
theme.text = MakeArgb(kBase00);
|
||
theme.textStrong = MakeArgb(kBase02);
|
||
theme.textMuted = MakeArgb(kBase1);
|
||
theme.textOnAccent = MakeArgb(kBase3);
|
||
|
||
theme.accent = MakeArgb(kBlue);
|
||
theme.accentSoft = MakeArgb(0xCFE4F3u);
|
||
theme.hover = MakeArgb(0xE4DCC6u);
|
||
theme.pressed = MakeArgb(0xD8CFB6u);
|
||
theme.selection = MakeArgb(0xDCEAF6u);
|
||
|
||
// 网格线需要在绘图区底色(kBase3)上清晰可辨,同时又要与网格边界
|
||
// (axisLine/borderStrong 的蓝灰)明显区分——因此采用偏暖的加深米色。
|
||
theme.gridWeak = MakeArgb(0xDDD3B8u);
|
||
theme.gridStrong = MakeArgb(0xC3B896u);
|
||
theme.axisLine = MakeArgb(kBase1);
|
||
theme.cursor = MakeArgb(kOrange);
|
||
theme.readoutBg = MakeArgb(0xF6EFDCu);
|
||
theme.danger = MakeArgb(kRed);
|
||
theme.warning = MakeArgb(kYellow);
|
||
return theme;
|
||
}();
|
||
}
|
||
|
||
const Theme& SolarizedLight()
|
||
{
|
||
return kSolarizedLight;
|
||
}
|
||
|
||
const std::uint32_t* SignalPalette(int& count)
|
||
{
|
||
count = static_cast<int>(sizeof(kSignalPalette) / sizeof(kSignalPalette[0]));
|
||
return kSignalPalette;
|
||
}
|
||
|
||
int SignalColorCount()
|
||
{
|
||
return static_cast<int>(sizeof(kSignalPalette) / sizeof(kSignalPalette[0]));
|
||
}
|
||
|
||
} // namespace jdi
|