hasHoles method
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;
}