1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:48:12 +00:00

LibWeb: Move FFC layout algorithm step 5 to a separate function

This commit is contained in:
Andreas Kling 2021-10-13 22:07:55 +02:00
parent fa7bbc602d
commit 0fd25fcbbc
2 changed files with 34 additions and 22 deletions

View file

@ -131,28 +131,7 @@ void FlexFormattingContext::run(Box& flex_container, LayoutMode)
// 5. Collect flex items into flex lines:
// After this step no additional items are to be added to flex_lines or any of its items!
Vector<FlexLine> flex_lines;
// FIXME: Also support wrap-reverse
if (flex_container.computed_values().flex_wrap() == CSS::FlexWrap::Nowrap) {
FlexLine line;
for (auto& flex_item : flex_items) {
line.items.append(&flex_item);
}
flex_lines.append(line);
} else {
FlexLine line;
float line_main_size = 0;
for (auto& flex_item : flex_items) {
if ((line_main_size + flex_item.hypothetical_main_size) > main_available_size) {
flex_lines.append(line);
line = {};
line_main_size = 0;
}
line.items.append(&flex_item);
line_main_size += flex_item.hypothetical_main_size;
}
flex_lines.append(line);
}
auto flex_lines = collect_flex_items_into_flex_lines(flex_container, flex_items, main_available_size);
// 6. Resolve the flexible lengths https://www.w3.org/TR/css-flexbox-1/#resolve-flexible-lengths
enum FlexFactor {
@ -921,4 +900,34 @@ void FlexFormattingContext::determine_main_size_of_flex_container(Box& flex_cont
set_main_size(flex_container, main_available_size);
}
// https://www.w3.org/TR/css-flexbox-1/#algo-line-break
Vector<FlexLine> FlexFormattingContext::collect_flex_items_into_flex_lines(Box const& flex_container, Vector<FlexItem>& flex_items, float main_available_size)
{
Vector<FlexLine> flex_lines;
// FIXME: Also support wrap-reverse
if (flex_container.computed_values().flex_wrap() == CSS::FlexWrap::Nowrap) {
FlexLine line;
for (auto& flex_item : flex_items) {
line.items.append(&flex_item);
}
flex_lines.append(line);
} else {
FlexLine line;
float line_main_size = 0;
for (auto& flex_item : flex_items) {
if ((line_main_size + flex_item.hypothetical_main_size) > main_available_size) {
flex_lines.append(line);
line = {};
line_main_size = 0;
}
line.items.append(&flex_item);
line_main_size += flex_item.hypothetical_main_size;
}
flex_lines.append(line);
}
return flex_lines;
}
}