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
@@ -35,6 +35,14 @@ namespace jdi
|
||||
CMD_GROUP_REMOVE = 12, /**< 从工作区移除该分组。 */
|
||||
CMD_LANE_BASE = 300, /**< 网格归属基准(配合下标)。 */
|
||||
CMD_LANE_NEW = 400, /**< 新建网格。 */
|
||||
/**
|
||||
* @brief 「移动到…」二级菜单里的分组条目基准(配合分组下标)。
|
||||
*
|
||||
* 与 `CMD_LANE_BASE` 同一套约定:`id - CMD_GROUP_MOVE_BASE` 即目标分组下标。
|
||||
* 取值区间必须与 `CMD_LANE_BASE` 的区间(300–399)和 `CMD_LANE_NEW` 互不重叠。
|
||||
*/
|
||||
CMD_GROUP_MOVE_BASE = 600,
|
||||
CMD_GROUP_MOVE_NEW = 700, /**< 「移动到…」二级菜单底部:新建分组并把信号移进去。 */
|
||||
CMD_GAIN_EDIT = 500, /**< 「系数」二级面板里的系数输入框(幂等提交)。 */
|
||||
CMD_GAIN_RESET = 501, /**< 「系数调整」标题栏右侧的还原按钮:把系数重置为 1。 */
|
||||
CMD_OFFSET_RESET = 502, /**< 「偏移调整」标题栏右侧的还原按钮:两个偏移都恢复为默认值。 */
|
||||
@@ -108,6 +116,15 @@ namespace jdi
|
||||
m_pendingClosePart = RowPart::NONE;
|
||||
m_pendingFilterClear = false;
|
||||
m_groupNameClickRow = -1;
|
||||
// 拖拽排序同样保存着行下标与逐行位移,行集合一变就必须整体作废。
|
||||
m_signalDragPending = false;
|
||||
m_signalDragging = false;
|
||||
m_signalDragRow = -1;
|
||||
m_signalDragDropGroup = -1;
|
||||
m_signalDragDropIndex = -1;
|
||||
m_signalDragDropRow = -1;
|
||||
m_signalDragShift.clear();
|
||||
m_signalDragShiftCur.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -473,6 +490,18 @@ namespace jdi
|
||||
/** @brief 分组折起/展开动画是否正在进行。 */
|
||||
bool GroupAnimationActive() const { return !m_groupAnims.empty(); }
|
||||
|
||||
/**
|
||||
* @brief 推进一步「信号拖拽避让」动画(由宿主定时器驱动)。
|
||||
* @return 仍有行在移动 / 正在拖拽(宿主应保持定时重绘)返回 true。
|
||||
*/
|
||||
bool AdvanceSignalDragAnimation();
|
||||
|
||||
/** @brief 信号拖拽(含避让动画)是否仍在进行。 */
|
||||
bool SignalDragAnimationActive() const
|
||||
{
|
||||
return m_signalDragPending || m_signalDragging;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 供绘图区联动高亮的「悬停信号」。
|
||||
*
|
||||
@@ -489,6 +518,49 @@ namespace jdi
|
||||
int TargetLaneIndex() const;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief 开始跟踪一次可能变成拖拽的按下(信号行主体)。
|
||||
* @param [IN] ref 目标信号。
|
||||
* @param [IN] row 该信号所在的行下标。
|
||||
* @param [IN] x 按下点横坐标。 @param [IN] y 按下点纵坐标。
|
||||
*/
|
||||
void BeginSignalDrag(const SignalRef& ref, int row, int x, int y);
|
||||
|
||||
/**
|
||||
* @brief 拖拽中:更新被拖条目的跟随位置与避让目标。
|
||||
* @param [IN] x 鼠标横坐标。 @param [IN] y 鼠标纵坐标。
|
||||
* @return 需要重绘返回 true。
|
||||
*/
|
||||
bool UpdateSignalDrag(int x, int y);
|
||||
|
||||
/**
|
||||
* @brief 重新计算拖拽的落点(目标分组 / 组内下标)与各行的避让位移目标。
|
||||
*/
|
||||
void UpdateSignalDragTargets();
|
||||
|
||||
/**
|
||||
* @brief 取消拖拽(不发任何命令)。
|
||||
*/
|
||||
void CancelSignalDrag();
|
||||
|
||||
/**
|
||||
* @brief 结束拖拽并**提交**重排(落点与源位置不同才提交)。
|
||||
*/
|
||||
void FinishSignalDrag();
|
||||
|
||||
/**
|
||||
* @brief 取某行的避让位移(拖拽中);未拖拽时返回 0。
|
||||
* @param [IN] row 行下标。
|
||||
* @return 纵向位移(像素,负值 = 上移)。
|
||||
*/
|
||||
float SignalDragRowShiftFor(int row) const;
|
||||
|
||||
/**
|
||||
* @brief 绘制被拖拽条目的「浮起」副本(在行循环之后绘制,因此始终在最上层)。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
*/
|
||||
void PaintSignalDragGhost(gd::Graphics& g);
|
||||
|
||||
/**
|
||||
* @brief 样式区与列表行中可进行内联文本编辑的字段。
|
||||
*/
|
||||
@@ -1446,6 +1518,27 @@ namespace jdi
|
||||
*/
|
||||
std::vector<float> m_rowShift;
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 信号条目拖拽排序(用户 2026-11-03 要求):
|
||||
// * 左键按住信号行主体 → 超过阈值后进入拖拽;
|
||||
// * 被拖条目**脱离原位置**跟随鼠标绘制(半透明浮起 + 阴影);
|
||||
// * 其它信号行 / 分组行按插入位置做**避让位移动画**(`m_signalDragShiftCur` 逐帧插值);
|
||||
// * 松手时提交到宿主(`kMessageReorderSignal`),由数据层重排并修正全部引用。
|
||||
// ------------------------------------------------------------------
|
||||
bool m_signalDragPending = false; /**< 已按下信号行主体、尚未越过拖拽阈值。 */
|
||||
bool m_signalDragging = false; /**< 正在拖拽信号条目。 */
|
||||
SignalRef m_signalDragRef; /**< 被拖拽的信号。 */
|
||||
int m_signalDragRow = -1; /**< 被拖拽行在 `m_rows` 中的下标。 */
|
||||
int m_signalDragStartX = 0; /**< 按下点(阈值判定用)。 */
|
||||
int m_signalDragStartY = 0;
|
||||
int m_signalDragMouseY = 0; /**< 最近一次鼠标纵坐标(被拖条目跟随它)。 */
|
||||
int m_signalDragDropGroup = -1; /**< 当前目标分组下标(-1 = 无效)。 */
|
||||
int m_signalDragDropIndex = -1; /**< 目标分组内的插入下标。 */
|
||||
int m_signalDragDropRow = -1; /**< 插入位置对应的行下标(插入指示线画在这里)。 */
|
||||
bool m_signalDragDropBefore = false; /**< 插入点在该行的上方(否则下方)。 */
|
||||
std::vector<float> m_signalDragShift; /**< 各行避让位移的**目标值**(像素)。 */
|
||||
std::vector<float> m_signalDragShiftCur; /**< 各行避让位移的**当前值**(逐帧插值)。 */
|
||||
|
||||
/**
|
||||
* @brief 筛选模式下的分组折起状态(按分组下标)。
|
||||
*
|
||||
|
||||
Reference in new issue
Block a user