修复列表内联编辑(组名/信号名)看不到插入符与选区;把 UI 基础层迁入 Components/Shared
1) 行位图缓存键漏了插入符与选区:信号列表整行走 PaintRowCached,RowCacheKey
在编辑态只混合“是否编辑 + 文本” ⇒ 左右方向键与鼠标框选虽然改变了 TextEdit
状态(caret/anchor),键却不变 ⇒ 贴回旧位图。表现就是“无法部分选择、
鼠标框选无反应、光标不动”,而绘图区的光标时间输入(无行缓存)一直正常。
修法:GROUP_TITLE / SIGNAL_NAME 两个分支编辑态把 Caret / SelectionBegin /
SelectionEnd 一并 mix 进键;新增 SignalPanel::EditFieldFont() 统一
绘制(uiSmall / ui)与鼠标命中、插入符换算所用字体。
2) Theme / PaintUtil / TextEdit / PopupMenu / ColorPickerPopup 由
Utilities/{Inc,Src} git mv 到 Components/Shared/{Inc,Src}:
Utilities 只保留纯数据/逻辑模块(DataModel、DataTable、各 *Loader、MatH5、
Utf8Util),Shared 成为自洽的 UI 基础层(Theme → PaintUtil → UiControls →
PopupMenu / ColorPickerPopup)。依赖方向仍是 Components → Shared → Utilities;
PaintUtil 一并迁移是因为它依赖 Theme(否则构成 Utilities → Shared 反向依赖)。
Makefile 无需改动(include 平铺,两个目录都已在搜索路径),但需清理 Build/*
里对应的旧 .o/.d。
验证(全部离屏,不占用鼠标/键盘/屏幕):
- 新增 .preflight/editcheck 20/20;A/B 修复前 6 项如实失败(键不变 + 屏幕不重绘);
- 既有 .preflight/check 137/137;
- make release / make debug 零警告。
This commit is contained in:
1 parent
f44f8021e3
commit
1e50494c41
15 files changed
+93
-4
No files matched your search
@@ -1186,6 +1186,17 @@ namespace jdi
|
||||
}
|
||||
}
|
||||
|
||||
HFONT SignalPanel::EditFieldFont() const
|
||||
{
|
||||
if (m_fonts == nullptr)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
// 分组名的编辑框在行内是用 `uiSmall` 绘制的(分组行字号更小),其余输入框用 `ui`。
|
||||
// 绘制、命中、插入符换算三处必须一致,否则鼠标落点与插入符位置会错开。
|
||||
return (m_editField == StyleEditField::GROUP_TITLE) ? m_fonts->uiSmall : m_fonts->ui;
|
||||
}
|
||||
|
||||
const SignalStyle* SignalPanel::StyleOf(const SignalRef& ref) const
|
||||
{
|
||||
return (m_dataSet != nullptr) ? m_dataSet->Style(ref) : nullptr;
|
||||
|
||||
@@ -821,7 +821,7 @@ namespace jdi
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return UiEditFieldMouseDown(m_fonts->ui, EditFieldRect(), m_edit, m_scale, x, y);
|
||||
return UiEditFieldMouseDown(EditFieldFont(), EditFieldRect(), m_edit, m_scale, x, y);
|
||||
}
|
||||
|
||||
bool SignalPanel::OnEditMouseMove(int x)
|
||||
@@ -834,7 +834,7 @@ namespace jdi
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return UiEditFieldMouseMove(m_fonts->ui, EditFieldRect(), m_edit, m_scale, x);
|
||||
return UiEditFieldMouseMove(EditFieldFont(), EditFieldRect(), m_edit, m_scale, x);
|
||||
}
|
||||
|
||||
bool SignalPanel::OnEditMouseUp(int x, int y)
|
||||
|
||||
@@ -326,6 +326,13 @@ namespace jdi
|
||||
if (editing)
|
||||
{
|
||||
mixText(m_edit.Text());
|
||||
// ⚠️ 插入符与选区必须进键:行位图缓存只按“行的可见内容”生效,
|
||||
// 而编辑态下插入符位置 / 选区范围也是可见内容。漏掉它们时,
|
||||
// 方向键与鼠标框选虽然改变了 `TextEdit` 状态,但键不变 ⇒ 贴回的仍是旧位图,
|
||||
// 屏幕上看就是“无法部分选择、光标不动”(用户 2026-10-19 报告)。
|
||||
mix(static_cast<std::uint64_t>(m_edit.Caret()) + 1ull);
|
||||
mix(static_cast<std::uint64_t>(m_edit.SelectionBegin()) + 1ull);
|
||||
mix(static_cast<std::uint64_t>(m_edit.SelectionEnd()) + 1ull);
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
@@ -350,6 +357,10 @@ namespace jdi
|
||||
if (editing)
|
||||
{
|
||||
mixText(m_edit.Text());
|
||||
// 同分组行:插入符 / 选区也是行的可见内容(见 `GROUP_TITLE` 分支的注释)。
|
||||
mix(static_cast<std::uint64_t>(m_edit.Caret()) + 1ull);
|
||||
mix(static_cast<std::uint64_t>(m_edit.SelectionBegin()) + 1ull);
|
||||
mix(static_cast<std::uint64_t>(m_edit.SelectionEnd()) + 1ull);
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user