fixed query filter

This commit is contained in:
Thibault Deckers 2020-03-30 15:37:34 +09:00
parent 54ba3c977f
commit 94b8ddc854
4 changed files with 59 additions and 42 deletions

View file

@ -6,12 +6,12 @@ import 'package:outline_material_icons/outline_material_icons.dart';
class QueryFilter extends CollectionFilter { class QueryFilter extends CollectionFilter {
static const type = 'query'; static const type = 'query';
final String query; final String query, upQuery;
const QueryFilter(this.query); QueryFilter(this.query) : upQuery = query.toUpperCase();
@override @override
bool filter(ImageEntry entry) => entry.search(query); bool filter(ImageEntry entry) => entry.search(upQuery);
@override @override
bool get isUnique => false; bool get isUnique => false;
@ -32,5 +32,5 @@ class QueryFilter extends CollectionFilter {
} }
@override @override
int get hashCode => hashValues('MetadataFilter', query); int get hashCode => hashValues('QueryFilter', query);
} }

View file

@ -205,9 +205,9 @@ class ImageEntry {
} }
bool search(String query) { bool search(String query) {
if (title.toLowerCase().contains(query)) return true; if (title?.toUpperCase()?.contains(query) ?? false) return true;
if (catalogMetadata?.xmpSubjects?.toLowerCase()?.contains(query) ?? false) return true; if (catalogMetadata?.xmpSubjects?.toUpperCase()?.contains(query) ?? false) return true;
if (isLocated && addressDetails.addressLine.toLowerCase().contains(query)) return true; if (addressDetails?.addressLine?.toUpperCase()?.contains(query) ?? false) return true;
return false; return false;
} }

View file

@ -1,6 +1,5 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/utils/constants.dart'; import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/album/search/search_delegate.dart';
import 'package:aves/widgets/common/aves_filter_chip.dart'; import 'package:aves/widgets/common/aves_filter_chip.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:outline_material_icons/outline_material_icons.dart'; import 'package:outline_material_icons/outline_material_icons.dart';
@ -47,45 +46,62 @@ class ExpandableFilterRow extends StatelessWidget {
} }
final filtersList = filters.toList(); final filtersList = filters.toList();
final filterChips = isExpanded final wrap = Container(
? Padding( key: ValueKey('wrap$title'),
padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.buttonBorderWidth / 2 + 6), padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.buttonBorderWidth / 2 + 6),
child: Wrap( // specify transparent as a workaround to prevent
spacing: 8, // chip border clipping when the floating app bar is fading
children: filtersList color: Colors.transparent,
.map((filter) => AvesFilterChip( child: Wrap(
filter: filter, spacing: 8,
onPressed: onPressed, children: filtersList
)) .map((filter) => AvesFilterChip(
.toList(), filter: filter,
), onPressed: onPressed,
) ))
: Container( .toList(),
height: kMinInteractiveDimension, ),
child: ListView.separated( );
scrollDirection: Axis.horizontal, final list = Container(
physics: const BouncingScrollPhysics(), key: ValueKey('list$title'),
padding: const EdgeInsets.all(AvesFilterChip.buttonBorderWidth / 2) + const EdgeInsets.symmetric(horizontal: 6), // specify transparent as a workaround to prevent
itemBuilder: (context, index) { // chip border clipping when the floating app bar is fading
if (index >= filtersList.length) return null; color: Colors.transparent,
final filter = filtersList[index]; height: kMinInteractiveDimension,
return Center( child: ListView.separated(
child: AvesFilterChip( scrollDirection: Axis.horizontal,
filter: filter, physics: const BouncingScrollPhysics(),
onPressed: onPressed, padding: const EdgeInsets.all(AvesFilterChip.buttonBorderWidth / 2) + const EdgeInsets.symmetric(horizontal: 6),
), itemBuilder: (context, index) {
); if (index >= filtersList.length) return null;
}, final filter = filtersList[index];
separatorBuilder: (context, index) => const SizedBox(width: 8), return Center(
itemCount: filtersList.length, child: AvesFilterChip(
filter: filter,
onPressed: onPressed,
), ),
); );
},
separatorBuilder: (context, index) => const SizedBox(width: 8),
itemCount: filtersList.length,
),
);
final filterChips = isExpanded ? wrap : list;
return titleRow != null return titleRow != null
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
titleRow, titleRow,
filterChips, AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: filterChips,
layoutBuilder: (currentChild, previousChildren) => Stack(
children: [
...previousChildren,
if (currentChild != null) currentChild,
],
),
),
], ],
) )
: filterChips; : filterChips;

View file

@ -53,7 +53,7 @@ class ImageSearchDelegate extends SearchDelegate<CollectionFilter> {
@override @override
Widget buildSuggestions(BuildContext context) { Widget buildSuggestions(BuildContext context) {
final source = collection.source; final source = collection.source;
final upQuery = query.toUpperCase(); final upQuery = query.trim().toUpperCase();
final containQuery = (String s) => s.toUpperCase().contains(upQuery); final containQuery = (String s) => s.toUpperCase().contains(upQuery);
return SafeArea( return SafeArea(
child: ValueListenableBuilder<String>( child: ValueListenableBuilder<String>(
@ -98,7 +98,8 @@ class ImageSearchDelegate extends SearchDelegate<CollectionFilter> {
@override @override
Widget buildResults(BuildContext context) { Widget buildResults(BuildContext context) {
close(context, QueryFilter(query)); final cleanQuery = query.trim();
close(context, cleanQuery.isNotEmpty ? QueryFilter(cleanQuery) : null);
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
} }