diff --git a/Control.cpp b/Control.cpp index a0267f3..2f0090d 100644 --- a/Control.cpp +++ b/Control.cpp @@ -162,6 +162,14 @@ namespace << SX_T(" 原因=当前控件禁止该轴 Stretch", " reason=stretch disabled by capability"); } } + + void ActivateExplicitLayoutSpecMode(StellarX::LayoutMode& mode) + { + // 新公开布局 API 明确属于“按边约束解算”的语义层。 + // 一旦调用,说明外部希望控件进入统一锚定布局模型, + // 因此直接切换到 AnchorToEdges,避免出现“策略已设但 layoutMode 仍是 Fixed”的半失效状态。 + mode = StellarX::LayoutMode::AnchorToEdges; + } } StellarX::ControlText& StellarX::ControlText::operator=(const ControlText& text) @@ -253,6 +261,56 @@ void Control::setAnchor(StellarX::Anchor anchor_1, StellarX::Anchor anchor_2) this->layoutSpec.horizontal = BuildLegacyAxisSpec(anchor_1, anchor_2, StellarX::Anchor::Left, StellarX::Anchor::Right); this->layoutSpec.vertical = BuildLegacyAxisSpec(anchor_1, anchor_2, StellarX::Anchor::Top, StellarX::Anchor::Bottom); } +void Control::setHorizontalLayoutSpec(const StellarX::AxisLayoutSpec& spec) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.horizontal = spec; +} + +void Control::setVerticalLayoutSpec(const StellarX::AxisLayoutSpec& spec) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.vertical = spec; +} + +void Control::setHorizontalAnchors(bool left, bool right) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.horizontal.anchorStart = left; + this->layoutSpec.horizontal.anchorEnd = right; +} + +void Control::setVerticalAnchors(bool top, bool bottom) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.vertical.anchorStart = top; + this->layoutSpec.vertical.anchorEnd = bottom; +} + +void Control::setHorizontalSizePolicy(StellarX::AxisSizePolicy policy) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.horizontal.sizePolicy = policy; +} + +void Control::setVerticalSizePolicy(StellarX::AxisSizePolicy policy) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.vertical.sizePolicy = policy; +} + +void Control::setHorizontalAlignPolicy(StellarX::AxisAlignPolicy policy) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.horizontal.alignPolicy = policy; +} + +void Control::setVerticalAlignPolicy(StellarX::AxisAlignPolicy policy) +{ + ActivateExplicitLayoutSpecMode(this->layoutMode); + this->layoutSpec.vertical.alignPolicy = policy; +} + StellarX::Anchor Control::getAnchor_1() const { return this->anchor_1; @@ -265,6 +323,16 @@ StellarX::LayoutMode Control::getLayoutMode() const { return this->layoutMode; } +StellarX::AxisLayoutSpec Control::getHorizontalLayoutSpec() const +{ + return layoutSpec.horizontal; +} + +StellarX::AxisLayoutSpec Control::getVerticalLayoutSpec() const +{ + return layoutSpec.vertical; +} + const StellarX::LayoutSpec& Control::getLayoutSpec() const { return layoutSpec; diff --git a/Control.h b/Control.h index 764dfff..f8f7687 100644 --- a/Control.h +++ b/Control.h @@ -177,12 +177,36 @@ public: void setLayoutMode(StellarX::LayoutMode layoutMode_); // 设置旧版双锚点输入,并映射到内部统一 LayoutSpec void setAnchor(StellarX::Anchor anchor_1, StellarX::Anchor anchor_2); + // 直接设置水平轴布局规格。 + // 调用该接口后会自动切换到 AnchorToEdges 布局模式; + // 这是新布局模型的公开入口,后设置者会覆盖旧 setAnchor() 对水平轴的映射结果。 + void setHorizontalLayoutSpec(const StellarX::AxisLayoutSpec& spec); + // 直接设置垂直轴布局规格。 + // 调用该接口后会自动切换到 AnchorToEdges 布局模式; + // 这是新布局模型的公开入口,后设置者会覆盖旧 setAnchor() 对垂直轴的映射结果。 + void setVerticalLayoutSpec(const StellarX::AxisLayoutSpec& spec); + // 设置水平轴锚定边集合(left / right)。 + void setHorizontalAnchors(bool left, bool right); + // 设置垂直轴锚定边集合(top / bottom)。 + void setVerticalAnchors(bool top, bool bottom); + // 设置水平轴尺寸策略(Stretch / FixedSize)。 + void setHorizontalSizePolicy(StellarX::AxisSizePolicy policy); + // 设置垂直轴尺寸策略(Stretch / FixedSize)。 + void setVerticalSizePolicy(StellarX::AxisSizePolicy policy); + // 设置水平轴固定尺寸位移策略(Start / End / Center / Proportional)。 + void setHorizontalAlignPolicy(StellarX::AxisAlignPolicy policy); + // 设置垂直轴固定尺寸位移策略(Start / End / Center / Proportional)。 + void setVerticalAlignPolicy(StellarX::AxisAlignPolicy policy); // 获取旧版锚点 1(兼容读取入口) StellarX::Anchor getAnchor_1() const; // 获取旧版锚点 2(兼容读取入口) StellarX::Anchor getAnchor_2() const; // 获取旧版布局模式 StellarX::LayoutMode getLayoutMode() const; + // 获取水平轴布局规格;返回的是当前生效的新模型状态,不要求可逆回旧 anchor 语义。 + StellarX::AxisLayoutSpec getHorizontalLayoutSpec() const; + // 获取垂直轴布局规格;返回的是当前生效的新模型状态,不要求可逆回旧 anchor 语义。 + StellarX::AxisLayoutSpec getVerticalLayoutSpec() const; // 获取内部统一布局规格;供 Window / Canvas 等统一解算入口使用。 const StellarX::LayoutSpec& getLayoutSpec() const; // 获取控件能力边界;用于判断某个轴是否允许 Stretch。 diff --git a/z-testDome.cpp b/z-testDome.cpp index f993570..8c6fa5a 100644 --- a/z-testDome.cpp +++ b/z-testDome.cpp @@ -1,8 +1,50 @@ // StellarX 星垣GUI框架 - 测试用例 +// +// 当前阶段测试入口说明(2026-04): +// 1. KEY1:旧页签链路 + Table 超界残留回归 +// - 目标:验证 TabControl 重复激活同一页签、切页、关页后的快照/清理链是否稳定。 +// - 预期: +// * 外部重复激活当前页签,不再扰动已激活页的快照链。 +// * 页签 1 中 Table 超出页区域的部分,在切页或关闭页签时不会残留。 +// * 触发正常全量重绘后,不应出现额外残影或层级错乱。 +// +// 2. KEY2:公开布局 API 首个迁移样例 +// - 目标:验证新的 AxisSizePolicy / AxisAlignPolicy 公开接口在真实场景里可用。 +// - 预期: +// * 32 位选择区中的“位号 + 位按钮”作为单元整体位移,窗口拉伸后保持对齐。 +// * 位按钮点击、位取反、左移、右移、一键置 0/1、签名切换,会统一刷新十六进制、 +// 十进制、上次值、本次值和 initData。 +// * 顶层五个区块在正常拉伸/最大化后继续铺满窗口,不再依赖旧双锚点硬凑。 +// * 当前更偏重横向铺满验证;极窄窗口下功能区是否进一步自适应,不作为本阶段硬指标。 +// +// 3. KEY3:旧业务大场景保留用例 +// - 目标:保留历史业务页示例,观察老场景在新主线下是否出现明显倒退。 +// - 预期: +// * 登录页、TabControl、旧业务页基本行为保持可运行。 +// * 当前不作为本阶段主回归集,不要求覆盖新的布局 API 或 overlay 专项。 +// +// 4. KEY4:Dialog / MessageBox 专项回归 +// - 目标:验证模态/非模态对话框、遮挡交互、关闭后 hover 恢复、拖拽 resize 等链路。 +// - 预期: +// * 非模态 Dialog 遮挡底层按钮时,不应出现 hover/tooltip 穿透或残留。 +// * 模态 Dialog 打开后拖拽窗口,标题、关闭按钮和底层恢复链保持稳定。 +// * 对话框关闭后,底层按钮 hover 能及时恢复。 +// - 备注:当前它更适合作为 Dialog 专项补充,不纳入每轮主集。 +// +// 5. KEY5:第二阶段专项主回归 +// - 目标:覆盖三层 Canvas、TabControl、Tooltip、overlay、Table、页码与分页按钮等主线风险点。 +// - 预期: +// * 三层 Canvas 嵌套下,深层按钮的 hover / press / release / tooltip 都能正确刷新。 +// * Window / Canvas / TabControl 的 overlay 补画与 coverage 链闭合,不再出现遮挡错层。 +// * TabControl 页签按钮与页面层级正确;页签 tooltip 不会再被页面盖掉。 +// * Table 分页按钮、页码标签、与上层浮层相交时的重绘链保持正确。 +// +// 当前阶段建议主回归集:KEY1 + KEY2 + KEY5 +// Dialog / MessageBox 补充专项:KEY4 #include"StellarX.h" #include #ifndef KEY -#define KEY 4 +#define KEY 5 #endif #if 5 == KEY @@ -433,7 +475,7 @@ int main() table->setHeaders({ "name","age","seorc","home" }); table->setData({ {"zhangsan","20","99.99","wadsacafadsawd"}, - {"lisi","20","99.99","wadsacafadssssssssssssssssssssssssssssssssssssssssssssssssssawd"}, + {"lisi","20","99.99","wadsacafadsawd"}, {"wangwu","20","99.99","wadsacafadsawd"}, {"zhaoliu","20","99.99","wadsacafadsawd"}, {"1","20","99.99","wadsacafadsawd" }, @@ -725,108 +767,147 @@ char initData[33] = "00000000000000000000000000000000";//初始数据 bool gSigned = false; //是否为有符号数 int main() { - StellarX::SxLogger::Get().enableConsole(true); + //StellarX::SxLogger::Get().enableConsole(true); + StellarX::SxLogger::Get().enableFile("log.txt",true,1024); StellarX::SxLogger::Get().setMinLevel(StellarX::SxLogLevel::Debug); // Info/Debug/Trace 自己切 StellarX::SxLogger::Get().setLanguage(StellarX::SxLogLanguage::ZhCN); // ZhCN / EnUS Window mainWindow(700, 510, 1, RGB(255, 255, 255), "寄存器查看工具 V1.0——我在人间做废物 (同类工具定制:3150131407(Q / V))"); - //选择区控件 - auto selectionAreaLabel = std::make_unique