diff --git a/CHANGELOG.md b/CHANGELOG.md
index 43245ecb2..bfb2320f5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+### Added
+
+- Albums / Countries / Tags: show selection in Collection
+
### Changed
- Screen saver: black background, consistent with slideshow
diff --git a/lib/app_mode.dart b/lib/app_mode.dart
index 950458bc2..34b16f9b5 100644
--- a/lib/app_mode.dart
+++ b/lib/app_mode.dart
@@ -32,7 +32,10 @@ extension ExtraAppMode on AppMode {
AppMode.pickMultipleMediaExternal,
}.contains(this);
- bool get canSelectFilter => this == AppMode.main;
+ bool get canSelectFilter => {
+ AppMode.main,
+ AppMode.pickCollectionFiltersExternal,
+ }.contains(this);
bool get canCreateFilter => {
AppMode.main,
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index e34912ec1..4ceb286db 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -85,6 +85,7 @@
"sourceStateLocatingPlaces": "Locating places",
"chipActionDelete": "Delete",
+ "chipActionShowCollection": "Show in Collection",
"chipActionGoToAlbumPage": "Show in Albums",
"chipActionGoToCountryPage": "Show in Countries",
"chipActionGoToPlacePage": "Show in Places",
diff --git a/lib/model/filters/aspect_ratio.dart b/lib/model/filters/aspect_ratio.dart
index f21f48280..b638ef7e4 100644
--- a/lib/model/filters/aspect_ratio.dart
+++ b/lib/model/filters/aspect_ratio.dart
@@ -68,9 +68,7 @@ class AspectRatioFilter extends CollectionFilter {
}
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) {
- return Icon(AIcons.aspectRatio, size: size);
- }
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.aspectRatio, size: size);
@override
String get category => type;
diff --git a/lib/model/filters/coordinate.dart b/lib/model/filters/coordinate.dart
index 57b7b4ebe..fff9df429 100644
--- a/lib/model/filters/coordinate.dart
+++ b/lib/model/filters/coordinate.dart
@@ -69,7 +69,7 @@ class CoordinateFilter extends CollectionFilter {
}
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.geoBounds, size: size);
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.geoBounds, size: size);
@override
String get category => type;
diff --git a/lib/model/filters/date.dart b/lib/model/filters/date.dart
index 3e5f1560f..2756de2e0 100644
--- a/lib/model/filters/date.dart
+++ b/lib/model/filters/date.dart
@@ -122,9 +122,7 @@ class DateFilter extends CollectionFilter {
}
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) {
- return Icon(AIcons.date, size: size);
- }
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.date, size: size);
@override
String get category => type;
diff --git a/lib/model/filters/favourite.dart b/lib/model/filters/favourite.dart
index 3b5ff0333..2bd813b89 100644
--- a/lib/model/filters/favourite.dart
+++ b/lib/model/filters/favourite.dart
@@ -45,7 +45,7 @@ class FavouriteFilter extends CollectionFilter {
String getLabel(BuildContext context) => context.l10n.filterFavouriteLabel;
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.favourite, size: size);
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.favourite, size: size);
@override
Future color(BuildContext context) {
diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart
index b6e08e2b9..f22270c88 100644
--- a/lib/model/filters/filters.dart
+++ b/lib/model/filters/filters.dart
@@ -10,6 +10,7 @@ import 'package:aves/model/filters/favourite.dart';
import 'package:aves/model/filters/location.dart';
import 'package:aves/model/filters/mime.dart';
import 'package:aves/model/filters/missing.dart';
+import 'package:aves/model/filters/or.dart';
import 'package:aves/model/filters/path.dart';
import 'package:aves/model/filters/placeholder.dart';
import 'package:aves/model/filters/query.dart';
@@ -43,6 +44,7 @@ abstract class CollectionFilter extends Equatable implements Comparable _isUnlocated ? context.l10n.filterNoLocationLabel : _location;
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) {
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) {
if (_isUnlocated) {
return Icon(AIcons.locationUnlocated, size: size);
}
diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart
index 341780c53..86d4840d2 100644
--- a/lib/model/filters/mime.dart
+++ b/lib/model/filters/mime.dart
@@ -77,7 +77,7 @@ class MimeFilter extends CollectionFilter {
}
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size);
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size);
@override
Future color(BuildContext context) {
diff --git a/lib/model/filters/missing.dart b/lib/model/filters/missing.dart
index 9d83f82c3..d785bc3c2 100644
--- a/lib/model/filters/missing.dart
+++ b/lib/model/filters/missing.dart
@@ -70,7 +70,7 @@ class MissingFilter extends CollectionFilter {
}
@override
- Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size);
+ Widget? iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size);
@override
String get category => type;
diff --git a/lib/model/filters/or.dart b/lib/model/filters/or.dart
new file mode 100644
index 000000000..89e62751f
--- /dev/null
+++ b/lib/model/filters/or.dart
@@ -0,0 +1,72 @@
+import 'package:aves/model/filters/album.dart';
+import 'package:aves/model/filters/filters.dart';
+import 'package:aves/model/filters/location.dart';
+import 'package:aves/theme/icons.dart';
+import 'package:collection/collection.dart';
+import 'package:flutter/widgets.dart';
+
+class OrFilter extends CollectionFilter {
+ static const type = 'or';
+
+ late final List _filters;
+
+ late final EntryFilter _test;
+ late final IconData? _genericIcon;
+
+ @override
+ List