Finalize layout stage 2 fixes and refresh regression scenes

This commit is contained in:
Codex
2026-04-16 11:40:39 +08:00
parent b7ad960518
commit 738cf035bb
20 changed files with 1470 additions and 308 deletions
+26 -1
View File
@@ -124,6 +124,12 @@ public:
int getLocalRight() const { return localx + localWidth; }
int getLocalBottom() const { return localy + localHeight; }
// 公开几何 setter
// - 面向用户使用
// - 默认只修改运行态矩形
// - 不允许自动回写设计基线 local*
// 若某个复合控件需要在 setter 后维护自己拥有的运行态子树一致性,
// 由该控件在 override 中自行处理,但仍不得越权承担统一布局器职责。
virtual void setX(int x);
virtual void setY(int y);
virtual void setWidth(int width);
@@ -132,6 +138,10 @@ public:
virtual void draw() = 0;
virtual bool handleEvent(const ExMessage& msg) = 0;//返回true代表事件已消费
// 轻量清理接口:仅用于“没有机会收到本次 WM_MOUSEMOVE”的兄弟分支,
// 清掉 hover / tooltip / 临时按下态等鼠标瞬时状态。
// 该接口不是事件分发入口,不参与新的命中判断,也不允许回写设计基线。
virtual bool clearTransientMouseState();
//设置是否显示
virtual void setIsVisible(bool show);
//设置父容器指针
@@ -140,8 +150,14 @@ public:
virtual void setHostWindow(Window* host) { this->hostWindow = host; }
Window* getHostWindow() const; // 获取宿主 Window;子控件可沿 parent 向上回溯
RECT getBoundsRect() const; // 获取当前控件外接矩形,用于覆盖/相交判断
// 获取本控件“本轮实际可能写到屏幕上的覆盖范围”。
// 默认等于控件本体矩形;像 Button 这类会额外绘制 Tooltip 的控件,可 override 后扩大范围。
// 托管重绘 coverage、overlay 相交判断统一走这个接口,而不再默认使用控件本体 bounds。
virtual RECT getManagedRepaintCoverageRect() const;
Control* getManagedRepaintRoot(); // 找到本控件对应的托管重绘 root
Control* getManagedRepaintDirectBranch(Control* root); // 找到“root 下面承接本次脏变化的直接子分支”
bool hasValidBackgroundSnapshot() const { return hasSnap && saveBkImage != nullptr; } // 当前是否持有可用于局部恢复的快照
virtual bool hasManagedDirtySubtree() const; // 当前控件或其受管理子树中是否存在待提交的脏内容
virtual bool canCommitManagedPartialRepaint() const; // 当前 root 是否可安全做“局部提交”而非整 root 重画
virtual void commitManagedRepaint(); // 托管收口阶段真正执行绘制的入口
//设置是否重绘
@@ -157,16 +173,25 @@ public:
//用来检查对话框是否模态,其他控件不用实现
virtual bool model()const = 0;
//布局
// 设置旧版布局模式(兼容入口)
void setLayoutMode(StellarX::LayoutMode layoutMode_);
// 设置旧版双锚点输入,并映射到内部统一 LayoutSpec
void setAnchor(StellarX::Anchor anchor_1, StellarX::Anchor anchor_2);
// 获取旧版锚点 1(兼容读取入口)
StellarX::Anchor getAnchor_1() const;
// 获取旧版锚点 2(兼容读取入口)
StellarX::Anchor getAnchor_2() const;
// 获取旧版布局模式
StellarX::LayoutMode getLayoutMode() const;
// 获取内部统一布局规格;供 Window / Canvas 等统一解算入口使用。
const StellarX::LayoutSpec& getLayoutSpec() const;
// 获取控件能力边界;用于判断某个轴是否允许 Stretch。
const StellarX::LayoutCapability& getLayoutCapability() const;
// 显式将当前运行态矩形提交为新的设计基线。普通 resize / 重排过程中不得自动调用。
// 显式将当前运行态矩形提交为新的设计基线。
// 这是“运行态 -> 设计态”的受控入口之一:
// - 普通 resize / 重排过程中不得自动调用
// - 公开 setter 也不得隐式调用
// - 仅用于少数需要把当前结果固化为新设计基线的场景
void commitCurrentGeometryAsDesignRect();
protected:
// 第 1 层:根据父设计尺寸、父当前尺寸和本控件设计矩形,解算出当前运行态局部矩形。