Files chooser: Add search

This commit is contained in:
Elias Projahn 2020-05-04 23:05:23 +02:00
parent d53b3bfce9
commit ef40b4cd06

View file

@ -37,11 +37,26 @@ class FilesSelector extends StatefulWidget {
} }
class _FilesSelectorState extends State<FilesSelector> { class _FilesSelectorState extends State<FilesSelector> {
final _searchController = TextEditingController();
MusicusBackendState backend; MusicusBackendState backend;
List<Document> history = []; List<Document> history = [];
List<Document> children = []; List<Document> children = [];
Set<Document> selection = {}; Set<Document> selection = {};
String _search = '';
@override
void initState() {
super.initState();
_searchController.addListener(() {
setState(() {
_search = _searchController.text;
});
});
}
@override @override
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
@ -52,6 +67,11 @@ class _FilesSelectorState extends State<FilesSelector> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final title = history.isNotEmpty ? history.last.name : 'base path';
final filteredChildren = children
.where((d) => d.name.toLowerCase().contains(_search.toLowerCase()))
.toList();
return WillPopScope( return WillPopScope(
child: Scaffold( child: Scaffold(
appBar: AppBar( appBar: AppBar(
@ -88,21 +108,26 @@ class _FilesSelectorState extends State<FilesSelector> {
icon: const Icon(Icons.arrow_upward), icon: const Icon(Icons.arrow_upward),
onPressed: history.isNotEmpty ? up : null, onPressed: history.isNotEmpty ? up : null,
), ),
title: Text( title: TextField(
history.isNotEmpty ? history.last.name : 'Music library'), autofocus: true,
controller: _searchController,
decoration: InputDecoration.collapsed(
hintText: 'Search in $title...'),
),
), ),
), ),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: children.length, itemCount: filteredChildren.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final document = children[index]; final document = filteredChildren[index];
if (document.isDirectory) { if (document.isDirectory) {
return ListTile( return ListTile(
leading: const Icon(Icons.folder), leading: const Icon(Icons.folder),
title: Text(document.name), title: Text(document.name),
onTap: () { onTap: () {
_searchController.text = '';
setState(() { setState(() {
history.add(document); history.add(document);
}); });
@ -110,21 +135,28 @@ class _FilesSelectorState extends State<FilesSelector> {
}, },
); );
} else { } else {
return CheckboxListTile( if (widget.chooseDirectory) {
controlAffinity: ListTileControlAffinity.trailing, return ListTile(
secondary: const Icon(Icons.insert_drive_file), leading: const Icon(Icons.insert_drive_file),
title: Text(document.name), title: Text(document.name),
value: selection.contains(document), );
onChanged: (selected) { } else {
setState(() { return CheckboxListTile(
if (selected) { controlAffinity: ListTileControlAffinity.trailing,
selection.add(document); secondary: const Icon(Icons.insert_drive_file),
} else { title: Text(document.name),
selection.remove(document); value: selection.contains(document),
} onChanged: (selected) {
}); setState(() {
}, if (selected) {
); selection.add(document);
} else {
selection.remove(document);
}
});
},
);
}
} }
}, },
), ),