nc-photos/app/lib/widget/photo_list_util.dart

149 lines
3.8 KiB
Dart
Raw Normal View History

2022-09-05 06:49:26 +02:00
import 'dart:math' as math;
2023-03-13 12:55:39 +01:00
import 'package:clock/clock.dart';
2022-07-25 07:51:52 +02:00
import 'package:collection/collection.dart';
2022-01-15 11:35:15 +01:00
import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart';
import 'package:nc_photos/entity/collection.dart';
import 'package:nc_photos/entity/collection/content_provider/memory.dart';
import 'package:nc_photos/entity/file_descriptor.dart';
2022-12-16 16:01:04 +01:00
import 'package:np_codegen/np_codegen.dart';
import 'package:np_datetime/np_datetime.dart';
2022-12-16 16:01:04 +01:00
part 'photo_list_util.g.dart';
2021-10-04 15:53:03 +02:00
2021-12-19 12:30:56 +01:00
class DateGroupHelper {
DateGroupHelper({
2021-10-04 15:53:03 +02:00
required this.isMonthOnly,
});
Date? onDate(Date date) {
if (date.year != _currentDate?.year ||
date.month != _currentDate?.month ||
(!isMonthOnly && date.day != _currentDate?.day)) {
_currentDate = date;
return date;
2022-04-22 21:19:41 +02:00
} else {
return null;
2021-10-04 15:53:03 +02:00
}
}
final bool isMonthOnly;
Date? _currentDate;
2021-10-04 15:53:03 +02:00
}
2021-12-19 12:44:41 +01:00
/// Build memory collection from files
2022-01-15 11:35:15 +01:00
///
/// Feb 29 is treated as Mar 1 on non leap years
2022-12-16 16:01:04 +01:00
@npLog
class MemoryCollectionHelper {
MemoryCollectionHelper(
this.account, {
Date? today,
2022-09-05 06:49:26 +02:00
required int dayRange,
}) : _tzOffset = clock.now().timeZoneOffset,
// today = (today?.toLocal() ?? clock.now()).toMidnight(),
dayRange = math.max(dayRange, 0) {
this.today = today ?? Date.today();
}
2022-01-15 11:35:15 +01:00
void addFile(
FileDescriptor f, {
Date? localDate,
}) {
// too slow
// final localDate = f.fdDateTime.toLocal().toMidnight();
localDate ??= f.fdDateTime.add(_tzOffset).toDate();
final diff = today.difference(localDate).inDays;
2022-01-15 11:35:15 +01:00
if (diff < 300) {
return;
}
for (final dy in [0, -1, 1]) {
if (today
.copyWith(year: localDate.year + dy)
.difference(localDate)
.abs()
.inDays <=
2022-09-05 06:49:26 +02:00
dayRange) {
_log.fine(
"[addFile] Add file (${f.fdDateTime}) to ${localDate.year + dy}");
_addFileToYear(f, localDate.year + dy);
2022-01-15 11:35:15 +01:00
break;
}
}
}
/// Build list of memory albums
///
/// [nameBuilder] is a function that return the name of the album for a
/// particular year
List<Collection> build(String Function(int year) nameBuilder) {
2022-01-15 11:35:15 +01:00
return _data.entries
.sorted((a, b) => b.key.compareTo(a.key))
.map((e) => Collection(
2022-01-15 11:35:15 +01:00
name: nameBuilder(e.key),
contentProvider: CollectionMemoryProvider(
account: account,
year: e.key,
month: today.month,
day: today.day,
cover: e.value.coverFile,
),
2022-01-15 11:35:15 +01:00
))
.toList();
}
void _addFileToYear(FileDescriptor f, int year) {
2022-01-15 11:35:15 +01:00
final item = _data[year];
final date = today.copyWith(year: year);
if (item == null) {
_data[year] = _MemoryCollectionHelperItem(date, f);
2022-01-15 11:35:15 +01:00
} else {
final coverDiff = _MemoryCollectionHelperItem.getCoverDiff(date, f);
2022-01-15 11:35:15 +01:00
if (coverDiff < item.coverDiff) {
item.coverFile = f;
item.coverDiff = coverDiff;
}
}
}
final Account account;
late final Date today;
2022-09-05 06:49:26 +02:00
final int dayRange;
final Duration _tzOffset;
final _data = <int, _MemoryCollectionHelperItem>{};
2022-01-15 11:35:15 +01:00
}
2021-12-19 12:44:41 +01:00
int getThumbSize(int zoomLevel) {
switch (zoomLevel) {
case -1:
return 96;
case 1:
return 176;
case 2:
return 256;
case 0:
default:
return 112;
}
}
2022-01-15 11:35:15 +01:00
class _MemoryCollectionHelperItem {
_MemoryCollectionHelperItem(this.date, this.coverFile)
2022-01-15 11:35:15 +01:00
: coverDiff = getCoverDiff(date, coverFile);
static Duration getCoverDiff(Date date, FileDescriptor f) => f.fdDateTime
.add(_tzOffset)
.difference(date.toLocalDateTime().copyWith(hour: 12))
.abs();
2022-01-15 11:35:15 +01:00
final Date date;
FileDescriptor coverFile;
2022-01-15 11:35:15 +01:00
Duration coverDiff;
static final Duration _tzOffset = clock.now().timeZoneOffset;
2022-01-15 11:35:15 +01:00
}