style: refactored searching files into Simfile class
This commit is contained in:
		
							parent
							
								
									685323adea
								
							
						
					
					
						commit
						9c229b94d0
					
				| 
						 | 
					@ -50,8 +50,8 @@ class GameOverStats extends StatelessWidget {
 | 
				
			||||||
            ]),
 | 
					            ]),
 | 
				
			||||||
            TextButton(
 | 
					            TextButton(
 | 
				
			||||||
                onPressed: () {
 | 
					                onPressed: () {
 | 
				
			||||||
                  Route route = MaterialPageRoute(
 | 
					                  Route route =
 | 
				
			||||||
                      builder: (context) => Level(stepmaniaFolderPath: simfile.directoryPath));
 | 
					                      MaterialPageRoute(builder: (context) => Level(simfile));
 | 
				
			||||||
                  Navigator.pushReplacement(context, route);
 | 
					                  Navigator.pushReplacement(context, route);
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                child: Text('Retry'))
 | 
					                child: Text('Retry'))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,8 +9,8 @@ import 'package:sense_the_rhythm/game_over_stats.dart';
 | 
				
			||||||
import 'package:sense_the_rhythm/simfile.dart';
 | 
					import 'package:sense_the_rhythm/simfile.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Level extends StatefulWidget {
 | 
					class Level extends StatefulWidget {
 | 
				
			||||||
  const Level({super.key, required this.stepmaniaFolderPath});
 | 
					  const Level(this.simfile, {super.key});
 | 
				
			||||||
  final String stepmaniaFolderPath;
 | 
					  final Simfile simfile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  State<Level> createState() => _LevelState();
 | 
					  State<Level> createState() => _LevelState();
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,6 @@ class InputDirection {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _LevelState extends State<Level> {
 | 
					class _LevelState extends State<Level> {
 | 
				
			||||||
  final player = AudioPlayer();
 | 
					  final player = AudioPlayer();
 | 
				
			||||||
  Simfile? simfile;
 | 
					 | 
				
			||||||
  bool _isPlaying = true;
 | 
					  bool _isPlaying = true;
 | 
				
			||||||
  Duration? _duration;
 | 
					  Duration? _duration;
 | 
				
			||||||
  Duration? _position;
 | 
					  Duration? _position;
 | 
				
			||||||
| 
						 | 
					@ -77,7 +76,7 @@ class _LevelState extends State<Level> {
 | 
				
			||||||
    player.onPlayerComplete.listen((void _) {
 | 
					    player.onPlayerComplete.listen((void _) {
 | 
				
			||||||
      Route route = MaterialPageRoute(
 | 
					      Route route = MaterialPageRoute(
 | 
				
			||||||
          builder: (context) => GameOverStats(
 | 
					          builder: (context) => GameOverStats(
 | 
				
			||||||
                simfile: simfile!,
 | 
					                simfile: widget.simfile,
 | 
				
			||||||
                notes: notes,
 | 
					                notes: notes,
 | 
				
			||||||
              ));
 | 
					              ));
 | 
				
			||||||
      Navigator.pushReplacement(context, route);
 | 
					      Navigator.pushReplacement(context, route);
 | 
				
			||||||
| 
						 | 
					@ -131,10 +130,7 @@ class _LevelState extends State<Level> {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    simfile = Simfile(widget.stepmaniaFolderPath);
 | 
					    widget.simfile.chartSimplest!.beats.forEach((time, noteData) {
 | 
				
			||||||
    simfile!.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    simfile!.chartSimplest!.beats.forEach((time, noteData) {
 | 
					 | 
				
			||||||
      int arrowIndex = noteData.indexOf('1');
 | 
					      int arrowIndex = noteData.indexOf('1');
 | 
				
			||||||
      if (arrowIndex < 0 || arrowIndex > 3) {
 | 
					      if (arrowIndex < 0 || arrowIndex > 3) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
| 
						 | 
					@ -142,7 +138,7 @@ class _LevelState extends State<Level> {
 | 
				
			||||||
      notes.add(Note(time: time, direction: ArrowDirection.values[arrowIndex]));
 | 
					      notes.add(Note(time: time, direction: ArrowDirection.values[arrowIndex]));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    player.play(DeviceFileSource(simfile!.audioPath!));
 | 
					    player.play(DeviceFileSource(widget.simfile.audioPath!));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
| 
						 | 
					@ -192,7 +188,7 @@ class _LevelState extends State<Level> {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              },
 | 
					              },
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            title: Text(widget.stepmaniaFolderPath.split('/').last),
 | 
					            title: Text(widget.simfile.tags['TITLE']!),
 | 
				
			||||||
            actions: [
 | 
					            actions: [
 | 
				
			||||||
              IconButton(
 | 
					              IconButton(
 | 
				
			||||||
                  icon: Icon(Icons.close),
 | 
					                  icon: Icon(Icons.close),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import 'package:file_picker/file_picker.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:permission_handler/permission_handler.dart';
 | 
					import 'package:permission_handler/permission_handler.dart';
 | 
				
			||||||
import 'package:sense_the_rhythm/esense_connect_dialog.dart';
 | 
					import 'package:sense_the_rhythm/esense_connect_dialog.dart';
 | 
				
			||||||
 | 
					import 'package:sense_the_rhythm/simfile.dart';
 | 
				
			||||||
import 'package:shared_preferences/shared_preferences.dart';
 | 
					import 'package:shared_preferences/shared_preferences.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'level.dart';
 | 
					import 'level.dart';
 | 
				
			||||||
| 
						 | 
					@ -18,7 +19,7 @@ class LevelSelection extends StatefulWidget {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _LevelSelectionState extends State<LevelSelection> {
 | 
					class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
  String? stepmaniaCoursesPath;
 | 
					  String? stepmaniaCoursesPath;
 | 
				
			||||||
  List<FileSystemEntity> stepmaniaCoursesFolders = [];
 | 
					  List<Simfile> stepmaniaCoursesFolders = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  String eSenseDeviceName = '';
 | 
					  String eSenseDeviceName = '';
 | 
				
			||||||
  ESenseManager? eSenseManager;
 | 
					  ESenseManager? eSenseManager;
 | 
				
			||||||
| 
						 | 
					@ -109,7 +110,8 @@ class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
        prefs.getString('stepmania_courses');
 | 
					        prefs.getString('stepmania_courses');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (stepmaniaCoursesPathSetting == null) return;
 | 
					    if (stepmaniaCoursesPathSetting == null) return;
 | 
				
			||||||
    List<FileSystemEntity> stepmaniaCoursesFoldersFuture = await listFilesAndFolders(stepmaniaCoursesPathSetting);
 | 
					    List<Simfile> stepmaniaCoursesFoldersFuture =
 | 
				
			||||||
 | 
					        await listFilesAndFolders(stepmaniaCoursesPathSetting);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setState(() {
 | 
					    setState(() {
 | 
				
			||||||
      stepmaniaCoursesPath = stepmaniaCoursesPathSetting;
 | 
					      stepmaniaCoursesPath = stepmaniaCoursesPathSetting;
 | 
				
			||||||
| 
						 | 
					@ -129,15 +131,18 @@ class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<List<FileSystemEntity>> listFilesAndFolders(
 | 
					  Future<List<Simfile>> listFilesAndFolders(String directoryPath) async {
 | 
				
			||||||
      String directoryPath) async {
 | 
					 | 
				
			||||||
    final directory = Directory(directoryPath);
 | 
					    final directory = Directory(directoryPath);
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      // List all files and folders in the directory
 | 
					      // List all files and folders in the directory
 | 
				
			||||||
      return directory
 | 
					      return directory
 | 
				
			||||||
          .listSync()
 | 
					          .listSync()
 | 
				
			||||||
          .where((entity) => FileSystemEntity.isDirectorySync(entity.path))
 | 
					          .where((entity) => FileSystemEntity.isDirectorySync(entity.path))
 | 
				
			||||||
          .toList();
 | 
					          .map((entity) {
 | 
				
			||||||
 | 
					        Simfile simfile = Simfile(entity.path);
 | 
				
			||||||
 | 
					        simfile.load();
 | 
				
			||||||
 | 
					        return simfile;
 | 
				
			||||||
 | 
					      }).toList();
 | 
				
			||||||
    } catch (e) {
 | 
					    } catch (e) {
 | 
				
			||||||
      print("Error reading directory: $e");
 | 
					      print("Error reading directory: $e");
 | 
				
			||||||
      return [];
 | 
					      return [];
 | 
				
			||||||
| 
						 | 
					@ -176,26 +181,17 @@ class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
            separatorBuilder: (BuildContext context, int index) =>
 | 
					            separatorBuilder: (BuildContext context, int index) =>
 | 
				
			||||||
                const Divider(),
 | 
					                const Divider(),
 | 
				
			||||||
            itemBuilder: (context, index) {
 | 
					            itemBuilder: (context, index) {
 | 
				
			||||||
              String thumbnailPath = Directory(
 | 
					 | 
				
			||||||
                      stepmaniaCoursesFolders[index].path)
 | 
					 | 
				
			||||||
                  .listSync()
 | 
					 | 
				
			||||||
                  .firstWhere(
 | 
					 | 
				
			||||||
                      (file) => file.path.toLowerCase().endsWith('banner.png'),
 | 
					 | 
				
			||||||
                      orElse: () => File(''))
 | 
					 | 
				
			||||||
                  .path;
 | 
					 | 
				
			||||||
              return ListTile(
 | 
					              return ListTile(
 | 
				
			||||||
                leading: Image.file(File(thumbnailPath)),
 | 
					                leading: Image.file(
 | 
				
			||||||
 | 
					                    File(stepmaniaCoursesFolders[index].bannerPath!)),
 | 
				
			||||||
                trailing: Icon(Icons.play_arrow),
 | 
					                trailing: Icon(Icons.play_arrow),
 | 
				
			||||||
                title:
 | 
					                title: Text(stepmaniaCoursesFolders[index].tags["TITLE"]!),
 | 
				
			||||||
                    Text(stepmaniaCoursesFolders[index].path.split('/').last),
 | 
					 | 
				
			||||||
                subtitle: Text('3:45'),
 | 
					                subtitle: Text('3:45'),
 | 
				
			||||||
                onTap: () => Navigator.push(
 | 
					                onTap: () => Navigator.push(
 | 
				
			||||||
                    context,
 | 
					                    context,
 | 
				
			||||||
                    MaterialPageRoute(
 | 
					                    MaterialPageRoute(
 | 
				
			||||||
                        builder: (BuildContext context) => Level(
 | 
					                        builder: (BuildContext context) =>
 | 
				
			||||||
                              stepmaniaFolderPath:
 | 
					                            Level(stepmaniaCoursesFolders[index]))),
 | 
				
			||||||
                                  stepmaniaCoursesFolders[index].path,
 | 
					 | 
				
			||||||
                            ))),
 | 
					 | 
				
			||||||
              );
 | 
					              );
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,7 +124,8 @@ class Simfile {
 | 
				
			||||||
    simfilePath = Directory(directoryPath)
 | 
					    simfilePath = Directory(directoryPath)
 | 
				
			||||||
        .listSync()
 | 
					        .listSync()
 | 
				
			||||||
        .firstWhere((entity) => entity.path.endsWith('.sm'),
 | 
					        .firstWhere((entity) => entity.path.endsWith('.sm'),
 | 
				
			||||||
            orElse: () => File('')).path;
 | 
					            orElse: () => File(''))
 | 
				
			||||||
 | 
					        .path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    audioPath = Directory(directoryPath)
 | 
					    audioPath = Directory(directoryPath)
 | 
				
			||||||
        .listSync()
 | 
					        .listSync()
 | 
				
			||||||
| 
						 | 
					@ -132,6 +133,12 @@ class Simfile {
 | 
				
			||||||
            orElse: () => File(''))
 | 
					            orElse: () => File(''))
 | 
				
			||||||
        .path;
 | 
					        .path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bannerPath = Directory(directoryPath)
 | 
				
			||||||
 | 
					        .listSync()
 | 
				
			||||||
 | 
					        .firstWhere((file) => file.path.toLowerCase().endsWith('banner.png'),
 | 
				
			||||||
 | 
					            orElse: () => File(''))
 | 
				
			||||||
 | 
					        .path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lines = File(simfilePath!).readAsStringSync();
 | 
					    lines = File(simfilePath!).readAsStringSync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RegExp commentsRegExp = RegExp(r'//.*$');
 | 
					    RegExp commentsRegExp = RegExp(r'//.*$');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue