1) 光标 2 的样式与光标 1 完全一致,并改用更鲜艳的颜色 - 原先光标 2 用朝上的三角把手,观感突兀;现两条光标统一为同款朝下三角 - 主题新增 cursorAlt 并改用 Solarized 洋红 #D33682(原青色偏灰),与光标 1 的 橙色 #CB4B16 同属暖色且更醒目,靠颜色而非形状区分 2) 光标允许滞留在网格可视区域之外(不再被强行夹回视野) - 删除"视图变化后夹取光标"的逻辑(时间轴选区放大、适应视图、按网格时间轴展开、 平移时都不再移动光标);仅在拖拽光标本身时才使用 ClampCursorToView(which) - 新增 CursorDisplayX(which):光标在视野外时把它的显示位置"钉"在最近的网格边缘, 取值标注与时间读数因此始终可见;数据点改为边缘三角指示(指向光标实际方向) - 命中测试改用"显示横坐标",因此被钉在边缘的光标仍可抓住拖回 3) 光标读数增加细描边,避免与背景/曲线颜色过于接近 - 新增 DrawLabelOutline():按文字颜色取反色做 1px 半透明描边, 网格内的取值胶囊、光标时间读数、差值标签统一使用 4) 双光标差值显示(时间轴上方居中,自适应单位,可拖拽、可编辑) - 新增 FormatDuration()/FormatDurationNumber()/ChosenDurationUnit(): 在 h / min / s / ms / us / ns / ps 之间自动选择单位(数值落在 [1,1000)) - 差值标签位于两条时间读数的中点,样式与时间读数一致 - 双击进入编辑:输入值采用**当前显示单位**;确认后**前方(时间较小)光标不动**, 后方光标移动到"前方 + 输入差值" - 标签支持左右拖拽(新增 PlotDragMode::CURSOR_SPAN_MOVE):两条光标整体平移、间隔不变 5) 双光标内容重叠时的层次与差值标签位置 - 新增 m_activeCursor:最后操作过(拖拽/单击/编辑)的光标其内容绘制在上层, 两条光标的竖线、取值胶囊、时间读数都按此顺序绘制 - 差值标签改为按**两条时间读数的实际净空**判断:放不下时自动落到主时间轴内部 (原先按光标线间距判断,光标被钉到边缘时会用差值标签盖住时间读数) 6) 选区放大的光标形状与颜色 - 未开始框选时不再改变鼠标形状(保持箭头);按下但未拖动时为十字 IDC_CROSS; 确定为时间轴选区后为左右箭头、Y 轴选区后为上下箭头 - 两种方向的选区统一使用强调色(原先 Y 轴选区用警示红,观感不一致) - 新增 Application::UpdateDragCursor():Windows 在鼠标捕获期间不派发 WM_SETCURSOR, 必须在 WM_MOUSEMOVE / WM_LBUTTONDOWN 后主动刷新光标形状,否则形状不会变化 7) 提示浮层加大并支持"停留后淡出",光标模式不再提示 - 提示字号由 uiSmall 改为 ui,胶囊 30px 高、内边距更大 - 新增停留 1300ms + 淡出 500ms 的时间控制;宿主用 WM_TIMER(33ms) 驱动重绘, 淡出结束自动 KillTimer(文字走 GDI 不支持 alpha,改为向胶囊底色混色实现淡出) - 「光标」三段式切换不再显示任何提示 验证([1].CSV 11 信号,窗口 1725x996,125% DPI): - 双光标:橙 0.63 / 洋红 0.7812,同款把手;底部时间读数 + 居中差值 "151.2 ms" - 放大到不含光标的区间:光标不移动,取值以边缘三角 + 胶囊贴边显示 - 拖拽差值标签:两光标从 0.63/0.7812 整体平移到 0.424202/0.575402,差值仍为 151.2 ms - 差值编辑:输入 300(显示单位为 ms)→ 前方光标保持 0.63,后方移动到 0.93 - 重叠层次:差值设为 0 时洋红(活动)在上;单击光标线后橙色(活动)在上 - 光标形状:未框选 ARROW / 按下 CROSS / 横向 SIZEWE / 纵向 SIZENS(cursor.ps1 实测) - 提示浮层:出现后约 1.3s 开始淡出、约 1.8s 消失;右键放弃选区后视图不变且模式保持选中 - 空闲 CPU 0.00%;make clean; make all 无警告无错误
91 lines
3.0 KiB
C++
91 lines
3.0 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);
|
||
// 第二光标用 Solarized 洋红:与橙色同族暖色但更鲜艳,对比清晰又不刺眼。
|
||
theme.cursorAlt = MakeArgb(kMagenta);
|
||
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
|