FilesSelector: Allow setting a base path

This commit is contained in:
Elias Projahn 2020-03-28 12:27:30 +01:00
parent cbbc5bc7c6
commit 88c9f65649

View file

@ -11,9 +11,11 @@ enum FilesSelectorMode {
class FilesSelector extends StatefulWidget { class FilesSelector extends StatefulWidget {
final FilesSelectorMode mode; final FilesSelectorMode mode;
final String baseDirectory;
FilesSelector({ FilesSelector({
this.mode = FilesSelectorMode.files, this.mode = FilesSelectorMode.files,
this.baseDirectory,
}); });
@override @override
@ -23,7 +25,8 @@ class FilesSelector extends StatefulWidget {
class _FilesSelectorState extends State<FilesSelector> { class _FilesSelectorState extends State<FilesSelector> {
static const platform = MethodChannel('de.johrpan.musicus/platform'); static const platform = MethodChannel('de.johrpan.musicus/platform');
List<Directory> storageRoots = []; Directory baseDirectory;
List<Directory> storageRoots;
List<Directory> directories = []; List<Directory> directories = [];
List<FileSystemEntity> contents = []; List<FileSystemEntity> contents = [];
Set<String> selectedPaths = {}; Set<String> selectedPaths = {};
@ -32,58 +35,66 @@ class _FilesSelectorState extends State<FilesSelector> {
void initState() { void initState() {
super.initState(); super.initState();
platform.invokeListMethod<String>('getStorageRoots').then((sr) { if (widget.baseDirectory == null) {
setState(() { platform.invokeListMethod<String>('getStorageRoots').then((sr) {
storageRoots = sr.map((path) => Directory(path)).toList(); setState(() {
storageRoots = sr.map((path) => Directory(path)).toList();
});
}); });
}); } else {
baseDirectory = Directory(widget.baseDirectory);
openDirectory(baseDirectory);
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String titleText;
Widget body; Widget body;
if (directories.isEmpty) { if (directories.isEmpty && storageRoots != null) {
if (storageRoots != null) { titleText = 'Storage devices';
body = ListView( body = ListView(
children: storageRoots children: storageRoots
.map((dir) => ListTile( .map((dir) => ListTile(
leading: const Icon(Icons.storage), leading: const Icon(Icons.storage),
title: Text(dir.path), title: Text(dir.path),
onTap: () { onTap: () {
setState(() { setState(() {
directories.add(dir); directories.add(dir);
}); });
openDirectory(dir); openDirectory(dir);
}, },
)) ))
.toList(), .toList(),
); );
} else if (contents != null) {
if (directories.isEmpty) {
titleText = 'Base directory';
} else { } else {
body = Container(); titleText = path.basename(directories.last.path);
} }
} else {
if (contents != null) {
body = ListView(
children: contents.map((fse) {
Widget result;
if (fse is Directory) { body = ListView(
result = ListTile( children: contents.map((fse) {
leading: const Icon(Icons.folder), Widget result;
title: Text(path.basename(fse.path)),
onTap: () {
setState(() {
directories.add(fse);
});
openDirectory(fse); if (fse is Directory) {
}, result = ListTile(
); leading: const Icon(Icons.folder),
} else if (fse is File) { title: Text(path.basename(fse.path)),
if (widget.mode == FilesSelectorMode.files) { onTap: () {
result = CheckboxListTile( setState(() {
directories.add(fse);
});
openDirectory(fse);
},
);
} else if (fse is File) {
if (widget.mode == FilesSelectorMode.files) {
result = CheckboxListTile(
value: selectedPaths.contains(fse.path), value: selectedPaths.contains(fse.path),
secondary: Icon(Icons.insert_drive_file), secondary: Icon(Icons.insert_drive_file),
title: Text(path.basename(fse.path)), title: Text(path.basename(fse.path)),
@ -97,20 +108,19 @@ class _FilesSelectorState extends State<FilesSelector> {
}); });
}, },
); );
} else { } else {
result = ListTile( result = ListTile(
leading: const Icon(Icons.insert_drive_file), leading: const Icon(Icons.insert_drive_file),
title: Text(path.basename(fse.path)), title: Text(path.basename(fse.path)),
); );
}
} }
}
return result; return result;
}).toList(), }).toList(),
); );
} else { } else {
body = Container(); body = Container();
}
} }
return WillPopScope( return WillPopScope(
@ -142,9 +152,7 @@ class _FilesSelectorState extends State<FilesSelector> {
onPressed: up, onPressed: up,
) )
: null, : null,
title: Text(directories.isEmpty title: Text(titleText),
? 'Storage devices'
: directories.last.path),
), ),
), ),
Expanded( Expanded(
@ -200,6 +208,8 @@ class _FilesSelectorState extends State<FilesSelector> {
if (directories.isNotEmpty) { if (directories.isNotEmpty) {
openDirectory(directories.last); openDirectory(directories.last);
} else if (baseDirectory != null) {
openDirectory(baseDirectory);
} }
} }
} }