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

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

+12 -4
View File
@@ -578,12 +578,20 @@ namespace jdi
const int saveState = g.Save();
g.SetClip(clipRect, gd::CombineModeIntersect);
// 选区高亮绘制在文本之下,整段选中时呈现“已全选”观感;
// 叠加上 GDI+ 裁剪,高亮同样不会越过输入框边界。
// 选区高亮绘制在文本之下,整段选中时呈现“已全选”观感。
// ⚠️ 这里**必须自己把矩形夹到内容区**:`UiFillRect` 对面积足够大的不透明矩形会走
// GDI `FillRect` 快路径,而 GDI 绘制**不受 GDI+ 裁剪区约束**,长文本的全选高亮
// (宽度等于整段文本宽度)因此会溢出到输入框之外。夹取之后矩形始终落在框内,
// 既保留快路径又不越界。
if (edit.HasSelection() && selEndX > selBeginX)
{
const gd::RectF highlight(textLeft + selBeginX, rect.Y + 3.0f * scale, selEndX - selBeginX,
rect.Height - 6.0f * scale);
gd::RectF highlight(textLeft + selBeginX, rect.Y + 3.0f * scale, selEndX - selBeginX,
rect.Height - 6.0f * scale);
const float left = std::max(highlight.X, clipRect.X);
const float right = std::min(highlight.X + highlight.Width, clipRect.X + clipRect.Width);
const float top = std::max(highlight.Y, clipRect.Y);
const float bottom = std::min(highlight.Y + highlight.Height, clipRect.Y + clipRect.Height);
highlight = gd::RectF(left, top, right - left, bottom - top);
UiFillRect(g, highlight, theme.accent);
}