diff --git a/example/src/main.cpp b/example/src/main.cpp index db609cc..ba96ceb 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -25,6 +25,7 @@ int main(int argc, char* argv[]) { const auto button = mnew(mbutton) mslot(mbutton) + .margin({10}) [ text_block ]; diff --git a/src/mirage_widget/widget/compound_widget/mborder.h b/src/mirage_widget/widget/compound_widget/mborder.h index 3ce4973..9823706 100644 --- a/src/mirage_widget/widget/compound_widget/mborder.h +++ b/src/mirage_widget/widget/compound_widget/mborder.h @@ -29,7 +29,7 @@ struct mborder_slot : mcompound_widget_slot<mborder_slot> { } /** - * 定义margin属性,用于控制子组件周围的边距 + * 定义margin属性,内边距,用于设置子组件与边框之间的距离(会导致最终大小变大) */ SLOT_ATTRIBUTE(margin_t, margin) }; @@ -59,4 +59,18 @@ public: slot.v_alignment(), slot.margin()); } + + Eigen::Vector2f compute_desired_size(float in_layout_scale_multiplier) const override { + if (const auto& child = get_child_slot().get()) { + // 获取子部件的期望大小 + const auto& child_size = child->compute_desired_size(in_layout_scale_multiplier); + const auto& margin = slot_.margin(); + + // 添加边距的贡献 + // return child_size + Eigen::Vector2f(margin.horizontal(), margin.vertical()); + // 或使用现有的 margin.get_total_spacing() 方法 + return child_size + margin.get_total_spacing(); + } + return Eigen::Vector2f(10, 10); + } }; diff --git a/src/mirage_widget/widget/compound_widget/mbutton.cpp b/src/mirage_widget/widget/compound_widget/mbutton.cpp index cbba7f9..e0bc96b 100644 --- a/src/mirage_widget/widget/compound_widget/mbutton.cpp +++ b/src/mirage_widget/widget/compound_widget/mbutton.cpp @@ -27,17 +27,6 @@ void mbutton::on_paint(mirage_paint_context& in_context) { ); } -Eigen::Vector2f mbutton::compute_desired_size(float in_layout_scale_multiplier) const { - const margin_t button_padding = { 10, 10, 10, 10 }; // TODO 临时值, 以后会从主题中获取 - Eigen::Vector2f desired_size = button_padding.get_total_spacing(); - - if (const auto& child = get_child_slot().get()) { - desired_size += child->compute_desired_size(in_layout_scale_multiplier); - } - - return desired_size; -} - void mbutton::on_click(const Eigen::Vector2f& in_position, mouse_button in_button) { mborder::on_click(in_position, in_button); std::cout << this << ": Button clicked!" << in_position.x() << ", " << in_position.y() << std::endl; diff --git a/src/mirage_widget/widget/compound_widget/mbutton.h b/src/mirage_widget/widget/compound_widget/mbutton.h index 342ce06..47e506e 100644 --- a/src/mirage_widget/widget/compound_widget/mbutton.h +++ b/src/mirage_widget/widget/compound_widget/mbutton.h @@ -7,7 +7,6 @@ public: virtual void init() override; virtual void on_paint(mirage_paint_context& in_context) override; - virtual Eigen::Vector2f compute_desired_size(float in_layout_scale_multiplier) const override; virtual void on_click(const Eigen::Vector2f& in_position, mouse_button in_button) override; virtual void on_double_click(const Eigen::Vector2f& in_position, mouse_button in_button) override;