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

LibWeb: Include gaps in for_each_spanned_track_by_item in GFC

This fixes the issue when left free space is calculated incorrectly
because for_each_spanned_track_by_item does not include gap tracks.
This commit is contained in:
Aliaksandr Kalenik 2023-06-10 00:41:15 +03:00 committed by Andreas Kling
parent 85d14bdc5e
commit 10cab5fbdb
3 changed files with 201 additions and 7 deletions

View file

@ -188,29 +188,60 @@ private:
Vector<TemporaryTrack> m_grid_rows;
Vector<TemporaryTrack> m_grid_columns;
bool has_gaps(GridDimension const dimension) const
{
if (dimension == GridDimension::Column) {
return !grid_container().computed_values().column_gap().is_auto();
} else {
return !grid_container().computed_values().row_gap().is_auto();
}
}
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())
auto& gaps = dimension == GridDimension::Column ? m_column_gap_tracks : m_row_gap_tracks;
auto has_gaps = this->has_gaps(dimension);
auto item_span = item.span(dimension);
auto item_index = item.raw_position(dimension);
for (size_t span = 0; span < item_span; span++) {
auto track_index = item_index + span;
if (track_index >= tracks.size())
break;
auto& track = tracks[item.raw_position(dimension) + span];
auto& track = tracks[track_index];
callback(track);
auto is_last_spanned_track = span == item_span - 1;
if (has_gaps && !is_last_spanned_track) {
auto& gap = gaps[track_index];
callback(gap);
}
}
}
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())
auto& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows;
auto& gaps = dimension == GridDimension::Column ? m_column_gap_tracks : m_row_gap_tracks;
auto has_gaps = this->has_gaps(dimension);
auto item_span = item.span(dimension);
auto item_index = item.raw_position(dimension);
for (size_t span = 0; span < item_span; span++) {
auto track_index = item_index + span;
if (track_index >= tracks.size())
break;
auto const& track = tracks[item.raw_position(dimension) + span];
auto& track = tracks[track_index];
callback(track);
auto is_last_spanned_track = span == item_span - 1;
if (has_gaps && !is_last_spanned_track) {
auto& gap = gaps[track_index];
callback(gap);
}
}
}