diff --git a/Userland/Libraries/LibGUI/BoxLayout.cpp b/Userland/Libraries/LibGUI/BoxLayout.cpp index 283d008813..c75c0e30c8 100644 --- a/Userland/Libraries/LibGUI/BoxLayout.cpp +++ b/Userland/Libraries/LibGUI/BoxLayout.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -125,7 +126,8 @@ void BoxLayout::run(Widget& widget) if (items.is_empty()) return; - int available_size = widget.size().primary_size_for_orientation(orientation()) - spacing() * (items.size() - 1); + Gfx::IntRect content_rect = widget.content_rect(); + int available_size = content_rect.size().primary_size_for_orientation(orientation()) - spacing() * (items.size() - 1); int unfinished_items = items.size(); if (orientation() == Gfx::Orientation::Horizontal) @@ -180,10 +182,10 @@ void BoxLayout::run(Widget& widget) } // Pass 3: Place the widgets. - int current_x = margins().left(); - int current_y = margins().top(); + int current_x = margins().left() + content_rect.x(); + int current_y = margins().top() + content_rect.y(); - auto widget_rect_with_margins_subtracted = widget.rect(); + auto widget_rect_with_margins_subtracted = content_rect; widget_rect_with_margins_subtracted.take_from_left(margins().left()); widget_rect_with_margins_subtracted.take_from_top(margins().top()); widget_rect_with_margins_subtracted.take_from_right(margins().right()); @@ -195,7 +197,7 @@ void BoxLayout::run(Widget& widget) rect.set_primary_size_for_orientation(orientation(), item.size); if (item.widget) { - int secondary = widget.size().secondary_size_for_orientation(orientation()); + int secondary = widget.content_size().secondary_size_for_orientation(orientation()); if (orientation() == Gfx::Orientation::Horizontal) secondary -= margins().top() + margins().bottom(); else diff --git a/Userland/Libraries/LibGUI/Widget.h b/Userland/Libraries/LibGUI/Widget.h index 70afb5d60b..40fb9e1b3b 100644 --- a/Userland/Libraries/LibGUI/Widget.h +++ b/Userland/Libraries/LibGUI/Widget.h @@ -134,8 +134,12 @@ public: int height() const { return m_relative_rect.height(); } int length(Orientation orientation) const { return orientation == Orientation::Vertical ? height() : width(); } + virtual Margins content_margins() const { return { 0 }; } + Gfx::IntRect rect() const { return { 0, 0, width(), height() }; } Gfx::IntSize size() const { return m_relative_rect.size(); } + Gfx::IntRect content_rect() const { return this->content_margins().applied_to(rect()); }; + Gfx::IntSize content_size() const { return this->content_rect().size(); }; // Invalidate the widget (or an area thereof), causing a repaint to happen soon. void update();