perf: improved filtering
This commit is contained in:
parent
e02593def3
commit
3980e42234
8 changed files with 35 additions and 17 deletions
|
@ -376,7 +376,12 @@ class AvesEntry {
|
||||||
return 'geo:$latitude,$longitude?q=$latitude,$longitude';
|
return 'geo:$latitude,$longitude?q=$latitude,$longitude';
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> get xmpSubjects => _catalogMetadata?.xmpSubjects?.split(';')?.where((tag) => tag.isNotEmpty)?.toList() ?? [];
|
List<String> _xmpSubjects;
|
||||||
|
|
||||||
|
List<String> get xmpSubjects {
|
||||||
|
_xmpSubjects ??= _catalogMetadata?.xmpSubjects?.split(';')?.where((tag) => tag.isNotEmpty)?.toList() ?? [];
|
||||||
|
return _xmpSubjects;
|
||||||
|
}
|
||||||
|
|
||||||
String _bestTitle;
|
String _bestTitle;
|
||||||
|
|
||||||
|
@ -400,6 +405,7 @@ class AvesEntry {
|
||||||
catalogDateMillis = newMetadata?.dateMillis;
|
catalogDateMillis = newMetadata?.dateMillis;
|
||||||
_catalogMetadata = newMetadata;
|
_catalogMetadata = newMetadata;
|
||||||
_bestTitle = null;
|
_bestTitle = null;
|
||||||
|
_xmpSubjects = null;
|
||||||
metadataChangeNotifier.notifyListeners();
|
metadataChangeNotifier.notifyListeners();
|
||||||
|
|
||||||
_onImageChanged(oldDateModifiedSecs, oldRotationDegrees, oldIsFlipped);
|
_onImageChanged(oldDateModifiedSecs, oldRotationDegrees, oldIsFlipped);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:aves/image_providers/app_icon_image_provider.dart';
|
import 'package:aves/image_providers/app_icon_image_provider.dart';
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:aves/utils/android_file_utils.dart';
|
import 'package:aves/utils/android_file_utils.dart';
|
||||||
|
@ -33,7 +32,7 @@ class AlbumFilter extends CollectionFilter {
|
||||||
};
|
};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => entry.directory == album;
|
EntryFilter get filter => (entry) => entry.directory == album;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get label => uniqueName ?? album.split(separator).last;
|
String get label => uniqueName ?? album.split(separator).last;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -13,7 +12,7 @@ class FavouriteFilter extends CollectionFilter {
|
||||||
};
|
};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => entry.isFavourite;
|
EntryFilter get filter => (entry) => entry.isFavourite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get label => 'Favourite';
|
String get label => 'Favourite';
|
||||||
|
|
|
@ -49,7 +49,7 @@ abstract class CollectionFilter implements Comparable<CollectionFilter> {
|
||||||
|
|
||||||
String toJson() => jsonEncode(toMap());
|
String toJson() => jsonEncode(toMap());
|
||||||
|
|
||||||
bool filter(AvesEntry entry);
|
EntryFilter get filter;
|
||||||
|
|
||||||
bool get isUnique => true;
|
bool get isUnique => true;
|
||||||
|
|
||||||
|
@ -91,3 +91,5 @@ class FilterGridItem<T extends CollectionFilter> {
|
||||||
@override
|
@override
|
||||||
int get hashCode => hashValues(filter, entry);
|
int get hashCode => hashValues(filter, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef EntryFilter = bool Function(AvesEntry);
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -12,11 +11,20 @@ class LocationFilter extends CollectionFilter {
|
||||||
final LocationLevel level;
|
final LocationLevel level;
|
||||||
String _location;
|
String _location;
|
||||||
String _countryCode;
|
String _countryCode;
|
||||||
|
EntryFilter _filter;
|
||||||
|
|
||||||
LocationFilter(this.level, this._location) {
|
LocationFilter(this.level, this._location) {
|
||||||
final split = _location.split(locationSeparator);
|
final split = _location.split(locationSeparator);
|
||||||
if (split.isNotEmpty) _location = split[0];
|
if (split.isNotEmpty) _location = split[0];
|
||||||
if (split.length > 1) _countryCode = split[1];
|
if (split.length > 1) _countryCode = split[1];
|
||||||
|
|
||||||
|
if (_location.isEmpty) {
|
||||||
|
_filter = (entry) => !entry.isLocated;
|
||||||
|
} else if (level == LocationLevel.country) {
|
||||||
|
_filter = (entry) => entry.addressDetails?.countryCode == _countryCode;
|
||||||
|
} else if (level == LocationLevel.place) {
|
||||||
|
_filter = (entry) => entry.addressDetails?.place == _location;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LocationFilter.fromMap(Map<String, dynamic> json)
|
LocationFilter.fromMap(Map<String, dynamic> json)
|
||||||
|
@ -35,7 +43,7 @@ class LocationFilter extends CollectionFilter {
|
||||||
String get countryNameAndCode => '$_location$locationSeparator$_countryCode';
|
String get countryNameAndCode => '$_location$locationSeparator$_countryCode';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location));
|
EntryFilter get filter => _filter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get label => _location.isEmpty ? emptyLabel : _location;
|
String get label => _location.isEmpty ? emptyLabel : _location;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:aves/utils/mime_utils.dart';
|
import 'package:aves/utils/mime_utils.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -15,7 +14,7 @@ class MimeFilter extends CollectionFilter {
|
||||||
static const geotiff = 'aves/geotiff'; // subset of `image/tiff`
|
static const geotiff = 'aves/geotiff'; // subset of `image/tiff`
|
||||||
|
|
||||||
final String mime;
|
final String mime;
|
||||||
bool Function(AvesEntry) _filter;
|
EntryFilter _filter;
|
||||||
String _label;
|
String _label;
|
||||||
IconData _icon;
|
IconData _icon;
|
||||||
|
|
||||||
|
@ -67,7 +66,7 @@ class MimeFilter extends CollectionFilter {
|
||||||
};
|
};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => _filter(entry);
|
EntryFilter get filter => _filter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get label => _label;
|
String get label => _label;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -12,7 +11,7 @@ class QueryFilter extends CollectionFilter {
|
||||||
|
|
||||||
final String query;
|
final String query;
|
||||||
final bool colorful;
|
final bool colorful;
|
||||||
bool Function(AvesEntry) _filter;
|
EntryFilter _filter;
|
||||||
|
|
||||||
QueryFilter(this.query, {this.colorful = true}) {
|
QueryFilter(this.query, {this.colorful = true}) {
|
||||||
var upQuery = query.toUpperCase();
|
var upQuery = query.toUpperCase();
|
||||||
|
@ -44,7 +43,7 @@ class QueryFilter extends CollectionFilter {
|
||||||
};
|
};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => _filter(entry);
|
EntryFilter get filter => _filter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isUnique => false;
|
bool get isUnique => false;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:aves/model/entry.dart';
|
|
||||||
import 'package:aves/model/filters/filters.dart';
|
import 'package:aves/model/filters/filters.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -9,8 +8,15 @@ class TagFilter extends CollectionFilter {
|
||||||
static const emptyLabel = 'untagged';
|
static const emptyLabel = 'untagged';
|
||||||
|
|
||||||
final String tag;
|
final String tag;
|
||||||
|
EntryFilter _filter;
|
||||||
|
|
||||||
const TagFilter(this.tag);
|
TagFilter(this.tag) {
|
||||||
|
if (tag.isEmpty) {
|
||||||
|
_filter = (entry) => entry.xmpSubjects.isEmpty;
|
||||||
|
} else {
|
||||||
|
_filter = (entry) => entry.xmpSubjects.contains(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TagFilter.fromMap(Map<String, dynamic> json)
|
TagFilter.fromMap(Map<String, dynamic> json)
|
||||||
: this(
|
: this(
|
||||||
|
@ -24,7 +30,7 @@ class TagFilter extends CollectionFilter {
|
||||||
};
|
};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool filter(AvesEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag);
|
EntryFilter get filter => _filter;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isUnique => false;
|
bool get isUnique => false;
|
||||||
|
|
Loading…
Reference in a new issue