1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 07:17:35 +00:00

LibWeb: Add for_each_spanned_track to iterate spanned tracks in GFC

Introducing for_each_spanned_track that allows to iterate tracks
spanned by a specific items allow to delete a lot of repeated code.
This commit is contained in:
Aliaksandr Kalenik 2023-05-17 15:34:33 +03:00 committed by Andreas Kling
parent 628efda754
commit 5312a140fe
2 changed files with 36 additions and 35 deletions

View file

@ -927,11 +927,9 @@ void GridFormattingContext::increase_sizes_to_accommodate_spanning_items_crossin
continue; continue;
Vector<TemporaryTrack&> spanned_tracks; Vector<TemporaryTrack&> spanned_tracks;
auto item_start_track_index = item.raw_position(dimension); for_each_spanned_track_by_item(item, dimension, [&](TemporaryTrack& track) {
for (size_t span = 0; span < item_span; span++) {
auto& track = tracks[item_start_track_index + span];
spanned_tracks.append(track); spanned_tracks.append(track);
} });
auto item_spans_tracks_with_flexible_sizing_function = any_of(spanned_tracks, [](auto& track) { auto item_spans_tracks_with_flexible_sizing_function = any_of(spanned_tracks, [](auto& track) {
return track.min_track_sizing_function.is_flexible_length() || track.max_track_sizing_function.is_flexible_length(); return track.min_track_sizing_function.is_flexible_length() || track.max_track_sizing_function.is_flexible_length();
@ -967,15 +965,9 @@ void GridFormattingContext::increase_sizes_to_accommodate_spanning_items_crossin
auto& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows; auto& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows;
for (auto& item : m_grid_items) { for (auto& item : m_grid_items) {
Vector<TemporaryTrack&> spanned_tracks; Vector<TemporaryTrack&> spanned_tracks;
auto item_start_track_index = item.raw_position(dimension); for_each_spanned_track_by_item(item, dimension, [&](TemporaryTrack& track) {
size_t span = 0;
// FIXME: out of bounds check should not be needed here and currently present only
// because there is some placement bug for tracks with repeat()
while (span < item.span(dimension) && item_start_track_index + span < tracks.size()) {
auto& track = tracks[item_start_track_index + span];
spanned_tracks.append(track); spanned_tracks.append(track);
span++; });
}
auto item_spans_tracks_with_flexible_sizing_function = any_of(spanned_tracks, [](auto& track) { auto item_spans_tracks_with_flexible_sizing_function = any_of(spanned_tracks, [](auto& track) {
return track.min_track_sizing_function.is_flexible_length() || track.max_track_sizing_function.is_flexible_length(); return track.min_track_sizing_function.is_flexible_length() || track.max_track_sizing_function.is_flexible_length();
@ -1120,16 +1112,11 @@ void GridFormattingContext::expand_flexible_tracks(AvailableSpace const& availab
for (auto& item : m_grid_items) { for (auto& item : m_grid_items) {
Vector<TemporaryTrack&> spanned_tracks; Vector<TemporaryTrack&> spanned_tracks;
bool crosses_flexible_track = false; bool crosses_flexible_track = false;
for (size_t span = 0; span < item.span(dimension); span++) { for_each_spanned_track_by_item(item, dimension, [&](TemporaryTrack& track) {
// FIXME: This check should not be need if grid item positioning works correct
if (item.raw_position(dimension) + span >= tracks.size())
break;
auto& track = tracks[item.raw_position(dimension) + span];
spanned_tracks.append(track); spanned_tracks.append(track);
if (track.max_track_sizing_function.is_flexible_length()) if (track.max_track_sizing_function.is_flexible_length())
crosses_flexible_track = true; crosses_flexible_track = true;
} });
if (crosses_flexible_track) if (crosses_flexible_track)
result = max(result, find_the_size_of_an_fr(spanned_tracks, calculate_max_content_size(item, dimension))); result = max(result, find_the_size_of_an_fr(spanned_tracks, calculate_max_content_size(item, dimension)));
@ -1651,33 +1638,21 @@ AvailableSpace GridFormattingContext::get_available_space_for_item(GridItem cons
{ {
CSSPixels column_width = 0; CSSPixels column_width = 0;
bool has_columns_with_definite_base_size = false; bool has_columns_with_definite_base_size = false;
for (size_t span = 0; span < item.raw_column_span(); span++) { for_each_spanned_track_by_item(item, GridDimension::Column, [&](TemporaryTrack const& track) {
// FIXME: This check should not be need if grid item positioning works correct
if (item.raw_column() + span >= m_grid_columns.size())
break;
auto& track = m_grid_columns[item.raw_column() + span];
column_width += track.base_size; column_width += track.base_size;
if (track.has_definite_base_size) if (track.has_definite_base_size)
has_columns_with_definite_base_size = true; has_columns_with_definite_base_size = true;
} });
AvailableSize available_width = has_columns_with_definite_base_size ? AvailableSize::make_definite(column_width) : AvailableSize::make_indefinite(); AvailableSize available_width = has_columns_with_definite_base_size ? AvailableSize::make_definite(column_width) : AvailableSize::make_indefinite();
CSSPixels column_height = 0; CSSPixels column_height = 0;
bool has_rows_with_definite_base_size = false; bool has_rows_with_definite_base_size = false;
for (size_t span = 0; span < item.raw_row_span(); span++) { for_each_spanned_track_by_item(item, GridDimension::Row, [&](TemporaryTrack const& track) {
// FIXME: This check should not be need if grid item positioning works correct
if (item.raw_row() + span >= m_grid_rows.size())
break;
auto& track = m_grid_rows[item.raw_row() + span];
column_height += track.base_size; column_height += track.base_size;
if (track.has_definite_base_size) if (track.has_definite_base_size)
has_rows_with_definite_base_size = true; has_rows_with_definite_base_size = true;
} });
AvailableSize available_height = has_rows_with_definite_base_size ? AvailableSize::make_definite(column_height) : AvailableSize::make_indefinite(); AvailableSize available_height = has_rows_with_definite_base_size ? AvailableSize::make_definite(column_height) : AvailableSize::make_indefinite();

View file

@ -160,6 +160,32 @@ private:
Vector<TemporaryTrack> m_grid_rows; Vector<TemporaryTrack> m_grid_rows;
Vector<TemporaryTrack> m_grid_columns; Vector<TemporaryTrack> m_grid_columns;
template<typename Callback>
void for_each_spanned_track_by_item(GridItem const& item, GridDimension const dimension, Callback callback)
{
auto& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows;
for (size_t span = 0; span < item.span(dimension); span++) {
if (item.raw_position(dimension) + span >= tracks.size())
break;
auto& track = tracks[item.raw_position(dimension) + span];
callback(track);
}
}
template<typename Callback>
void for_each_spanned_track_by_item(GridItem const& item, GridDimension const dimension, Callback callback) const
{
auto const& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows;
for (size_t span = 0; span < item.span(dimension); span++) {
if (item.raw_position(dimension) + span >= tracks.size())
break;
auto const& track = tracks[item.raw_position(dimension) + span];
callback(track);
}
}
Vector<TemporaryTrack> m_row_gap_tracks; Vector<TemporaryTrack> m_row_gap_tracks;
Vector<TemporaryTrack> m_column_gap_tracks; Vector<TemporaryTrack> m_column_gap_tracks;