From deab0ecfaff91a7027d9d31475c0b59dc6611d2f Mon Sep 17 00:00:00 2001 From: Orangerot Date: Tue, 14 Jan 2025 18:09:58 +0100 Subject: [PATCH] fix: reduce visibility of attributes and methods to a minimum --- lib/screens/level.dart | 68 +++++++++++++------------- lib/screens/level_selection.dart | 41 ++++++++-------- lib/utils/esense_input.dart | 60 +++++++++++------------ lib/widgets/esense_connect_dialog.dart | 6 +-- lib/widgets/level_list_entry.dart | 14 +++--- 5 files changed, 92 insertions(+), 97 deletions(-) diff --git a/lib/screens/level.dart b/lib/screens/level.dart index a22c237..000c43c 100644 --- a/lib/screens/level.dart +++ b/lib/screens/level.dart @@ -20,7 +20,7 @@ class Level extends StatefulWidget { } class _LevelState extends State with SingleTickerProviderStateMixin { - final player = AudioPlayer(); + final _player = AudioPlayer(); bool _isPlaying = true; Duration? _duration; Duration? _position; @@ -30,11 +30,11 @@ class _LevelState extends State with SingleTickerProviderStateMixin { StreamSubscription? _buttonSubscription; final FocusNode _focusNode = FocusNode(); - InputDirection inputDirection = InputDirection(); + final InputDirection _inputDirection = InputDirection(); - String hitOrMissMessage = 'Play!'; + String _hitOrMissMessage = 'Play!'; - List notes = []; + final List _notes = []; late AnimationController _animationController; late Animation _animation; @@ -62,12 +62,12 @@ class _LevelState extends State with SingleTickerProviderStateMixin { _animationController.forward(); // Use initial values from player - player.getDuration().then( + _player.getDuration().then( (value) => setState(() { _duration = value; }), ); - player.getCurrentPosition().then( + _player.getCurrentPosition().then( (value) => setState(() { _position = value; }), @@ -75,24 +75,24 @@ class _LevelState extends State with SingleTickerProviderStateMixin { // listen for new values from player _durationSubscription = - player.onDurationChanged.listen((Duration duration) { + _player.onDurationChanged.listen((Duration duration) { setState(() => _duration = duration); }); _positionSubscription = - player.onPositionChanged.listen((Duration position) { + _player.onPositionChanged.listen((Duration position) { setState(() => _position = position); - for (final note in notes) { + for (final note in _notes) { _noteHitCheck(note, position); } }); // go to GameOverStats when level finishes - player.onPlayerComplete.listen((void _) { + _player.onPlayerComplete.listen((void _) { Route route = MaterialPageRoute( builder: (context) => GameOverStats( simfile: widget.simfile, - notes: notes, + notes: _notes, )); Navigator.pushReplacement(context, route); }); @@ -112,10 +112,10 @@ class _LevelState extends State with SingleTickerProviderStateMixin { if (arrowIndex < 0 || arrowIndex > 3) { return; } - notes.add(Note(time: time, direction: ArrowDirection.values[arrowIndex])); + _notes.add(Note(time: time, direction: ArrowDirection.values[arrowIndex])); }); - player.play(DeviceFileSource(widget.simfile.audioPath!)); + _player.play(DeviceFileSource(widget.simfile.audioPath!)); } @override @@ -124,19 +124,19 @@ class _LevelState extends State with SingleTickerProviderStateMixin { _durationSubscription?.cancel(); _positionSubscription?.cancel(); _buttonSubscription?.cancel(); - player.dispose(); + _player.dispose(); super.dispose(); } /// toggle between pause and resume void _pauseResume() { if (_isPlaying) { - player.pause(); + _player.pause(); setState(() { _isPlaying = false; }); } else { - player.resume(); + _player.resume(); setState(() { _isPlaying = true; }); @@ -155,25 +155,25 @@ class _LevelState extends State with SingleTickerProviderStateMixin { // combine keyboard and esense input InputDirection esenseDirection = ESenseInput.instance.getInputDirection(note.direction); - inputDirection.up |= esenseDirection.up; - inputDirection.down |= esenseDirection.down; - inputDirection.left |= esenseDirection.left; - inputDirection.right |= esenseDirection.right; + _inputDirection.up |= esenseDirection.up; + _inputDirection.down |= esenseDirection.down; + _inputDirection.left |= esenseDirection.left; + _inputDirection.right |= esenseDirection.right; // check if input matches arrow direction bool keypressCorrect = false; switch (note.direction) { case ArrowDirection.up: - keypressCorrect = inputDirection.up; + keypressCorrect = _inputDirection.up; break; case ArrowDirection.down: - keypressCorrect = inputDirection.down; + keypressCorrect = _inputDirection.down; break; case ArrowDirection.right: - keypressCorrect = inputDirection.right; + keypressCorrect = _inputDirection.right; break; case ArrowDirection.left: - keypressCorrect = inputDirection.left; + keypressCorrect = _inputDirection.left; break; } if (keypressCorrect) { @@ -181,9 +181,9 @@ class _LevelState extends State with SingleTickerProviderStateMixin { note.wasHit = true; _animationController.reset(); _animationController.forward(); - inputDirection.reset(); + _inputDirection.reset(); setState(() { - hitOrMissMessage = 'Great!'; + _hitOrMissMessage = 'Great!'; }); } } else if (note.position < -0.5 * 1.0 / 60.0) { @@ -191,9 +191,9 @@ class _LevelState extends State with SingleTickerProviderStateMixin { note.wasHit = false; _animationController.reset(); _animationController.forward(); - inputDirection.reset(); + _inputDirection.reset(); setState(() { - hitOrMissMessage = 'Missed'; + _hitOrMissMessage = 'Missed'; }); } } @@ -210,16 +210,16 @@ class _LevelState extends State with SingleTickerProviderStateMixin { } switch (event.logicalKey) { case LogicalKeyboardKey.arrowUp: - inputDirection.up = isDown; + _inputDirection.up = isDown; break; case LogicalKeyboardKey.arrowDown: - inputDirection.down = isDown; + _inputDirection.down = isDown; break; case LogicalKeyboardKey.arrowLeft: - inputDirection.left = isDown; + _inputDirection.left = isDown; break; case LogicalKeyboardKey.arrowRight: - inputDirection.right = isDown; + _inputDirection.right = isDown; break; } } @@ -254,7 +254,7 @@ class _LevelState extends State with SingleTickerProviderStateMixin { )), ), body: Stack(children: [ - Arrows(notes: notes), + Arrows(notes: _notes), Positioned( top: 50, width: MediaQuery.of(context).size.width, @@ -262,7 +262,7 @@ class _LevelState extends State with SingleTickerProviderStateMixin { child: FadeTransition( opacity: _animation, child: Text( - hitOrMissMessage, + _hitOrMissMessage, textScaler: TextScaler.linear(4), textAlign: TextAlign.center, ), diff --git a/lib/screens/level_selection.dart b/lib/screens/level_selection.dart index 5984e65..0987063 100644 --- a/lib/screens/level_selection.dart +++ b/lib/screens/level_selection.dart @@ -17,36 +17,35 @@ class LevelSelection extends StatefulWidget { } class _LevelSelectionState extends State { - String? stepmaniaCoursesPath; - List stepmaniaCoursesFolders = []; - List stepmaniaCoursesFoldersFiltered = []; - String searchString = ''; + String? _stepmaniaCoursesPath; + List _stepmaniaCoursesFolders = []; + List _stepmaniaCoursesFoldersFiltered = []; @override void initState() { super.initState(); - loadFolderPath(); + _loadFolderPath(); } /// gets folder path from persistent storage and updates state with loaded simfiles - Future loadFolderPath() async { + Future _loadFolderPath() async { SharedPreferences prefs = await SharedPreferences.getInstance(); final String? stepmaniaCoursesPathSetting = prefs.getString('stepmania_courses'); if (stepmaniaCoursesPathSetting == null) return; List stepmaniaCoursesFoldersFuture = - await listFilesAndFolders(stepmaniaCoursesPathSetting); + await _listFilesAndFolders(stepmaniaCoursesPathSetting); setState(() { - stepmaniaCoursesPath = stepmaniaCoursesPathSetting; - stepmaniaCoursesFolders = stepmaniaCoursesFoldersFuture; - stepmaniaCoursesFoldersFiltered = stepmaniaCoursesFoldersFuture; + _stepmaniaCoursesPath = stepmaniaCoursesPathSetting; + _stepmaniaCoursesFolders = stepmaniaCoursesFoldersFuture; + _stepmaniaCoursesFoldersFiltered = stepmaniaCoursesFoldersFuture; }); } /// open folder selection dialog and save selected folder in persistent storage - Future selectFolder() async { + Future _selectFolder() async { await Permission.manageExternalStorage.request(); String? selectedFolder = await FilePicker.platform.getDirectoryPath(); @@ -55,12 +54,12 @@ class _LevelSelectionState extends State { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('stepmania_courses', selectedFolder); - loadFolderPath(); + _loadFolderPath(); } } /// load all simfiles from a [directoryPath] - Future> listFilesAndFolders(String directoryPath) async { + Future> _listFilesAndFolders(String directoryPath) async { final directory = Directory(directoryPath); try { // List all files and folders in the directory @@ -90,9 +89,9 @@ class _LevelSelectionState extends State { } /// filter stepmaniaCoursesFolders based on [input] - void filterLevels(String input) { + void _filterLevels(String input) { setState(() { - stepmaniaCoursesFoldersFiltered = stepmaniaCoursesFolders + _stepmaniaCoursesFoldersFiltered = _stepmaniaCoursesFolders .where((simfile) => simfile.tags["TITLE"]! .toLowerCase() .contains(input.toLowerCase())) @@ -119,9 +118,9 @@ class _LevelSelectionState extends State { ], ), body: Builder(builder: (context) { - if (stepmaniaCoursesPath == null) { + if (_stepmaniaCoursesPath == null) { return Text('Add a Directory with Stepmania Songs on \'+\''); - } else if (stepmaniaCoursesFolders.isEmpty) { + } else if (_stepmaniaCoursesFolders.isEmpty) { return Text( 'Folder empty. Add Stepmania Songs to Folder or select a different folder on \'+\''); } else { @@ -131,7 +130,7 @@ class _LevelSelectionState extends State { padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 0.0), child: TextField( - onChanged: filterLevels, + onChanged: _filterLevels, decoration: InputDecoration( // icon: Icon(Icons.search), hintText: 'Search'), @@ -139,11 +138,11 @@ class _LevelSelectionState extends State { ), Expanded( child: ListView.separated( - itemCount: stepmaniaCoursesFoldersFiltered.length, + itemCount: _stepmaniaCoursesFoldersFiltered.length, separatorBuilder: (BuildContext context, int index) => const Divider(), itemBuilder: (context, index) { - Simfile simfile = stepmaniaCoursesFoldersFiltered[index]; + Simfile simfile = _stepmaniaCoursesFoldersFiltered[index]; return LevelListEntry(simfile: simfile); }, ), @@ -154,7 +153,7 @@ class _LevelSelectionState extends State { }), floatingActionButton: FloatingActionButton( onPressed: () { - selectFolder(); + _selectFolder(); }, child: Icon(Icons.add)), ); diff --git a/lib/utils/esense_input.dart b/lib/utils/esense_input.dart index 14cf7de..08875d5 100644 --- a/lib/utils/esense_input.dart +++ b/lib/utils/esense_input.dart @@ -15,18 +15,17 @@ class ESenseInput { ESenseManager eSenseManager = ESenseManager('unknown'); // valuenotifier allows widgets to rerender when the value changes ValueNotifier deviceStatus = ValueNotifier('Disconnected'); - StreamSubscription? subscription; + StreamSubscription? _subscription; String eSenseDeviceName = ''; bool connected = false; - bool sampling = false; - int sampleRate = 20; + final int _sampleRate = 20; - InputDirection inputDirection = InputDirection(); - int x = 0; - int y = 0; - int z = 0; + final InputDirection _inputDirection = InputDirection(); + int _x = 0; + int _y = 0; + int _z = 0; ESenseInput._() { _listenToESense(); @@ -83,7 +82,6 @@ class ESenseInput { break; case ConnectionType.disconnected: deviceStatus.value = 'Disconnected'; - sampling = false; _pauseListenToSensorEvents(); break; case ConnectionType.device_found: @@ -107,7 +105,7 @@ class ESenseInput { void _startListenToSensorEvents() async { // // any changes to the sampling frequency must be done BEFORE listening to sensor events print('setting sampling frequency...'); - bool successs = await eSenseManager.setSamplingRate(sampleRate); + bool successs = await eSenseManager.setSamplingRate(_sampleRate); if (successs) { print('setSamplingRate success'); } else { @@ -115,19 +113,17 @@ class ESenseInput { } // subscribe to sensor event from the eSense device - subscription = eSenseManager.sensorEvents.listen((event) { + _subscription = eSenseManager.sensorEvents.listen((event) { // print('SENSOR event: $event'); if (event.gyro != null) { _parseGyroData(event.gyro!); } }); - sampling = true; } /// cancels the sensorEvents listening void _pauseListenToSensorEvents() async { - subscription?.cancel(); - sampling = false; + _subscription?.cancel(); } /// add up all new gyro [data] in the form of deg/s multiplied by scaling factor @@ -135,42 +131,42 @@ class ESenseInput { void _parseGyroData(List data) { // Float value in deg/s = Gyro value / Gyro scale factor // The default configuration is +- 500deg/s for the gyroscope. - x = (x + (15 * data[0] ~/ (500 * sampleRate))) % 360; - y = (y + (15 * data[1] ~/ (500 * sampleRate))) % 360; - z = (z + (15 * data[2] ~/ (500 * sampleRate))) % 360; - print('$x, $y, $z'); + _x = (_x + (15 * data[0] ~/ (500 * _sampleRate))) % 360; + _y = (_y + (15 * data[1] ~/ (500 * _sampleRate))) % 360; + _z = (_z + (15 * data[2] ~/ (500 * _sampleRate))) % 360; + print('$_x, $_y, $_z'); // print('${(z.toDouble() / 500.0 * (1.0 / sampleRate.toDouble())) * 7.5}'); // print('${z.toDouble() / 500.0 * (1.0 / 10.0)}'); } /// nulls all angles and reset inputDirection void resetAngles() { - inputDirection.reset(); - x = 0; - y = 0; - z = 0; + _inputDirection.reset(); + _x = 0; + _y = 0; + _z = 0; } /// get InputDirection by checking if angels are in defined ranges and /// calibrating based on the [expect]ed direction from ArrowDirection InputDirection getInputDirection(ArrowDirection expect) { // check if angle is in range - inputDirection.up = z > 180 && z < 340; - inputDirection.down = z > 20 && z < 180; - inputDirection.left = y > 0 && y < 180; - inputDirection.right = y > 180 && y < 360; + _inputDirection.up = _z > 180 && _z < 340; + _inputDirection.down = _z > 20 && _z < 180; + _inputDirection.left = _y > 0 && _y < 180; + _inputDirection.right = _y > 180 && _y < 360; // calibrate based on expected directoin from ArrowDirection - if (expect == ArrowDirection.up && inputDirection.up || - expect == ArrowDirection.down && inputDirection.down) { - y = 0; + if (expect == ArrowDirection.up && _inputDirection.up || + expect == ArrowDirection.down && _inputDirection.down) { + _y = 0; } - if (expect == ArrowDirection.left && inputDirection.left || - expect == ArrowDirection.right && inputDirection.right) { - z = 0; + if (expect == ArrowDirection.left && _inputDirection.left || + expect == ArrowDirection.right && _inputDirection.right) { + _z = 0; } - return inputDirection; + return _inputDirection; } /// connect to ESense with [deviceName] by first asking for permissions diff --git a/lib/widgets/esense_connect_dialog.dart b/lib/widgets/esense_connect_dialog.dart index fba37b0..2853ffe 100644 --- a/lib/widgets/esense_connect_dialog.dart +++ b/lib/widgets/esense_connect_dialog.dart @@ -17,7 +17,7 @@ class ESenseConnectDialog extends StatefulWidget { } class _ESenseConnectDialogState extends State { - String eSenseDeviceName = ''; + String _eSenseDeviceName = ''; @override Widget build(BuildContext context) { @@ -31,7 +31,7 @@ class _ESenseConnectDialogState extends State { TextField( onChanged: (input) { setState(() { - eSenseDeviceName = input; + _eSenseDeviceName = input; }); }, decoration: InputDecoration( @@ -54,7 +54,7 @@ class _ESenseConnectDialogState extends State { child: const Text('Disconnect'), ) : TextButton( - onPressed: () => widget.connect(eSenseDeviceName), + onPressed: () => widget.connect(_eSenseDeviceName), child: const Text('Connect'), ), ], diff --git a/lib/widgets/level_list_entry.dart b/lib/widgets/level_list_entry.dart index 2ee8c42..ad7766d 100644 --- a/lib/widgets/level_list_entry.dart +++ b/lib/widgets/level_list_entry.dart @@ -17,13 +17,13 @@ class LevelListEntry extends StatelessWidget { final Simfile simfile; /// navigates to level screen - void navigateToLevel(BuildContext context) { + void _navigateToLevel(BuildContext context) { Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => Level(simfile))); } /// opens ESenseConnectDialog - void openESenseConnectDialog(context) { + void _openESenseConnectDialog(context) { showDialog( context: context, builder: (BuildContext context) { @@ -41,19 +41,19 @@ class LevelListEntry extends StatelessWidget { } /// when clocked on the level, warn if not connected to ESense - void tapHandler(BuildContext context) { + void _tapHandler(BuildContext context) { if (ESenseInput.instance.connected) { - navigateToLevel(context); + _navigateToLevel(context); } else { showDialog( context: context, builder: (BuildContext context) { return ESenseNotConnectedDialog( onCancel: () { - openESenseConnectDialog(context); + _openESenseConnectDialog(context); }, onContinue: () { - navigateToLevel(context); + _navigateToLevel(context); }, ); }, @@ -88,7 +88,7 @@ class LevelListEntry extends StatelessWidget { ), ), onTap: () { - tapHandler(context); + _tapHandler(context); }, ); }