hasHoles method

bool hasHoles(
  1. Widget widget
)

Detects holes (gaps) in a quilt's layout by simulating placement.

Analyzes tile occupations per column, returning true if heights exceed occupied rows. Used for validation in hole-allowed styles like tape views.

Implementation

bool hasHoles(Widget widget) {
  StaggeredGrid grid = getStaggeredGrid(widget);
  final List<StaggeredGridTile> tiles =
      grid.children.whereType<StaggeredGridTile>().toList();
  final List<int> heights = List.filled(style.carpetWidth, 0);
  final List<Set<int>> occupied =
      List.generate(style.carpetWidth, (_) => <int>{});

  for (StaggeredGridTile tile in tiles) {
    final int w = tile.crossAxisCellCount;
    final int h = tile.mainAxisCellCount!.toInt();
    int bestC = -1;
    int bestR = 2147483647;
    for (int c = 0; c <= style.carpetWidth - w; c++) {
      int maxH = 0;

      for (int dc = 0; dc < w; dc++) {
        maxH = max(maxH, heights[c + dc]);
      }

      if (maxH < bestR || (maxH == bestR && c < bestC)) {
        bestR = maxH;
        bestC = c;
      }
    }

    if (bestC == -1) return true;

    for (int dc = 0; dc < w; dc++) {
      final int col = bestC + dc;

      for (int dr = 0; dr < h; dr++) {
        occupied[col].add(bestR + dr);
      }

      heights[col] = max(heights[col], bestR + h);
    }
  }
  for (int col = 0; col < style.carpetWidth; col++) {
    if (heights[col] > 0 && occupied[col].length < heights[col]) return true;
  }
  return false;
}