diff --git a/Userland/Libraries/LibGUI/BoxLayout.cpp b/Userland/Libraries/LibGUI/BoxLayout.cpp index 98e7358091..e84345f581 100644 --- a/Userland/Libraries/LibGUI/BoxLayout.cpp +++ b/Userland/Libraries/LibGUI/BoxLayout.cpp @@ -93,6 +93,56 @@ int BoxLayout::preferred_secondary_size() const return size; } +UISize BoxLayout::min_size() const +{ + VERIFY(m_owner); + + UIDimension result_primary { 0 }; + UIDimension result_secondary { 0 }; + + bool first_item { true }; + for (auto& entry : m_entries) { + if (!entry.widget || !entry.widget->is_visible()) + continue; + + UISize min_size = entry.widget->min_size(); + + { + UIDimension primary_min_size = min_size.primary_size_for_orientation(orientation()); + + VERIFY(primary_min_size.is_one_of(SpecialDimension::Shrink, SpecialDimension::Regular)); + + if (primary_min_size.is_int()) + result_primary.add_if_int(primary_min_size.as_int()); + + if (!first_item) + result_primary.add_if_int(spacing()); + } + + { + UIDimension secondary_min_size = min_size.secondary_size_for_orientation(orientation()); + + VERIFY(secondary_min_size.is_one_of(SpecialDimension::Shrink, SpecialDimension::Regular)); + + result_secondary = max(result_secondary, secondary_min_size); + } + + first_item = false; + } + + result_primary.add_if_int( + margins().primary_total_for_orientation(orientation()) + + m_owner->content_margins().primary_total_for_orientation(orientation())); + + result_secondary.add_if_int( + margins().secondary_total_for_orientation(orientation()) + + m_owner->content_margins().secondary_total_for_orientation(orientation())); + + if (orientation() == Gfx::Orientation::Horizontal) + return { result_primary, result_secondary }; + return { result_secondary, result_primary }; +} + void BoxLayout::run(Widget& widget) { if (m_entries.is_empty()) diff --git a/Userland/Libraries/LibGUI/BoxLayout.h b/Userland/Libraries/LibGUI/BoxLayout.h index 6e6921d59c..080794d48d 100644 --- a/Userland/Libraries/LibGUI/BoxLayout.h +++ b/Userland/Libraries/LibGUI/BoxLayout.h @@ -23,6 +23,7 @@ public: virtual void run(Widget&) override; virtual Gfx::IntSize preferred_size() const override; + virtual UISize min_size() const override; protected: explicit BoxLayout(Gfx::Orientation); diff --git a/Userland/Libraries/LibGUI/Layout.h b/Userland/Libraries/LibGUI/Layout.h index ef9a01f0cf..b62be5e1e3 100644 --- a/Userland/Libraries/LibGUI/Layout.h +++ b/Userland/Libraries/LibGUI/Layout.h @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace Core { @@ -49,6 +50,7 @@ public: virtual void run(Widget&) = 0; virtual Gfx::IntSize preferred_size() const = 0; + virtual UISize min_size() const = 0; void notify_adopted(Badge, Widget&); void notify_disowned(Badge, Widget&);