summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGUI
diff options
context:
space:
mode:
authorMart G <martg_@hotmail.com>2021-05-29 11:30:51 +0200
committerAndreas Kling <kling@serenityos.org>2021-05-29 15:50:04 +0200
commit07e3934f013d9ede4885534973e4fb13e032c517 (patch)
tree9f4378a19e21fe493f567a6c975a8b353162d960 /Userland/Libraries/LibGUI
parent77f9f442d80027b7ebff595e8147d70c84e5efae (diff)
downloadserenity-07e3934f013d9ede4885534973e4fb13e032c517.zip
LibGUI: Distribute remaining pixels in BoxLayout to fill the entire area
Previously, the layout algorithm preferred to give every item an equally sized slice of the remaining space. This meant that not the entire area was used when the remaining size did not divide evenly by the number of items. This caused, for example, the ResizeCorner in HexEditor to be a couple of pixels left of the actual corner for some sizes of the window. Now, the remaining pixels are distributed on a first come, first served basis. However, only one pixel is distributed at a time. This means items towards the left might me a pixel larger than their siblings towards the right.
Diffstat (limited to 'Userland/Libraries/LibGUI')
-rw-r--r--Userland/Libraries/LibGUI/BoxLayout.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/Userland/Libraries/LibGUI/BoxLayout.cpp b/Userland/Libraries/LibGUI/BoxLayout.cpp
index 8ec88fe4d3..d2106766dc 100644
--- a/Userland/Libraries/LibGUI/BoxLayout.cpp
+++ b/Userland/Libraries/LibGUI/BoxLayout.cpp
@@ -150,13 +150,18 @@ void BoxLayout::run(Widget& widget)
// Pass 2: Distribute remaining available size evenly, respecting each item's maximum size.
while (unfinished_items && available_size > 0) {
int slice = available_size / unfinished_items;
+ // If available_size does not divide evenly by unfinished_items,
+ // there are some extra pixels that have to be distributed.
+ int pixels = available_size - slice * unfinished_items;
available_size = 0;
for (auto& item : items) {
if (item.final)
continue;
- int item_size_with_full_slice = item.size + slice;
+ int pixel = pixels ? 1 : 0;
+ pixels -= pixel;
+ int item_size_with_full_slice = item.size + slice + pixel;
item.size = item_size_with_full_slice;
if (item.max_size >= 0)