mertalev ddd65dea58
thumbhash improvements
thumbhash render box

refactor

wip

rebase
2025-08-11 01:08:57 -04:00

70 lines
2.4 KiB
Dart

import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/extensions/datetime_extensions.dart';
import 'package:immich_mobile/presentation/widgets/timeline/fixed/segment.model.dart';
import 'package:immich_mobile/presentation/widgets/timeline/segment.model.dart';
import 'package:immich_mobile/presentation/widgets/timeline/segment_builder.dart';
class FixedSegmentBuilder extends SegmentBuilder {
final double tileHeight;
final int columnCount;
static final DateTime _dummyDate = DateTime.fromMicrosecondsSinceEpoch(0);
const FixedSegmentBuilder({
required super.buckets,
required this.tileHeight,
required this.columnCount,
super.spacing,
super.groupBy,
});
List<Segment> generate() {
final segments = List.filled(buckets.length, const FixedSegment.empty());
int firstIndex = 0;
double startOffset = 0;
int assetIndex = 0;
DateTime previousDate = _dummyDate;
for (int i = 0; i < buckets.length; i++) {
final bucket = buckets[i];
final assetCount = bucket.assetCount;
final numberOfRows = (assetCount / columnCount).ceil();
final segmentCount = numberOfRows + 1;
final segmentFirstIndex = firstIndex;
firstIndex += segmentCount;
final segmentLastIndex = firstIndex - 1;
final timelineHeader = switch (groupBy) {
GroupAssetsBy.month => HeaderType.month,
GroupAssetsBy.day || GroupAssetsBy.auto =>
bucket is TimeBucket && !previousDate.isSameMonth(bucket.date) ? HeaderType.monthAndDay : HeaderType.day,
GroupAssetsBy.none => HeaderType.none,
};
final headerExtent = SegmentBuilder.headerExtent(timelineHeader);
final segmentStartOffset = startOffset;
startOffset += headerExtent + (tileHeight * numberOfRows) + spacing * (numberOfRows - 1);
final segmentEndOffset = startOffset;
segments[i] = FixedSegment(
firstIndex: segmentFirstIndex,
lastIndex: segmentLastIndex,
startOffset: segmentStartOffset,
endOffset: segmentEndOffset,
firstAssetIndex: assetIndex,
bucket: bucket,
tileHeight: tileHeight,
columnCount: columnCount,
headerExtent: headerExtent,
spacing: spacing,
header: timelineHeader,
);
assetIndex += assetCount;
if (bucket is TimeBucket) {
previousDate = bucket.date;
}
}
return segments;
}
}