Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 17 additions & 21 deletions lib/src/layouts/staired.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ class StairedGridTile {
}

/// Controls the layout of tiles in a staired grid.
class SliverStairedGridDelegate
extends SliverPatternGridDelegate<StairedGridTile> {
class SliverStairedGridDelegate extends SliverPatternGridDelegate<StairedGridTile> {
/// Creates a [SliverStairedGridDelegate].
const SliverStairedGridDelegate({
required List<StairedGridTile> pattern,
double mainAxisSpacing = 0,
double crossAxisSpacing = 0,
this.tileBottomSpace = 0,
this.startCrossAxisDirectionReversed = false,
this.haveDefaultReverse = true,
}) : assert(tileBottomSpace >= 0),
super.count(
pattern: pattern,
Expand All @@ -59,6 +59,9 @@ class SliverStairedGridDelegate
/// axis direction.
final bool startCrossAxisDirectionReversed;

/// on or off default reverse axis direction
final bool haveDefaultReverse;

@override
SliverPatternGridGeometries getGeometries(
SliverConstraints constraints,
Expand All @@ -71,8 +74,7 @@ class SliverStairedGridDelegate
);
int i = 0;
double mainAxisOffset = 0;
double crossAxisOffset =
startCrossAxisDirectionReversed ? maxCrossAxisExtent : 0;
double crossAxisOffset = startCrossAxisDirectionReversed ? maxCrossAxisExtent : 0;
bool reversed = startCrossAxisDirectionReversed;
while (i < tileCount) {
int startIndex = i;
Expand All @@ -87,9 +89,7 @@ class SliverStairedGridDelegate
}
final tileBottomSpaceSum = tileBottomSpace * (i - startIndex);
final isHorizontal = constraints.axis == Axis.horizontal;
final usableCrossAxisExtent = ((startIndex == 0
? maxCrossAxisExtent
: maxCrossAxisExtent - crossAxisSpacing) -
final usableCrossAxisExtent = ((startIndex == 0 ? maxCrossAxisExtent : maxCrossAxisExtent - crossAxisSpacing) -
(i - startIndex - 1) * crossAxisSpacing -
(i == tileCount ? crossAxisSpacing : 0) -
(isHorizontal ? tileBottomSpaceSum : 0))
Expand All @@ -98,12 +98,9 @@ class SliverStairedGridDelegate
double targetMainAxisOffset = 0;
for (int j = startIndex; j < i; j++) {
final tile = pattern[j];
final crossAxisExtent = usableCrossAxisExtent * tile.crossAxisRatio +
(isHorizontal ? tileBottomSpace : 0);
final mainAxisExtent = crossAxisExtent / tile.aspectRatio +
(isHorizontal ? 0 : tileBottomSpace);
crossAxisOffset =
reversed ? crossAxisOffset - crossAxisExtent : crossAxisOffset;
final crossAxisExtent = usableCrossAxisExtent * tile.crossAxisRatio + (isHorizontal ? tileBottomSpace : 0);
final mainAxisExtent = crossAxisExtent / tile.aspectRatio + (isHorizontal ? 0 : tileBottomSpace);
crossAxisOffset = reversed ? crossAxisOffset - crossAxisExtent : crossAxisOffset;
final tileRect = SliverGridGeometry(
scrollOffset: mainAxisOffset,
crossAxisOffset: crossAxisOffset,
Expand All @@ -112,9 +109,8 @@ class SliverStairedGridDelegate
);
final endMainAxisOffset = mainAxisOffset + mainAxisExtent;

crossAxisOffset = reversed
? crossAxisOffset - crossAxisSpacing
: crossAxisOffset + crossAxisExtent + crossAxisSpacing;
crossAxisOffset =
reversed ? crossAxisOffset - crossAxisSpacing : crossAxisOffset + crossAxisExtent + crossAxisSpacing;
mainAxisOffset += mainAxisSpacing;
geometries[j] = tileRect;
if (endMainAxisOffset > targetMainAxisOffset) {
Expand All @@ -123,9 +119,10 @@ class SliverStairedGridDelegate
}

mainAxisOffset = targetMainAxisOffset + mainAxisSpacing;
reversed = !reversed;
crossAxisOffset =
reversed ? maxCrossAxisExtent - crossAxisSpacing : crossAxisSpacing;

if (haveDefaultReverse) reversed = !reversed;

crossAxisOffset = reversed ? maxCrossAxisExtent - crossAxisSpacing : crossAxisSpacing;
}

return SliverPatternGridGeometries(tiles: geometries, bounds: geometries);
Expand All @@ -135,7 +132,6 @@ class SliverStairedGridDelegate
bool shouldRelayout(SliverStairedGridDelegate oldDelegate) {
return super.shouldRelayout(oldDelegate) ||
oldDelegate.tileBottomSpace != tileBottomSpace ||
oldDelegate.startCrossAxisDirectionReversed !=
startCrossAxisDirectionReversed;
oldDelegate.startCrossAxisDirectionReversed != startCrossAxisDirectionReversed;
}
}