mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:28:12 +00:00
LibWeb: Simplify flex container main size determination
We had an older incomplete implementation of flex container max-content sizing that we used for unconstrained main size determination. This patch replaces the old implementation with a call to the new max-content sizing code. Note that this isn't a complete implementation of flex container sizing still, but at least we've deduplicated some code.
This commit is contained in:
parent
18b1854aea
commit
dc66a3cad9
1 changed files with 2 additions and 34 deletions
|
@ -798,41 +798,9 @@ float FlexFormattingContext::content_based_minimum_size(FlexItem const& item) co
|
|||
// https://www.w3.org/TR/css-flexbox-1/#algo-main-container
|
||||
void FlexFormattingContext::determine_main_size_of_flex_container(bool const main_is_constrained, float const main_min_size, float const main_max_size)
|
||||
{
|
||||
// FIXME: This function should make use of our ability to calculate the flex container's
|
||||
// intrinsic max-content sizes.
|
||||
|
||||
// FIXME: This needs to be reworked.
|
||||
if (!main_is_constrained || !m_available_space->main.has_value()) {
|
||||
// Uses https://www.w3.org/TR/css-flexbox-1/#intrinsic-main-sizes
|
||||
// 9.9.1
|
||||
// 1.
|
||||
float largest_max_content_flex_fraction = 0;
|
||||
for (auto& flex_item : m_flex_items) {
|
||||
// FIXME: This needs some serious work.
|
||||
float max_content_contribution = calculated_main_size(flex_item.box);
|
||||
float max_content_flex_fraction = max_content_contribution - (flex_item.flex_base_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after);
|
||||
if (max_content_flex_fraction > 0) {
|
||||
max_content_flex_fraction /= max(flex_item.box.computed_values().flex_grow(), 1.0f);
|
||||
} else {
|
||||
max_content_flex_fraction /= flex_item.scaled_flex_shrink_factor;
|
||||
}
|
||||
flex_item.desired_flex_fraction = max_content_flex_fraction;
|
||||
|
||||
if (max_content_flex_fraction > largest_max_content_flex_fraction)
|
||||
largest_max_content_flex_fraction = max_content_flex_fraction;
|
||||
}
|
||||
|
||||
// 2. Omitted
|
||||
// 3.
|
||||
float result = 0;
|
||||
for (auto& flex_item : m_flex_items) {
|
||||
auto product = 0;
|
||||
if (flex_item.desired_flex_fraction > 0) {
|
||||
product = largest_max_content_flex_fraction * flex_item.box.computed_values().flex_grow();
|
||||
} else {
|
||||
product = largest_max_content_flex_fraction * flex_item.scaled_flex_shrink_factor;
|
||||
}
|
||||
result += flex_item.flex_base_size + flex_item.margins.main_before + flex_item.margins.main_after + flex_item.borders.main_before + flex_item.borders.main_after + flex_item.padding.main_before + flex_item.padding.main_after + product;
|
||||
}
|
||||
auto result = is_row_layout() ? calculate_max_content_width(flex_container()) : calculate_max_content_height(flex_container());
|
||||
m_available_space->main = css_clamp(result, main_min_size, main_max_size);
|
||||
}
|
||||
set_main_size(flex_container(), m_available_space->main.value_or(NumericLimits<float>::max()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue