aves/lib/model/dynamic_albums.dart
2025-05-05 19:14:40 +02:00

109 lines
2.9 KiB
Dart

import 'package:aves/model/filters/covered/dynamic_album.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/services/common/services.dart';
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
final DynamicAlbums dynamicAlbums = DynamicAlbums._private();
class DynamicAlbums with ChangeNotifier {
Set<DynamicAlbumFilter> _rows = {};
DynamicAlbums._private() {
if (kFlutterMemoryAllocationsEnabled) ChangeNotifier.maybeDispatchObjectCreation(this);
}
Future<void> init() async {
_rows = (await localMediaDb.loadAllDynamicAlbums()).map((v) => DynamicAlbumFilter(v.name, v.filter)).toSet();
}
int get count => _rows.length;
Set<DynamicAlbumFilter> get all => Set.unmodifiable(_rows);
Future<void> add(DynamicAlbumFilter filter) async {
await localMediaDb.addDynamicAlbums({DynamicAlbumRow(name: filter.name, filter: filter.filter)});
_rows.add(filter);
notifyListeners();
}
Future<void> remove(Set<DynamicAlbumFilter> filters) async {
await localMediaDb.removeDynamicAlbums(filters.map((filter) => filter.name).toSet());
_rows.removeAll(filters);
notifyListeners();
}
Future<void> clear() async {
await localMediaDb.clearDynamicAlbums();
_rows.clear();
notifyListeners();
}
Future<void> rename(DynamicAlbumFilter filter, String newName) async {
await localMediaDb.removeDynamicAlbums({filter.name});
_rows.remove(filter);
await add(DynamicAlbumFilter(newName, filter.filter));
}
DynamicAlbumFilter? get(String name) => _rows.firstWhereOrNull((row) => row.name == name);
bool contains(String? name) => name != null && get(name) != null;
// import/export
List<String>? export() {
final jsonList = all.map((row) => row.toJson()).toList();
return jsonList.isNotEmpty ? jsonList : null;
}
void import(dynamic jsonList) {
if (jsonList is! List) {
debugPrint('failed to import dynamic albums for jsonMap=$jsonList');
return;
}
jsonList.forEach((row) {
final filter = CollectionFilter.fromJson(row);
if (filter == null || filter is! DynamicAlbumFilter) {
debugPrint('failed to import dynamic album for row=$row');
return;
}
add(filter);
});
}
}
@immutable
class DynamicAlbumRow extends Equatable {
final String name;
final CollectionFilter filter;
@override
List<Object?> get props => [name, filter];
const DynamicAlbumRow({
required this.name,
required this.filter,
});
static DynamicAlbumRow? fromMap(Map map) {
final filter = CollectionFilter.fromJson(map['filter']);
if (filter == null) return null;
return DynamicAlbumRow(
name: map['name'] as String,
filter: filter,
);
}
Map<String, dynamic> toMap() => {
'name': name,
'filter': filter.toJson(),
};
}