diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart index 83f8b60c0..c82e1573e 100644 --- a/lib/model/filters/location.dart +++ b/lib/model/filters/location.dart @@ -5,6 +5,7 @@ import 'package:flutter/widgets.dart'; class LocationFilter extends CollectionFilter { static const type = 'location'; + static const emptyLabel = 'unlocated'; static const locationSeparator = ';'; final LocationLevel level; @@ -33,10 +34,10 @@ class LocationFilter extends CollectionFilter { String get countryNameAndCode => '$_location$locationSeparator$_countryCode'; @override - bool filter(ImageEntry entry) => entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location)); + bool filter(ImageEntry entry) => _location.isEmpty ? !entry.isLocated : entry.isLocated && ((level == LocationLevel.country && entry.addressDetails.countryCode == _countryCode) || (level == LocationLevel.place && entry.addressDetails.place == _location)); @override - String get label => _location; + String get label => _location.isEmpty ? emptyLabel : _location; @override Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) { diff --git a/lib/model/filters/tag.dart b/lib/model/filters/tag.dart index d75b67da2..7f2f546ae 100644 --- a/lib/model/filters/tag.dart +++ b/lib/model/filters/tag.dart @@ -5,6 +5,7 @@ import 'package:flutter/widgets.dart'; class TagFilter extends CollectionFilter { static const type = 'tag'; + static const emptyLabel = 'untagged'; final String tag; @@ -22,13 +23,13 @@ class TagFilter extends CollectionFilter { }; @override - bool filter(ImageEntry entry) => entry.xmpSubjects.contains(tag); + bool filter(ImageEntry entry) => tag.isEmpty ? entry.xmpSubjects.isEmpty : entry.xmpSubjects.contains(tag); @override bool get isUnique => false; @override - String get label => tag; + String get label => tag.isEmpty ? emptyLabel : tag; @override Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) => showGenericIcon ? Icon(AIcons.tag, size: size) : null; diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 973f89e15..5e67c0bf3 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -9,7 +9,6 @@ import 'package:aves/services/app_shortcut_service.dart'; import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/collection/collection_actions.dart'; import 'package:aves/widgets/collection/filter_bar.dart'; -import 'package:aves/widgets/collection/search/search_delegate.dart'; import 'package:aves/widgets/common/action_delegates/add_shortcut_dialog.dart'; import 'package:aves/widgets/common/action_delegates/selection_action_delegate.dart'; import 'package:aves/widgets/common/app_bar_subtitle.dart'; @@ -19,7 +18,8 @@ import 'package:aves/widgets/common/data_providers/media_store_collection_provid import 'package:aves/widgets/common/entry_actions.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/common/menu_row.dart'; -import 'package:aves/widgets/common/search_button.dart'; +import 'package:aves/widgets/search/search_button.dart'; +import 'package:aves/widgets/search/search_delegate.dart'; import 'package:aves/widgets/stats/stats.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 82bcc9084..3ecf62bf7 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -8,7 +8,6 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/collection/search/search_delegate.dart'; import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; import 'package:aves/widgets/common/aves_filter_chip.dart'; @@ -17,12 +16,13 @@ import 'package:aves/widgets/common/double_back_pop.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/common/menu_row.dart'; import 'package:aves/widgets/common/scroll_thumb.dart'; -import 'package:aves/widgets/common/search_button.dart'; import 'package:aves/widgets/drawer/app_drawer.dart'; import 'package:aves/widgets/filter_grids/common/chip_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; import 'package:aves/widgets/filter_grids/common/chip_set_action_delegate.dart'; import 'package:aves/widgets/filter_grids/common/decorated_filter_chip.dart'; +import 'package:aves/widgets/search/search_button.dart'; +import 'package:aves/widgets/search/search_delegate.dart'; import 'package:collection/collection.dart'; import 'package:draggable_scrollbar/draggable_scrollbar.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 1e6ad8ffc..a75c777d4 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -9,12 +9,12 @@ import 'package:aves/services/image_file_service.dart'; import 'package:aves/services/viewer_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/collection/search/search_delegate.dart'; -import 'package:aves/widgets/collection/search_page.dart'; import 'package:aves/widgets/common/data_providers/media_store_collection_provider.dart'; import 'package:aves/widgets/common/routes.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; +import 'package:aves/widgets/search/search_delegate.dart'; +import 'package:aves/widgets/search/search_page.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/widgets/collection/search/expandable_filter_row.dart b/lib/widgets/search/expandable_filter_row.dart similarity index 100% rename from lib/widgets/collection/search/expandable_filter_row.dart rename to lib/widgets/search/expandable_filter_row.dart diff --git a/lib/widgets/common/search_button.dart b/lib/widgets/search/search_button.dart similarity index 92% rename from lib/widgets/common/search_button.dart rename to lib/widgets/search/search_button.dart index 82628913f..5e6a4b3cf 100644 --- a/lib/widgets/common/search_button.dart +++ b/lib/widgets/search/search_button.dart @@ -1,7 +1,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; -import 'package:aves/widgets/collection/search/search_delegate.dart'; import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/material.dart'; class SearchButton extends StatelessWidget { diff --git a/lib/widgets/collection/search/search_delegate.dart b/lib/widgets/search/search_delegate.dart similarity index 88% rename from lib/widgets/collection/search/search_delegate.dart rename to lib/widgets/search/search_delegate.dart index 832bc0608..55bacb750 100644 --- a/lib/widgets/collection/search/search_delegate.dart +++ b/lib/widgets/search/search_delegate.dart @@ -13,10 +13,10 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/location.dart'; import 'package:aves/model/source/tag.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/collection/search/expandable_filter_row.dart'; -import 'package:aves/widgets/collection/search_page.dart'; import 'package:aves/widgets/common/aves_filter_chip.dart'; import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/widgets/search/expandable_filter_row.dart'; +import 'package:aves/widgets/search/search_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -88,37 +88,49 @@ class ImageSearchDelegate { StreamBuilder( stream: source.eventBus.on(), builder: (context, snapshot) { + final filters = source.sortedAlbums.where(containQuery).map((s) => AlbumFilter(s, source.getUniqueAlbumName(s))).where((f) => containQuery(f.uniqueName)); return _buildFilterRow( context: context, title: 'Albums', - filters: source.sortedAlbums.where(containQuery).map((s) => AlbumFilter(s, source.getUniqueAlbumName(s))).where((f) => containQuery(f.uniqueName)), + filters: filters, ); }), StreamBuilder( stream: source.eventBus.on(), builder: (context, snapshot) { + final filters = source.sortedCountries.where(containQuery).map((s) => LocationFilter(LocationLevel.country, s)); return _buildFilterRow( context: context, title: 'Countries', - filters: source.sortedCountries.where(containQuery).map((s) => LocationFilter(LocationLevel.country, s)), + filters: filters, ); }), StreamBuilder( stream: source.eventBus.on(), builder: (context, snapshot) { + final filters = source.sortedPlaces.where(containQuery).map((s) => LocationFilter(LocationLevel.place, s)); + final noFilter = LocationFilter(LocationLevel.place, ''); return _buildFilterRow( context: context, title: 'Places', - filters: source.sortedPlaces.where(containQuery).map((s) => LocationFilter(LocationLevel.place, s)), + filters: [ + if (containQuery(LocationFilter.emptyLabel)) noFilter, + ...filters, + ], ); }), StreamBuilder( stream: source.eventBus.on(), builder: (context, snapshot) { + final filters = source.sortedTags.where(containQuery).map((s) => TagFilter(s)); + final noFilter = TagFilter(''); return _buildFilterRow( context: context, title: 'Tags', - filters: source.sortedTags.where(containQuery).map((s) => TagFilter(s)), + filters: [ + if (containQuery(TagFilter.emptyLabel)) noFilter, + ...filters, + ], ); }), ], diff --git a/lib/widgets/collection/search_page.dart b/lib/widgets/search/search_page.dart similarity index 98% rename from lib/widgets/collection/search_page.dart rename to lib/widgets/search/search_page.dart index c131ef739..5919ffc7f 100644 --- a/lib/widgets/collection/search_page.dart +++ b/lib/widgets/search/search_page.dart @@ -1,4 +1,4 @@ -import 'package:aves/widgets/collection/search/search_delegate.dart'; +import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart';