Make some entities equatable

This commit is contained in:
Ming Ming 2021-04-16 02:44:25 +08:00
parent 49244a3d09
commit b3f410d8b8
4 changed files with 50 additions and 7 deletions

View file

@ -3,6 +3,7 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:idb_sqflite/idb_sqflite.dart'; import 'package:idb_sqflite/idb_sqflite.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@ -59,7 +60,7 @@ abstract class AlbumItem {
static final _log = Logger("entity.album.AlbumItem"); static final _log = Logger("entity.album.AlbumItem");
} }
class AlbumFileItem extends AlbumItem { class AlbumFileItem extends AlbumItem with EquatableMixin {
AlbumFileItem({this.file}); AlbumFileItem({this.file});
factory AlbumFileItem.fromJson(Map<String, dynamic> json) { factory AlbumFileItem.fromJson(Map<String, dynamic> json) {
@ -82,13 +83,18 @@ class AlbumFileItem extends AlbumItem {
}; };
} }
@override
get props => [
file,
];
final File file; final File file;
static const _type = "file"; static const _type = "file";
} }
/// Immutable object that represents an album /// Immutable object that represents an album
class Album { class Album with EquatableMixin {
Album({ Album({
DateTime lastUpdated, DateTime lastUpdated,
@required String name, @required String name,
@ -188,6 +194,14 @@ class Album {
}; };
} }
@override
get props => [
lastUpdated,
name,
items,
albumFile,
];
final DateTime lastUpdated; final DateTime lastUpdated;
final String name; final String name;

View file

@ -1,9 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'package:equatable/equatable.dart';
import 'package:exifdart/exifdart.dart'; import 'package:exifdart/exifdart.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class Exif { class Exif with EquatableMixin {
Exif(this.data); Exif(this.data);
dynamic operator [](String key) => data[key]; dynamic operator [](String key) => data[key];
@ -95,7 +96,12 @@ class Exif {
String get gpsLongitudeRef => data["GPSLongitudeRef"]; String get gpsLongitudeRef => data["GPSLongitudeRef"];
List<Rational> get gpsLongitude => data["GPSLongitude"].cast<Rational>(); List<Rational> get gpsLongitude => data["GPSLongitude"].cast<Rational>();
static final dateTimeFormat = DateFormat("yyyy:MM:dd HH:mm:ss"); @override
get props => [
data,
];
final Map<String, dynamic> data; final Map<String, dynamic> data;
static final dateTimeFormat = DateFormat("yyyy:MM:dd HH:mm:ss");
} }

View file

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:idb_sqflite/idb_sqflite.dart'; import 'package:idb_sqflite/idb_sqflite.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@ -28,7 +29,7 @@ int compareFileDateTimeDescending(File x, File y) {
} }
/// Immutable object that hold metadata of a [File] /// Immutable object that hold metadata of a [File]
class Metadata { class Metadata with EquatableMixin {
Metadata({ Metadata({
DateTime lastUpdated, DateTime lastUpdated,
this.fileEtag, this.fileEtag,
@ -106,6 +107,15 @@ class Metadata {
return product + "}"; return product + "}";
} }
@override
get props => [
lastUpdated,
fileEtag,
imageWidth,
imageHeight,
exif,
];
final DateTime lastUpdated; final DateTime lastUpdated;
/// Etag of the parent file when the metadata is saved /// Etag of the parent file when the metadata is saved
@ -181,7 +191,7 @@ class MetadataUpgraderV2 implements MetadataUpgrader {
static final _log = Logger("entity.file.MetadataUpgraderV2"); static final _log = Logger("entity.file.MetadataUpgraderV2");
} }
class File { class File with EquatableMixin {
File({ File({
@required String path, @required String path,
this.contentLength, this.contentLength,
@ -315,6 +325,19 @@ class File {
} }
} }
@override
get props => [
path,
contentLength,
contentType,
etag,
lastModified,
isCollection,
usedBytes,
hasPreview,
metadata,
];
final String path; final String path;
final int contentLength; final int contentLength;
final String contentType; final String contentType;

View file

@ -258,7 +258,7 @@ class _AlbumViewerState extends State<AlbumViewer>
final selectedFiles = _backingFiles.takeIndex(selectedIndexes).toList(); final selectedFiles = _backingFiles.takeIndex(selectedIndexes).toList();
final newItems = _album.items.where((element) { final newItems = _album.items.where((element) {
if (element is AlbumFileItem) { if (element is AlbumFileItem) {
return !selectedFiles.contains(element.file); return !selectedFiles.any((select) => select.path == element.file.path);
} else { } else {
return true; return true;
} }