summaryrefslogtreecommitdiff
path: root/lib/screens/level_selection.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/screens/level_selection.dart')
-rw-r--r--lib/screens/level_selection.dart157
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)),
+ );
+ }
+}