mirror of
https://github.com/johrpan/musicus_mobile.git
synced 2025-10-26 18:57:25 +01:00
FilesSelector: Allow setting a base path
This commit is contained in:
parent
cbbc5bc7c6
commit
88c9f65649
1 changed files with 66 additions and 56 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue