aves/lib/widgets/common/grid/sections/mosaic/section_layout.dart
2022-09-24 18:42:03 +02:00

61 lines
1.9 KiB
Dart

import 'package:aves/widgets/common/grid/sections/section_layout.dart';
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart';
class MosaicSectionLayout extends SectionLayout {
final List<MosaicRowLayout> rows;
@override
List<Object?> get props => [sectionKey, firstIndex, lastIndex, minOffset, maxOffset, headerExtent, rows, spacing];
const MosaicSectionLayout({
required super.sectionKey,
required super.firstIndex,
required super.lastIndex,
required super.minOffset,
required super.maxOffset,
required super.headerExtent,
required this.rows,
required super.spacing,
required super.builder,
});
@override
double indexToLayoutOffset(int index) {
index -= bodyFirstIndex;
if (index < 0) return minOffset;
return bodyMinOffset + (index < rows.length ? rows[index].minOffset : rows.lastOrNull?.maxOffset ?? 0);
}
@override
int getMinChildIndexForScrollOffset(double scrollOffset) {
scrollOffset -= bodyMinOffset;
if (scrollOffset < 0) return firstIndex;
return bodyFirstIndex + rows.indexWhere((v) => scrollOffset < v.maxOffset);
}
@override
int getMaxChildIndexForScrollOffset(double scrollOffset) {
scrollOffset -= bodyMinOffset;
if (scrollOffset < 0) return firstIndex;
final rowIndex = rows.indexWhere((v) => scrollOffset < v.maxOffset);
return bodyFirstIndex + (rowIndex == -1 ? rows.length - 1 : rowIndex);
}
}
class MosaicRowLayout extends Equatable {
final int firstIndex, lastIndex;
final double minOffset, maxOffset, height;
final List<double> itemWidths;
@override
List<Object?> get props => [firstIndex, lastIndex, minOffset, maxOffset, height, itemWidths];
const MosaicRowLayout({
required this.firstIndex,
required this.lastIndex,
required this.minOffset,
required this.height,
required this.itemWidths,
}) : maxOffset = minOffset + height;
}