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

LibWeb: Refactor GridTrack maintenance in the GFC

Refactor the m_grid_columns and m_grid_rows to be maintained in the
class, which will make it easier to later create functions relating to
them.
This commit is contained in:
martinfalisse 2022-10-15 12:51:00 +02:00 committed by Andreas Kling
parent f7bd1edde3
commit 202620e80c
2 changed files with 38 additions and 38 deletions

View file

@ -513,29 +513,19 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// - A flexible sizing function (<flex>).
// The grid sizing algorithm defines how to resolve these sizing constraints into used track sizes.
struct GridTrack {
CSS::GridTrackSize min_track_sizing_function;
CSS::GridTrackSize max_track_sizing_function;
float base_size { 0 };
float growth_limit { 0 };
};
Vector<GridTrack> grid_rows;
Vector<GridTrack> grid_columns;
for (int x = 0; x < column_repeat_count; ++x) {
for (auto& meta_grid_track_size : box.computed_values().grid_template_columns().meta_grid_track_sizes())
grid_columns.append({ meta_grid_track_size.min_grid_track_size(), meta_grid_track_size.max_grid_track_size() });
m_grid_columns.append({ meta_grid_track_size.min_grid_track_size(), meta_grid_track_size.max_grid_track_size() });
}
for (int x = 0; x < row_repeat_count; ++x) {
for (auto& meta_grid_track_size : box.computed_values().grid_template_rows().meta_grid_track_sizes())
grid_rows.append({ meta_grid_track_size.min_grid_track_size(), meta_grid_track_size.max_grid_track_size() });
m_grid_rows.append({ meta_grid_track_size.min_grid_track_size(), meta_grid_track_size.max_grid_track_size() });
}
for (int column_index = grid_columns.size(); column_index < occupation_grid.column_count(); column_index++)
grid_columns.append({ CSS::GridTrackSize::make_auto(), CSS::GridTrackSize::make_auto() });
for (int row_index = grid_rows.size(); row_index < occupation_grid.row_count(); row_index++)
grid_rows.append({ CSS::GridTrackSize::make_auto(), CSS::GridTrackSize::make_auto() });
for (int column_index = m_grid_columns.size(); column_index < occupation_grid.column_count(); column_index++)
m_grid_columns.append({ CSS::GridTrackSize::make_auto(), CSS::GridTrackSize::make_auto() });
for (int row_index = m_grid_rows.size(); row_index < occupation_grid.row_count(); row_index++)
m_grid_rows.append({ CSS::GridTrackSize::make_auto(), CSS::GridTrackSize::make_auto() });
// https://www.w3.org/TR/css-grid-2/#algo-overview
// 12.1. Grid Sizing Algorithm
@ -619,7 +609,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// 12.4. Initialize Track Sizes
// Initialize each tracks base size and growth limit.
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
// For each track, if the tracks min track sizing function is:
switch (grid_column.min_track_sizing_function.type()) {
// - A fixed sizing function
@ -665,7 +655,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
}
// Initialize each tracks base size and growth limit.
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
// For each track, if the tracks min track sizing function is:
switch (grid_row.min_track_sizing_function.type()) {
// - A fixed sizing function
@ -732,7 +722,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// 2. Size tracks to fit non-spanning items: For each track with an intrinsic track sizing function and
// not a flexible sizing function, consider the items in it with a span of 1:
int index = 0;
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (!grid_column.min_track_sizing_function.is_intrinsic_track_sizing()) {
++index;
continue;
@ -796,7 +786,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
}
index = 0;
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (!grid_row.min_track_sizing_function.is_intrinsic_track_sizing()) {
++index;
continue;
@ -988,7 +978,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// First, find the grids used flex fraction:
auto column_flex_factor_sum = 0;
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (grid_column.min_track_sizing_function.is_flexible_length())
column_flex_factor_sum++;
}
@ -1000,7 +990,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// See 12.7.1.
float sized_column_widths = 0;
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (!grid_column.min_track_sizing_function.is_flexible_length())
sized_column_widths += grid_column.base_size;
}
@ -1015,7 +1005,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// The used flex fraction is the result of finding the size of an fr using all of the grid tracks
// and a space to fill of the available grid space.
if (free_horizontal_space > 0) {
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (grid_column.min_track_sizing_function.is_flexible_length()) {
// See 12.7.1.
// Let the hypothetical fr size be the leftover space divided by the flex factor sum.
@ -1029,7 +1019,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// First, find the grids used flex fraction:
auto row_flex_factor_sum = 0;
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (grid_row.min_track_sizing_function.is_flexible_length())
row_flex_factor_sum++;
}
@ -1041,7 +1031,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// See 12.7.1.
float sized_row_heights = 0;
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (!grid_row.min_track_sizing_function.is_flexible_length())
sized_row_heights += grid_row.base_size;
}
@ -1056,7 +1046,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// The used flex fraction is the result of finding the size of an fr using all of the grid tracks
// and a space to fill of the available grid space.
if (free_vertical_space > 0) {
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (grid_row.min_track_sizing_function.is_flexible_length()) {
// See 12.7.1.
// Let the hypothetical fr size be the leftover space divided by the flex factor sum.
@ -1114,35 +1104,35 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
// container has a definite min-width/height, use that size to calculate the free space for this
// step instead.
float used_horizontal_space = 0;
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (!(grid_column.max_track_sizing_function.is_length() && grid_column.max_track_sizing_function.length().is_auto()))
used_horizontal_space += grid_column.base_size;
}
float remaining_horizontal_space = box_state.content_width() - used_horizontal_space;
auto count_of_auto_max_column_tracks = 0;
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (grid_column.max_track_sizing_function.is_length() && grid_column.max_track_sizing_function.length().is_auto())
count_of_auto_max_column_tracks++;
}
for (auto& grid_column : grid_columns) {
for (auto& grid_column : m_grid_columns) {
if (grid_column.max_track_sizing_function.is_length() && grid_column.max_track_sizing_function.length().is_auto())
grid_column.base_size = max(grid_column.base_size, remaining_horizontal_space / count_of_auto_max_column_tracks);
}
float used_vertical_space = 0;
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (!(grid_row.max_track_sizing_function.is_length() && grid_row.max_track_sizing_function.length().is_auto()))
used_vertical_space += grid_row.base_size;
}
float remaining_vertical_space = box_state.content_height() - used_vertical_space;
auto count_of_auto_max_row_tracks = 0;
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (grid_row.max_track_sizing_function.is_length() && grid_row.max_track_sizing_function.length().is_auto())
count_of_auto_max_row_tracks++;
}
for (auto& grid_row : grid_rows) {
for (auto& grid_row : m_grid_rows) {
if (grid_row.max_track_sizing_function.is_length() && grid_row.max_track_sizing_function.length().is_auto())
grid_row.base_size = max(grid_row.base_size, remaining_vertical_space / count_of_auto_max_row_tracks);
}
@ -1154,25 +1144,25 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
float y_start = 0;
float y_end = 0;
for (int i = 0; i < column_start; i++)
x_start += grid_columns[i].base_size;
x_start += m_grid_columns[i].base_size;
for (int i = 0; i < column_end; i++)
x_end += grid_columns[i].base_size;
x_end += m_grid_columns[i].base_size;
for (int i = 0; i < row_start; i++)
y_start += grid_rows[i].base_size;
y_start += m_grid_rows[i].base_size;
for (int i = 0; i < row_end; i++)
y_end += grid_rows[i].base_size;
y_end += m_grid_rows[i].base_size;
child_box_state.set_content_width(x_end - x_start);
child_box_state.set_content_height(y_end - y_start);
child_box_state.offset = { x_start, y_start };
};
for (auto& positioned_box : positioned_boxes) {
auto resolved_span = positioned_box.row + positioned_box.row_span > static_cast<int>(grid_rows.size()) ? static_cast<int>(grid_rows.size()) - positioned_box.row : positioned_box.row_span;
auto resolved_span = positioned_box.row + positioned_box.row_span > static_cast<int>(m_grid_rows.size()) ? static_cast<int>(m_grid_rows.size()) - positioned_box.row : positioned_box.row_span;
layout_box(positioned_box.row, positioned_box.row + resolved_span, positioned_box.column, positioned_box.column + positioned_box.column_span, positioned_box.box);
}
float total_y = 0;
for (auto& grid_row : grid_rows)
for (auto& grid_row : m_grid_rows)
total_y += grid_row.base_size;
m_automatic_content_height = total_y;
}