diff options
Diffstat (limited to 'lib/screens/level_selection.dart')
-rw-r--r-- | lib/screens/level_selection.dart | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/lib/screens/level_selection.dart b/lib/screens/level_selection.dart new file mode 100644 index 0000000..1b5d0d1 --- /dev/null +++ b/lib/screens/level_selection.dart @@ -0,0 +1,157 @@ +import 'dart:io'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sense_the_rhythm/utils/esense_input.dart'; +import 'package:sense_the_rhythm/utils/simfile.dart'; +import 'package:sense_the_rhythm/widgets/esense_connect_dialog.dart'; +import 'package:sense_the_rhythm/screens/level.dart'; + +class LevelSelection extends StatefulWidget { + const LevelSelection({super.key}); + + @override + State<LevelSelection> createState() => _LevelSelectionState(); +} + +class _LevelSelectionState extends State<LevelSelection> { + String? stepmaniaCoursesPath; + List<Simfile> stepmaniaCoursesFolders = []; + List<Simfile> stepmaniaCoursesFoldersFiltered = []; + String searchString = ''; + + @override + void initState() { + super.initState(); + loadFolderPath(); + } + + Future<void> loadFolderPath() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final String? stepmaniaCoursesPathSetting = + prefs.getString('stepmania_courses'); + + if (stepmaniaCoursesPathSetting == null) return; + List<Simfile> stepmaniaCoursesFoldersFuture = + await listFilesAndFolders(stepmaniaCoursesPathSetting); + + setState(() { + stepmaniaCoursesPath = stepmaniaCoursesPathSetting; + stepmaniaCoursesFolders = stepmaniaCoursesFoldersFuture; + stepmaniaCoursesFoldersFiltered = stepmaniaCoursesFoldersFuture; + }); + } + + Future<void> selectFolder() async { + await Permission.manageExternalStorage.request(); + String? selectedFolder = await FilePicker.platform.getDirectoryPath(); + + if (selectedFolder != null) { + // Save the selected folder path + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.setString('stepmania_courses', selectedFolder); + + loadFolderPath(); + } + } + + Future<List<Simfile>> listFilesAndFolders(String directoryPath) async { + final directory = Directory(directoryPath); + try { + // List all files and folders in the directory + List<Simfile> simfiles = directory + .listSync() + .where((entity) => FileSystemEntity.isDirectorySync(entity.path)) + .map((entity) { + Simfile simfile = Simfile(entity.path); + simfile.load(); + return simfile; + }).toList(); + simfiles.sort((a, b) => a.tags['TITLE']!.compareTo(b.tags['TITLE']!)); + + return simfiles; + } catch (e) { + print("Error reading directory: $e"); + return []; + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Sense the Rhythm'), + actions: [ + IconButton( + onPressed: () => showDialog( + context: context, + builder: (BuildContext context) { + return ESenseConnectDialog( + deviceStatus: ESenseInput.instance.deviceStatus, + connect: (String name) { + ESenseInput.instance.connectToESense(name); + }); + }, + ), + icon: const Icon(Icons.bluetooth)) + ], + ), + body: Builder(builder: (context) { + if (stepmaniaCoursesPath == null) { + return Text('Add a Directory with Stepmania Songs on \'+\''); + } else if (stepmaniaCoursesFolders.isEmpty) { + return Text( + 'Folder empty. Add Stepmania Songs to Folder or select a different folder on \'+\''); + } else { + return Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 0.0), + child: TextField( + onChanged: (input) { + setState(() { + stepmaniaCoursesFoldersFiltered = stepmaniaCoursesFolders + .where((simfile) => simfile.tags["TITLE"]! + .toLowerCase() + .contains(input.toLowerCase())) + .toList(); + }); + }, + decoration: InputDecoration( + // icon: Icon(Icons.search), + hintText: 'Search'), + ), + ), + Expanded( + child: ListView.separated( + itemCount: stepmaniaCoursesFoldersFiltered.length, + separatorBuilder: (BuildContext context, int index) => + const Divider(), + itemBuilder: (context, index) { + Simfile simfile = stepmaniaCoursesFoldersFiltered[index]; + return ListTile( + leading: Image.file(File(simfile.bannerPath!)), + trailing: Icon(Icons.play_arrow), + title: Text(simfile.tags["TITLE"]!), + subtitle: Text('3:45'), + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + Level(simfile))), + ); + }, + ), + ), + ], + ); + } + }), + floatingActionButton: FloatingActionButton( + onPressed: () => {selectFolder()}, child: Icon(Icons.add)), + ); + } +} |