search: show query filter chip during typing

This commit is contained in:
Thibault Deckers 2020-05-14 13:17:35 +09:00
parent f65b70b244
commit 9387496fbe
2 changed files with 16 additions and 5 deletions

View file

@ -1,6 +1,8 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/common/icons.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
class QueryFilter extends CollectionFilter { class QueryFilter extends CollectionFilter {
@ -9,9 +11,10 @@ class QueryFilter extends CollectionFilter {
static final exactRegex = RegExp('^"(.*)"\$'); static final exactRegex = RegExp('^"(.*)"\$');
final String query; final String query;
final bool colorful;
bool Function(ImageEntry) _filter; bool Function(ImageEntry) _filter;
QueryFilter(this.query) { QueryFilter(this.query, {this.colorful = true}) {
var upQuery = query.toUpperCase(); var upQuery = query.toUpperCase();
// allow NOT queries starting with `-` // allow NOT queries starting with `-`
@ -41,6 +44,9 @@ class QueryFilter extends CollectionFilter {
@override @override
Widget iconBuilder(context, size) => Icon(AIcons.text, size: size); Widget iconBuilder(context, size) => Icon(AIcons.text, size: size);
@override
Future<Color> color(BuildContext context) => colorful ? super.color(context) : SynchronousFuture(Colors.white);
@override @override
String get typeKey => type; String get typeKey => type;

View file

@ -64,12 +64,13 @@ class ImageSearchDelegate extends SearchDelegate<CollectionFilter> {
_buildFilterRow( _buildFilterRow(
context: context, context: context,
filters: [ filters: [
_buildQueryFilter(false),
FavouriteFilter(), FavouriteFilter(),
MimeFilter(MimeTypes.ANY_IMAGE), MimeFilter(MimeTypes.ANY_IMAGE),
MimeFilter(MimeTypes.ANY_VIDEO), MimeFilter(MimeTypes.ANY_VIDEO),
MimeFilter(MimeFilter.animated), MimeFilter(MimeFilter.animated),
MimeFilter(MimeTypes.SVG), MimeFilter(MimeTypes.SVG),
].where((f) => containQuery(f.label)), ].where((f) => f != null && containQuery(f.label)),
), ),
StreamBuilder( StreamBuilder(
stream: source.eventBus.on<AlbumsChangedEvent>(), stream: source.eventBus.on<AlbumsChangedEvent>(),
@ -118,19 +119,23 @@ class ImageSearchDelegate extends SearchDelegate<CollectionFilter> {
title: title, title: title,
filters: filters, filters: filters,
expandedNotifier: expandedSectionNotifier, expandedNotifier: expandedSectionNotifier,
onPressed: (filter) => close(context, filter), onPressed: (filter) => close(context, filter is QueryFilter ? QueryFilter(filter.query) : filter),
); );
} }
@override @override
Widget buildResults(BuildContext context) { Widget buildResults(BuildContext context) {
final cleanQuery = query.trim();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
// `buildResults` is called in the build phase, // `buildResults` is called in the build phase,
// so we post the call that will filter the collection // so we post the call that will filter the collection
// and possibly trigger a rebuild here // and possibly trigger a rebuild here
close(context, cleanQuery.isNotEmpty ? QueryFilter(cleanQuery) : null); close(context, _buildQueryFilter(true));
}); });
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
QueryFilter _buildQueryFilter(bool colorful) {
final cleanQuery = query.trim();
return cleanQuery.isNotEmpty ? QueryFilter(cleanQuery, colorful: colorful) : null;
}
} }