search: show query filter chip during typing
This commit is contained in:
parent
f65b70b244
commit
9387496fbe
2 changed files with 16 additions and 5 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue