修复输入框全选高亮溢出、标签页重命名无法失焦、新增信号行删除按钮

1. 内联输入框全选高亮越界(组名/标签页名/信号名编辑)
   UiFillRect 在不透明且面积 >= 20000 时走 GDI FillRect 快路径,而 GDI 填充不受
   GDI+ SetClip 约束;长文本全选时高亮宽度可达上千像素,于是画到输入框之外。
   UiDrawEditField 现在先把高亮矩形与裁剪区求交再填充。

2. 标签页重命名处于编辑态时,点击输入框之外的任何位置都不退出编辑
   Application 只在点击落在标签栏内时才把点击交给 TabBar。现在 WM_LBUTTONDOWN
   会先检查 m_tabBar.IsEditing(),是则提交(OnEditKey + OnTabBarResult)并退出编辑态,
   覆盖绘图区、信号面板、工具栏、分隔条等位置,且不会丢失新名字。

3. 信号选择区域每个信号新增 ✕ 删除按钮
   - 位置与所在组复选框同一列(垂直对齐),悬停显示手型光标并高亮。
   - 点击后面板向宿主发送 WM_APP+2;Application::RemoveSignal 会重映射所有标签页的
     可见性与网格引用、修正当前选中项,再真正从 DataSet 中删除该信号并释放采样内存;
     删除组内最后一个信号时退化为移除整个文件分组。
   - DataSet::RemoveSignal 采用移动填充 + shrink_to_fit,保证缓冲区内即刻析构。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-10 10:54:50 +08:00
1 parent 18b8f3e38e
commit a1e30985b8
7 files changed
+270 -11

No files matched your search

+16 -3
View File
@@ -276,12 +276,13 @@ namespace jdi
bool HitTest(int x, int y) const;
/**
* @brief 查询该位置应使用的鼠标光标(当前仅「筛选信号」清空按钮 ✕ 使用手型)。
* @brief 查询该位置应使用的鼠标光标(✕ 类按钮使用手型)。
* @param [IN] x 客户区横坐标。
* @param [IN] y 客户区纵坐标。
* @return 需要特殊光标时返回光标句柄,否则返回 nullptr。
* @note 需要按需重建列表行缓存(查 ✕ 的命中),因此不是 const。
*/
HCURSOR QueryCursor(int x, int y) const;
HCURSOR QueryCursor(int x, int y);
/**
* @brief 将列表滚动到指定信号所在位置。
@@ -321,7 +322,8 @@ namespace jdi
CHECK, /**< 复选框。 */
BODY, /**< 行主体。 */
CLOSE, /**< 文件行的关闭按钮。 */
LANE_BADGE /**< 信号行的网格徽标。 */
LANE_BADGE, /**< 信号行的网格徽标。 */
REMOVE_SIGNAL /**< 信号行左侧的「移除该信号」✕ 按钮。 */
};
/**
@@ -402,6 +404,17 @@ namespace jdi
*/
gd::RectF SignalBadgeRect(int row) const;
/**
* @brief 计算信号行左侧「移除该信号」✕ 按钮的矩形。
*
* 位置就信号行空着的折叠三角列,并与所属分组行的复选框**同一列**(左边界对齐),
* 因此始终位于复选框前方且与其垂直对齐。
*
* @param [IN] row 行下标。
* @return 按钮矩形;非信号行时返回空矩形。
*/
gd::RectF SignalRemoveRect(int row) const;
/**
* @brief 绘制文件分组标题行。
* @param [IN,OUT] g 绘图上下文。