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
@@ -706,6 +706,47 @@ namespace jdi
|
||||
*/
|
||||
bool ForkAxisForSignal(int groupIndex, int signalIndex, std::size_t& axisIndex);
|
||||
|
||||
/**
|
||||
* @brief 把一条信号移动到**另一个分组**(追加到目标分组末尾)。
|
||||
*
|
||||
* 用于信号右键菜单的「移动到…」(用户 2026-11-03 要求):把信号从原分组摘出来、
|
||||
* 插入另一个分组(含「新建分组」)。
|
||||
*
|
||||
* ⚠️ **时间轴必须随信号一起走**:`SignalData::axisIndex` 指向**所属分组**的
|
||||
* `axes`,跨组移动后原下标毫无意义。这里的处理是:
|
||||
* * 该信号的轴**只被它自己使用** → 把轴 move 到目标分组(零拷贝,并从源分组删掉,
|
||||
* 源分组内其余信号的 `axisIndex` 若大于被删下标则整体前移一位);
|
||||
* * 与源分组内其它信号**共享** → 复制一条到目标分组(不能抽走共享轴)。
|
||||
*
|
||||
* ⚠️ 调用方必须紧接着对每个标签页调用
|
||||
* `TabConfig::RemapAfterSignalMove(from, to, visible)` 修正引用,
|
||||
* 并在之后 `SyncToDataSet`。源分组即便被移空也**不自动删除**(删除会让分组下标整体左移,
|
||||
* 牵动所有引用);需要的话由调用方另行处理。
|
||||
*
|
||||
* @param [IN] fromGroup 源分组下标。
|
||||
* @param [IN] fromSignal 源分组内的信号下标。
|
||||
* @param [IN] toGroup 目标分组下标(必须已存在,且与源分组不同)。
|
||||
* @param [OUT] newSignalIndex 移动后该信号在目标分组内的下标(= 移动前目标组信号数)。
|
||||
* @return 移动成功返回 true。
|
||||
*/
|
||||
bool MoveSignalToGroup(int fromGroup, int fromSignal, int toGroup, int& newSignalIndex);
|
||||
|
||||
/**
|
||||
* @brief 把一条信号移动到**任意分组内的任意位置**(组内重排 / 跨组移动的统一入口)。
|
||||
*
|
||||
* 组内重排(`fromGroup == toGroup`)只调整顺序,时间轴完全不动;
|
||||
* 跨组移动按 `MoveSignalToGroup` 的规则搬运时间轴。
|
||||
*
|
||||
* @param [IN] fromGroup 源分组下标。
|
||||
* @param [IN] fromSignal 源分组内的信号下标。
|
||||
* @param [IN] toGroup 目标分组下标。
|
||||
* @param [IN] toSignalIndex 移动后该信号在目标分组内的下标(负数或越界表示追加到末尾)。
|
||||
* @param [OUT] newSignalIndex 移动后的实际下标。
|
||||
* @return 移动成功返回 true。
|
||||
*/
|
||||
bool MoveSignal(int fromGroup, int fromSignal, int toGroup, int toSignalIndex,
|
||||
int& newSignalIndex);
|
||||
|
||||
/**
|
||||
* @brief 移除指定下标的分组,并立即释放其占用的全部采样内存。
|
||||
* @param [IN] groupIndex 分组下标。
|
||||
@@ -1725,6 +1766,41 @@ namespace jdi
|
||||
*/
|
||||
void RemapAfterSignalInsert(int groupIndex, int insertPos);
|
||||
|
||||
/**
|
||||
* @brief 数据层把一条信号**跨分组移动**之后,修正本页的全部引用。
|
||||
*
|
||||
* 与 `RemapAfterSignalRemoval` + `RemapAfterSignalInsert` 组合不同:移动**不应**
|
||||
* 把信号从网格里删掉(用户期望曲线原地继续显示,只是归属分组变了),
|
||||
* 因此这里把「恰好等于源引用」的条目**改写**为目标引用,而不是先删后插。
|
||||
*
|
||||
* 处理顺序(不可调换):
|
||||
* 1. 精确等于 `from` 的引用 → 改写为 `to`(其下标已是移动后的最终值);
|
||||
* 2. 其余引用按「目标分组在 `to.signalIndex` 处插入」/「源分组删除 `from.signalIndex`」
|
||||
* 做 ±1 位移。
|
||||
* ⚠️ 若先位移再匹配,源分组里 `from.signalIndex + 1` 的引用会位移成 `from.signalIndex`
|
||||
* 而被误判成被移动的信号(曾经的 BUG)。
|
||||
*
|
||||
* 可见性表:目标分组在 `to.signalIndex` 处插入一列(取 `visible`),源分组删除一列。
|
||||
*
|
||||
* @param [IN] from 源引用(移动前)。
|
||||
* @param [IN] to 目标引用(移动后)。
|
||||
* @param [IN] visible 该信号在源分组里的可见性(迁移到目标分组后沿用)。
|
||||
*/
|
||||
void RemapAfterSignalMove(const SignalRef& from, const SignalRef& to, bool visible);
|
||||
|
||||
/**
|
||||
* @brief 数据层**组内重排**一条信号之后,修正本页在该分组内的全部引用下标。
|
||||
*
|
||||
* 只做线性下标映射(可见性表也按同一规则移动),不改变信号的分组归属:
|
||||
* `from` → `to`;`from < to` 时 `(from, to]` 区间内的下标各前移一位,
|
||||
* `from > to` 时 `[to, from)` 区间内的下标各后移一位。
|
||||
*
|
||||
* @param [IN] groupIndex 发生重排的分组下标。
|
||||
* @param [IN] from 移动前的下标。
|
||||
* @param [IN] to 移动后的下标。
|
||||
*/
|
||||
void RemapAfterSignalReorder(int groupIndex, int from, int to);
|
||||
|
||||
/**
|
||||
* @brief 把某信号所在的网格移动到另一信号所在网格的下方(紧邻其后)。
|
||||
*
|
||||
|
||||
Reference in new issue
Block a user