mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:17:36 +00:00
LibGUI: Change preferred_size in Layout to new layout system
This commit is contained in:
parent
b2951a2116
commit
d825c8ad18
3 changed files with 48 additions and 59 deletions
|
@ -23,74 +23,66 @@ BoxLayout::BoxLayout(Orientation orientation)
|
||||||
"orientation", [this] { return m_orientation == Gfx::Orientation::Vertical ? "Vertical" : "Horizontal"; }, nullptr);
|
"orientation", [this] { return m_orientation == Gfx::Orientation::Vertical ? "Vertical" : "Horizontal"; }, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
Gfx::IntSize BoxLayout::preferred_size() const
|
UISize BoxLayout::preferred_size() const
|
||||||
{
|
{
|
||||||
Gfx::IntSize size;
|
VERIFY(m_owner);
|
||||||
size.set_primary_size_for_orientation(orientation(), preferred_primary_size());
|
|
||||||
size.set_secondary_size_for_orientation(orientation(), preferred_secondary_size());
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BoxLayout::preferred_primary_size() const
|
UIDimension result_primary { 0 };
|
||||||
{
|
UIDimension result_secondary { 0 };
|
||||||
auto widget = verify_cast<GUI::Widget>(parent());
|
|
||||||
int size = 0;
|
|
||||||
|
|
||||||
|
bool first_item { true };
|
||||||
for (auto& entry : m_entries) {
|
for (auto& entry : m_entries) {
|
||||||
if (!entry.widget || !entry.widget->is_visible())
|
if (!entry.widget || !entry.widget->is_visible())
|
||||||
continue;
|
continue;
|
||||||
int preferred_primary_size = -1;
|
|
||||||
if (entry.widget->is_shrink_to_fit() && entry.widget->layout()) {
|
UISize min_size = entry.widget->min_size();
|
||||||
preferred_primary_size = entry.widget->layout()->preferred_size().primary_size_for_orientation(orientation());
|
UISize max_size = entry.widget->max_size();
|
||||||
|
UISize preferred_size = entry.widget->preferred_size();
|
||||||
|
|
||||||
|
if (result_primary != SpecialDimension::Grow) {
|
||||||
|
UIDimension item_primary_size = clamp(
|
||||||
|
preferred_size.primary_size_for_orientation(orientation()),
|
||||||
|
min_size.primary_size_for_orientation(orientation()),
|
||||||
|
max_size.primary_size_for_orientation(orientation()));
|
||||||
|
|
||||||
|
if (item_primary_size.is_int())
|
||||||
|
result_primary.add_if_int(item_primary_size.as_int());
|
||||||
|
|
||||||
|
if (item_primary_size.is_grow())
|
||||||
|
result_primary = SpecialDimension::Grow;
|
||||||
|
|
||||||
|
if (!first_item)
|
||||||
|
result_primary.add_if_int(spacing());
|
||||||
}
|
}
|
||||||
int item_size = max(0, preferred_primary_size);
|
|
||||||
int min_size = entry.widget->min_size().primary_size_for_orientation(orientation());
|
|
||||||
if (min_size != -1)
|
|
||||||
item_size = max(min_size, item_size);
|
|
||||||
int max_size = entry.widget->max_size().primary_size_for_orientation(orientation());
|
|
||||||
if (max_size != -1)
|
|
||||||
item_size = min(max_size, item_size);
|
|
||||||
size += item_size + spacing();
|
|
||||||
}
|
|
||||||
if (size > 0)
|
|
||||||
size -= spacing();
|
|
||||||
|
|
||||||
auto content_margins = widget->content_margins();
|
{
|
||||||
if (orientation() == Gfx::Orientation::Horizontal)
|
UIDimension secondary_preferred_size = preferred_size.secondary_size_for_orientation(orientation());
|
||||||
size += margins().left() + margins().right() + content_margins.left() + content_margins.right();
|
|
||||||
else
|
|
||||||
size += margins().top() + margins().bottom() + content_margins.top() + content_margins.bottom();
|
|
||||||
|
|
||||||
if (!size)
|
if (secondary_preferred_size == SpecialDimension::OpportunisticGrow)
|
||||||
return -1;
|
secondary_preferred_size = 0;
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BoxLayout::preferred_secondary_size() const
|
UIDimension item_secondary_size = clamp(
|
||||||
{
|
secondary_preferred_size,
|
||||||
auto widget = verify_cast<GUI::Widget>(parent());
|
min_size.secondary_size_for_orientation(orientation()),
|
||||||
int size = 0;
|
max_size.secondary_size_for_orientation(orientation()));
|
||||||
for (auto& entry : m_entries) {
|
|
||||||
if (!entry.widget || !entry.widget->is_visible())
|
result_secondary = max(item_secondary_size, result_secondary);
|
||||||
continue;
|
|
||||||
int min_size = entry.widget->min_size().secondary_size_for_orientation(orientation());
|
|
||||||
int preferred_secondary_size = -1;
|
|
||||||
if (entry.widget->is_shrink_to_fit() && entry.widget->layout()) {
|
|
||||||
preferred_secondary_size = entry.widget->layout()->preferred_size().secondary_size_for_orientation(orientation());
|
|
||||||
size = max(size, preferred_secondary_size);
|
|
||||||
}
|
}
|
||||||
size = max(min_size, size);
|
|
||||||
|
first_item = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto content_margins = widget->content_margins();
|
result_primary.add_if_int(
|
||||||
if (orientation() == Gfx::Orientation::Horizontal)
|
margins().primary_total_for_orientation(orientation())
|
||||||
size += margins().top() + margins().bottom() + content_margins.top() + content_margins.bottom();
|
+ m_owner->content_margins().primary_total_for_orientation(orientation()));
|
||||||
else
|
|
||||||
size += margins().left() + margins().right() + content_margins.left() + content_margins.right();
|
|
||||||
|
|
||||||
if (!size)
|
result_secondary.add_if_int(
|
||||||
return -1;
|
margins().secondary_total_for_orientation(orientation())
|
||||||
return size;
|
+ m_owner->content_margins().secondary_total_for_orientation(orientation()));
|
||||||
|
|
||||||
|
if (orientation() == Gfx::Orientation::Horizontal)
|
||||||
|
return { result_primary, result_secondary };
|
||||||
|
return { result_secondary, result_primary };
|
||||||
}
|
}
|
||||||
|
|
||||||
UISize BoxLayout::min_size() const
|
UISize BoxLayout::min_size() const
|
||||||
|
|
|
@ -22,16 +22,13 @@ public:
|
||||||
Gfx::Orientation orientation() const { return m_orientation; }
|
Gfx::Orientation orientation() const { return m_orientation; }
|
||||||
|
|
||||||
virtual void run(Widget&) override;
|
virtual void run(Widget&) override;
|
||||||
virtual Gfx::IntSize preferred_size() const override;
|
virtual UISize preferred_size() const override;
|
||||||
virtual UISize min_size() const override;
|
virtual UISize min_size() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit BoxLayout(Gfx::Orientation);
|
explicit BoxLayout(Gfx::Orientation);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int preferred_primary_size() const;
|
|
||||||
int preferred_secondary_size() const;
|
|
||||||
|
|
||||||
Gfx::Orientation m_orientation;
|
Gfx::Orientation m_orientation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ public:
|
||||||
void remove_widget(Widget&);
|
void remove_widget(Widget&);
|
||||||
|
|
||||||
virtual void run(Widget&) = 0;
|
virtual void run(Widget&) = 0;
|
||||||
virtual Gfx::IntSize preferred_size() const = 0;
|
virtual UISize preferred_size() const = 0;
|
||||||
virtual UISize min_size() const = 0;
|
virtual UISize min_size() const = 0;
|
||||||
|
|
||||||
void notify_adopted(Badge<Widget>, Widget&);
|
void notify_adopted(Badge<Widget>, Widget&);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue