UI 重构 P3:Toolbar 迁移到控件树(新增 UiButtonWidget,逐像素 0 差异 + 功能断言)
新增 Components/Shared/{Inc,Src}/UiButtonWidget.*:通用「文字按钮」控件,视觉规则与旧 Toolbar
按钮逐像素一致(主按钮强调色实底 / 普通按钮 1px 描边 / 可切换选中态 / 禁用态配色);
交互由控件自己处理:按下即 CaptureMouse 进入按下态,在自身范围内松开才触发 onClick,
指针离开(不会再收到抬起)时 CancelPress。
Toolbar 内部重写,公开 API 一字未改:
- Button 只保留静态配置 + 控件指针;矩形与外观状态归控件。
- 删除 m_hoverIndex / m_pressedIndex 与死字段 Button::hover,改由 UiWidget 的悬停链与 capture 维护。
- Paint 改为「根控件(底色 + 底部分隔线)+ 按钮子节点」,一次 root->Paint(ctx)。
- OnMouseMove/Down/Up/Leave 统一翻译成 UiEvent 后 root->Dispatch;动作经 onClick 回调登记、抬起后执行。
框架约定调整:UiWidget::Paint 的裁剪从「严格等于自身矩形」改为「自身矩形外扩 1px(kUiClipBleed)」。
边框/描边以矩形边界为中心绘制,严格裁剪会切掉外半侧使控件变细、与旧绘制不再像素一致。
uicheck 对应断言改为「裁剪 ⊇ 自身矩形且不超出外扩范围」。
验证:
- make release / make debug 零警告;Target.exe 881,664 B(< 900KB)。
- 逐像素 A/B(8 场景:全览 / 深放大+自由标记+滤波+弱峰+光标 / 平移 / 悬停按钮 / 按下 / 松开 /
悬停主按钮 / 移出工具栏):迁移前后哈希逐一相同
A 2166933039626F66 B C444ECFEB18FD73D C 7984446D8E7A4418 D BF855879CA12F289
E 1C663E4118616016 F 0535292D8E07AE18 G 7A58172C46577729 H 23F390DD76141113。
- 功能断言:locate-cursor-button PASS (1291,73);click-cursor-changes-mode PASS (1 -> 2);
release-outside-does-not-fire PASS (2 -> 2)。
- Tools/uicheck 62 passed / 0 failed。
This commit is contained in:
1 parent
7e1852c2d2
commit
25264f9074
9 files changed
+663
-223
No files matched your search
@@ -18,6 +18,15 @@ namespace jdi
|
||||
struct Theme;
|
||||
struct UiFonts;
|
||||
|
||||
/**
|
||||
* @brief 裁剪时允许超出控件矩形的像素数(逻辑像素 × scale)。
|
||||
*
|
||||
* 边框/描边以矩形边界为中心绘制(1px 笔宽有一半在矩形外),若严格按矩形裁剪
|
||||
* 会把外半侧切掉(控件看起来变细)。因此裁剪区固定外扩这么多。
|
||||
* ⚠️ 它只用于**限制控件画到哪**,不参与脏区判定(脏区始终是精确矩形)。
|
||||
*/
|
||||
constexpr float kUiClipBleed = 1.0f;
|
||||
|
||||
/**
|
||||
* @brief 布局测量上下文(由根节点统一下发,子节点只读)。
|
||||
*/
|
||||
@@ -233,6 +242,8 @@ namespace jdi
|
||||
|
||||
/** @brief 当前悬停的控件(根节点维护)。 */
|
||||
UiWidget* HoverWidget() const;
|
||||
/** @brief 本控件当前是否被悬停(由根节点的悬停链维护)。 */
|
||||
bool Hovered() const { return m_hovered; }
|
||||
|
||||
/** @brief 请求键盘焦点(根节点记录;键盘/字符事件沿焦点链派发)。 */
|
||||
void RequestFocus();
|
||||
@@ -314,6 +325,7 @@ namespace jdi
|
||||
bool m_visible = true; /**< 是否可见。 */
|
||||
bool m_hitTransparent = false; /**< 是否命中透明。 */
|
||||
bool m_measureValid = false; /**< 期望尺寸是否有效。 */
|
||||
bool m_hovered = false; /**< 是否被悬停(悬停链写入)。 */
|
||||
|
||||
// 根节点专用状态。
|
||||
UiWidget* m_capture = nullptr; /**< 鼠标捕获者。 */
|
||||
|
||||
Reference in new issue
Block a user