mirror of
https://github.com/immich-app/immich.git
synced 2025-06-21 14:31:03 -04:00
* wip: timeline * more segment extensions * added scrubber * refactor: timeline state * more refactors * fix scrubber segments * added remote thumb & thumbhash provider * feat: merged view * scrub / merged asset fixes * rename stuff & add tile indicators * fix local album timeline query * ignore hidden assets during sync * ignore recovered assets during sync * old scrubber * add video indicator * handle groupBy * handle partner inTimeline * show duration * reduce widget nesting in thumb tile * merge main * chore: extend cacheExtent * ignore touch events on scrub label when not visible * scrub label ignore events and hide immediately * auto reload on sync * refactor image providers * throttle db updates --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
76 lines
2.3 KiB
Dart
76 lines
2.3 KiB
Dart
import 'package:immich_mobile/domain/models/timeline.model.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;
|
|
|
|
const FixedSegmentBuilder({
|
|
required super.buckets,
|
|
required this.tileHeight,
|
|
required this.columnCount,
|
|
super.spacing,
|
|
super.groupBy,
|
|
});
|
|
|
|
List<Segment> generate() {
|
|
final segments = <Segment>[];
|
|
int firstIndex = 0;
|
|
double startOffset = 0;
|
|
int assetIndex = 0;
|
|
DateTime? previousDate;
|
|
|
|
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 =>
|
|
bucket is TimeBucket && bucket.date.month != previousDate?.month
|
|
? 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.add(
|
|
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;
|
|
}
|
|
}
|