mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 10:57:34 +00:00
LibGUI: Make last auto-sized widget in a BoxLayout fill remaining space
Since space is divided evenly between widgets with SizePolicy::Fill, we were sometimes ending up with a couple of unused pixels after the last widget (due to rounding.) Fix this by always giving the slack pixels at the end to the very last auto-sized widget in the layout. This fixes an issue where it was sometimes possible to click on an "unreachable" part of a Splitter widget. :^)
This commit is contained in:
parent
91a97f7a42
commit
29aee5e0d6
1 changed files with 21 additions and 3 deletions
|
@ -56,7 +56,10 @@ void BoxLayout::run(Widget& widget)
|
||||||
if (should_log)
|
if (should_log)
|
||||||
dbgprintf("BoxLayout: Starting with available size: %s\n", available_size.to_string().characters());
|
dbgprintf("BoxLayout: Starting with available size: %s\n", available_size.to_string().characters());
|
||||||
|
|
||||||
for (auto& entry : m_entries) {
|
int last_entry_with_automatic_size = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < m_entries.size(); ++i) {
|
||||||
|
auto& entry = m_entries[i];
|
||||||
if (entry.type == Entry::Type::Spacer) {
|
if (entry.type == Entry::Type::Spacer) {
|
||||||
++number_of_visible_entries;
|
++number_of_visible_entries;
|
||||||
}
|
}
|
||||||
|
@ -75,6 +78,8 @@ void BoxLayout::run(Widget& widget)
|
||||||
if (should_log)
|
if (should_log)
|
||||||
dbgprintf("BoxLayout: Available size after: %s\n", available_size.to_string().characters());
|
dbgprintf("BoxLayout: Available size after: %s\n", available_size.to_string().characters());
|
||||||
++number_of_entries_with_fixed_size;
|
++number_of_entries_with_fixed_size;
|
||||||
|
} else {
|
||||||
|
last_entry_with_automatic_size = i;
|
||||||
}
|
}
|
||||||
available_size -= { spacing(), spacing() };
|
available_size -= { spacing(), spacing() };
|
||||||
}
|
}
|
||||||
|
@ -92,14 +97,21 @@ void BoxLayout::run(Widget& widget)
|
||||||
dbgprintf("BoxLayout: available_size=%s, fixed=%d, fill=%d\n", available_size.to_string().characters(), number_of_entries_with_fixed_size, number_of_entries_with_automatic_size);
|
dbgprintf("BoxLayout: available_size=%s, fixed=%d, fill=%d\n", available_size.to_string().characters(), number_of_entries_with_fixed_size, number_of_entries_with_automatic_size);
|
||||||
|
|
||||||
Gfx::Size automatic_size;
|
Gfx::Size automatic_size;
|
||||||
|
Gfx::Size automatic_size_for_last_entry;
|
||||||
|
|
||||||
if (number_of_entries_with_automatic_size) {
|
if (number_of_entries_with_automatic_size) {
|
||||||
if (m_orientation == Orientation::Horizontal) {
|
if (m_orientation == Orientation::Horizontal) {
|
||||||
automatic_size.set_width(available_size.width() / number_of_entries_with_automatic_size);
|
automatic_size.set_width(available_size.width() / number_of_entries_with_automatic_size);
|
||||||
automatic_size.set_height(widget.height());
|
automatic_size.set_height(widget.height());
|
||||||
|
|
||||||
|
automatic_size_for_last_entry.set_width(available_size.width() - (number_of_entries_with_automatic_size - 1) * automatic_size.width());
|
||||||
|
automatic_size_for_last_entry.set_height(widget.height());
|
||||||
} else {
|
} else {
|
||||||
automatic_size.set_width(widget.width());
|
automatic_size.set_width(widget.width());
|
||||||
automatic_size.set_height(available_size.height() / number_of_entries_with_automatic_size);
|
automatic_size.set_height(available_size.height() / number_of_entries_with_automatic_size);
|
||||||
|
|
||||||
|
automatic_size_for_last_entry.set_width(widget.width());
|
||||||
|
automatic_size_for_last_entry.set_height(available_size.height() - (number_of_entries_with_automatic_size - 1) * automatic_size.height());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +121,8 @@ void BoxLayout::run(Widget& widget)
|
||||||
int current_x = margins().left();
|
int current_x = margins().left();
|
||||||
int current_y = margins().top();
|
int current_y = margins().top();
|
||||||
|
|
||||||
for (auto& entry : m_entries) {
|
for (int i = 0; i < m_entries.size(); ++i) {
|
||||||
|
auto& entry = m_entries[i];
|
||||||
if (entry.type == Entry::Type::Spacer) {
|
if (entry.type == Entry::Type::Spacer) {
|
||||||
current_x += automatic_size.width();
|
current_x += automatic_size.width();
|
||||||
current_y += automatic_size.height();
|
current_y += automatic_size.height();
|
||||||
|
@ -125,7 +138,12 @@ void BoxLayout::run(Widget& widget)
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
ASSERT(entry.widget);
|
ASSERT(entry.widget);
|
||||||
rect.set_size(automatic_size);
|
|
||||||
|
if (i == last_entry_with_automatic_size) {
|
||||||
|
rect.set_size(automatic_size_for_last_entry);
|
||||||
|
} else {
|
||||||
|
rect.set_size(automatic_size);
|
||||||
|
}
|
||||||
|
|
||||||
if (entry.widget->size_policy(Orientation::Vertical) == SizePolicy::Fixed)
|
if (entry.widget->size_policy(Orientation::Vertical) == SizePolicy::Fixed)
|
||||||
rect.set_height(entry.widget->preferred_size().height());
|
rect.set_height(entry.widget->preferred_size().height());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue