From 0f87ca436ada230dc3bb408670172e4ac0cf4162 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 31 Dec 2020 09:54:22 +0900 Subject: [PATCH] info: metadata search fixes --- lib/widgets/fullscreen/info/info_search.dart | 21 ++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/widgets/fullscreen/info/info_search.dart b/lib/widgets/fullscreen/info/info_search.dart index 6533af12d..b0496780a 100644 --- a/lib/widgets/fullscreen/info/info_search.dart +++ b/lib/widgets/fullscreen/info/info_search.dart @@ -3,6 +3,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/empty.dart'; import 'package:aves/widgets/fullscreen/info/metadata/metadata_dir_tile.dart'; import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; class InfoSearchDelegate extends SearchDelegate { @@ -12,11 +13,11 @@ class InfoSearchDelegate extends SearchDelegate { Map get metadata => metadataNotifier.value; static const suggestions = { - 'Date & time': 'date or time or when', - 'Description': 'abtract or description or comment', - 'Dimensions': 'width or height or dimension or framesize', + 'Date & time': 'date or time or when -timer -uptime -exposure', + 'Description': 'abstract or description or comment', + 'Dimensions': 'width or height or dimension or framesize or imagelength', 'Resolution': 'resolution', - 'Rights': 'rights or copyright or artist or creator or by-line or credit', + 'Rights': 'rights or copyright or artist or creator or by-line or credit -tool', }; InfoSearchDelegate({ @@ -78,8 +79,16 @@ class InfoSearchDelegate extends SearchDelegate { return SizedBox(); } - final effectiveQueries = query.toUpperCase().split(' OR ').map((query) => query.trim()); - bool testKey(String key) => effectiveQueries.any(key.toUpperCase().contains); + final queryParts = query.toUpperCase().split(' ')..removeWhere((s) => s.isEmpty); + final queryExcludeIncludeGroups = groupBy(queryParts, (s) => s.startsWith('-')); + final queryExcludeAll = (queryExcludeIncludeGroups[true] ?? []).map((s) => s.substring(1)); + final queryIncludeAny = (queryExcludeIncludeGroups[false] ?? []).join(' ').split(' OR '); + + bool testKey(String key) { + key = key.toUpperCase(); + return queryIncludeAny.any(key.contains) && queryExcludeAll.every((q) => !key.contains(q)); + } + final filteredMetadata = Map.fromEntries(metadata.entries.map((kv) { final filteredDir = kv.value.filterKeys(testKey); return MapEntry(kv.key, filteredDir);