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

View file

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