fix(ui): 采样统计显示一致化、GX 拖拽在布局边界下可用、信号「移动到…」与拖拽排序
一、采样间隔/频率显示不一致(用户报告 1ms vs 1000us、100us 0ns) * FormatDurationCompound 改为「先量化到整数皮秒、再整数分解」, 彻底消除同一数值因浮点噪声落到不同单位/留下零尾数的问题; 秒级分支与亚秒分支共用 totalPs 方案,次级进位/单位升级集中在一处。 * FormatFrequency 的单位选择改为按「舍入后的显示值」判定(999.9999999Hz 与 1000Hz 均为 1.000kHz),并做向下校正避免 0.001kHz。 二、选区截取面板 * 提示文本改为用户指定原文「启用双光标模式以进行选区截取」。 * EdgePanelWidth 计入该提示的实际文本宽度;绘制改用 UiTextClipped 不再省略。 * viewHeight 补回漏减的 bottomPad,修掉条目区与按钮之间的空白。 三、未展开的信号条目栏悬停不再变成手型光标。 四、开启「显示布局边界」后 GX 标签可正常拖拽排序 * 抽出 PaintLaneReorderOverlay(吸附槽位 + 被拖轮廓),贴图与整幅重绘共用。 * 整幅重绘在 LANE_REORDER 时按 LaneDragOffset 逐格平移重画(被拖网格最后画), 修掉调试模式下不跟随鼠标、无吸附提示、只能盲拖的问题。 五、信号右键新增「移动到…」二级菜单(位于「仅显示该信号」之上) * 条目为「分组 N(组名)」,当前组打勾;无标题行;底部「新建分组」。 * MenuItem::submenuMaxRows + PopupMenu 独立子菜单滚动(滚动条、滚轮、视口命中过滤), IsScrollable 计入子菜单可滚状态。 * 数据层 DataSet::MoveSignalToGroup/MoveSignal 让时间轴随信号搬运 (独占则移动、共享则复制);TabConfig::RemapAfterSignalMove 改写引用而非先删后插。 * Application::MoveSignalCore 统一入口,保证派生计算暂停、引用修正、选中迁移与同步一致。 六、信号列表支持按住拖拽排序(组内重排 / 跨组移动) * 4px 阈值进入拖拽;条目脱离原位跟随鼠标(阴影 + 强调色描边 + 插入指示线)。 * 其它信号行/分组行按插入位置做避让位移动画(RowRect 统一叠加插值位移, 宿主 kScrollTimerId 驱动 AdvanceSignalDragAnimation)。 * 数据层 DataSet::MoveSignal 支持任意位置;TabConfig::RemapAfterSignalReorder 线性重映射。 * 拖拽中禁用组名悬浮;双击改名与 InvalidateRows 均正确终止拖拽态。 验证:删 .o 全量重编译零 error / 零 warning;产物 873,984 B(< 1MB 预警阈值)。 本轮未使用鼠标/键盘/屏幕,未运行任何 GUI 探针,仅编译验证 + 源码级核对。
This commit is contained in:
1 parent
21a9865365
commit
97b361dedd
23 files changed
+1581
-74
No files matched your search
@@ -506,7 +506,9 @@ namespace jdi
|
||||
// 不含面板(例如与鼠标消息或 `kMessagePlotDerivedReady` 的失效区域交错),
|
||||
// 那一帧就**完全不重画面板** ⇒ 用户报告“过渡动画有时直接没了”。
|
||||
// ✓ 把动画状态直接纳入重绘条件(**只增加重绘条件,不改变任何绘制/回送路径**)。
|
||||
const bool panelAnimating = m_panel.ScrollAnimationActive() || m_panel.GroupAnimationActive();
|
||||
const bool panelAnimating = m_panel.ScrollAnimationActive() ||
|
||||
m_panel.GroupAnimationActive() ||
|
||||
m_panel.SignalDragAnimationActive();
|
||||
const bool overlaysVisible = m_menu.IsOpen() || m_colorPicker.IsOpen();
|
||||
// ⚠️ 两部分分开:
|
||||
// * `fullChrome` —— 标签栏 / 工具栏 / 整窗底色 / 面板都要重绘(有真内容变化);
|
||||
@@ -668,6 +670,7 @@ namespace jdi
|
||||
// 永远看不到最终数字。`PanelRefreshPending()` 为真时保持定时器,等
|
||||
// `kEdgeScanInteractiveIdleMs` 过去、某个非交互帧把面板按最新数字重画一次。
|
||||
if (m_panel.ScrollAnimationActive() || m_panel.GroupAnimationActive() ||
|
||||
m_panel.SignalDragAnimationActive() ||
|
||||
m_plot.LaneScrollAnimationActive() || m_plot.BackToTopAnimationActive() ||
|
||||
m_plot.PanelRefreshPending())
|
||||
{
|
||||
@@ -1755,6 +1758,32 @@ namespace jdi
|
||||
CloneSignalAdjusted(ref);
|
||||
return 0;
|
||||
}
|
||||
case kMessageMoveSignalToGroup:
|
||||
{
|
||||
// wParam = 源分组下标;lParam 低 16 位 = 目标分组下标(0xFFFF = 新建分组),
|
||||
// 高 16 位 = 源分组内的信号下标。
|
||||
const LONG_PTR packed = static_cast<LONG_PTR>(lParam);
|
||||
const int fromGroup = static_cast<int>(wParam);
|
||||
const int fromSignal = static_cast<int>(packed >> 16);
|
||||
const int targetRaw = static_cast<int>(packed & 0xFFFF);
|
||||
MoveSignalToGroup(fromGroup, fromSignal,
|
||||
(targetRaw == kMoveSignalNewGroupMarker) ? -1 : targetRaw);
|
||||
return 0;
|
||||
}
|
||||
case kMessageReorderSignal:
|
||||
{
|
||||
// wParam = (源分组 << 16) | 源信号下标;
|
||||
// lParam = (目标下标 << 16) | 目标分组(目标下标 0xFFFF = 末尾)。
|
||||
const LONG_PTR from = static_cast<LONG_PTR>(wParam);
|
||||
const LONG_PTR to = static_cast<LONG_PTR>(lParam);
|
||||
const int fromGroup = static_cast<int>(from >> 16);
|
||||
const int fromSignal = static_cast<int>(from & 0xFFFF);
|
||||
const int toGroup = static_cast<int>(to & 0xFFFF);
|
||||
const int toRaw = static_cast<int>(to >> 16);
|
||||
ReorderSignal(fromGroup, fromSignal, toGroup,
|
||||
(toRaw == kMoveSignalNewGroupMarker) ? -1 : toRaw);
|
||||
return 0;
|
||||
}
|
||||
case WM_TIMER:
|
||||
{
|
||||
// 标题栏内存占用:只改窗口标题,不动客户区,因此无需重绘。
|
||||
@@ -1785,14 +1814,17 @@ namespace jdi
|
||||
// 保证面板的最终位置被完整重绘并回送。
|
||||
if (wParam == kScrollTimerId)
|
||||
{
|
||||
const bool panelAnimating =
|
||||
m_panel.ScrollAnimationActive() || m_panel.GroupAnimationActive();
|
||||
const bool panelAnimating = m_panel.ScrollAnimationActive() ||
|
||||
m_panel.GroupAnimationActive() ||
|
||||
m_panel.SignalDragAnimationActive();
|
||||
// 绘图区自己的动画(网格滚动到可视区 / 「回到最上方」淡入淡出)也会改像素:
|
||||
// 它跟面板动画同时跑时,本帧**不能**跳过绘图区重绘(否则绘图区动画会冻结)。
|
||||
const bool plotAnimating =
|
||||
m_plot.LaneScrollAnimationActive() || m_plot.BackToTopAnimationActive();
|
||||
m_panel.AdvanceScrollAnimation();
|
||||
m_panel.AdvanceGroupAnimations();
|
||||
// 信号条目拖拽:幽灵行跟随鼠标 + 其它行的避让插值(用户 2026-11-03 要求)。
|
||||
m_panel.AdvanceSignalDragAnimation();
|
||||
m_plot.AdvanceLaneScrollAnimation();
|
||||
m_plot.AdvanceBackToTopAnimation();
|
||||
if (panelAnimating)
|
||||
|
||||
Reference in new issue
Block a user