feat: when selecting level show ESenseNotConnectedDialog if not connected to esense
This commit is contained in:
parent
d9403d9e98
commit
4fb6af0135
|
@ -1,14 +1,13 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:sense_the_rhythm/widgets/connection_status_button.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:file_picker/file_picker.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';
|
||||
import 'package:sense_the_rhythm/widgets/connection_status_button.dart';
|
||||
import 'package:sense_the_rhythm/widgets/level_list_entry.dart';
|
||||
|
||||
class LevelSelection extends StatefulWidget {
|
||||
const LevelSelection({super.key});
|
||||
|
@ -133,17 +132,7 @@ class _LevelSelectionState extends State<LevelSelection> {
|
|||
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))),
|
||||
);
|
||||
return LevelListEntry(simfile: simfile);
|
||||
},
|
||||
),
|
||||
),
|
||||
|
|
|
@ -11,7 +11,7 @@ class ESenseInput {
|
|||
static final instance = ESenseInput._();
|
||||
|
||||
ESenseManager eSenseManager = ESenseManager('unknown');
|
||||
ValueNotifier<String> deviceStatus = ValueNotifier('');
|
||||
ValueNotifier<String> deviceStatus = ValueNotifier('Disconnected');
|
||||
StreamSubscription? subscription;
|
||||
|
||||
String eSenseDeviceName = '';
|
||||
|
@ -58,23 +58,23 @@ class ESenseInput {
|
|||
connected = false;
|
||||
switch (event.type) {
|
||||
case ConnectionType.connected:
|
||||
deviceStatus.value = 'connected';
|
||||
deviceStatus.value = 'Connected';
|
||||
connected = true;
|
||||
_startListenToSensorEvents();
|
||||
break;
|
||||
case ConnectionType.unknown:
|
||||
deviceStatus.value = 'unknown';
|
||||
deviceStatus.value = 'Unknown';
|
||||
break;
|
||||
case ConnectionType.disconnected:
|
||||
deviceStatus.value = 'disconnected';
|
||||
deviceStatus.value = 'Disconnected';
|
||||
sampling = false;
|
||||
_pauseListenToSensorEvents();
|
||||
break;
|
||||
case ConnectionType.device_found:
|
||||
deviceStatus.value = 'device_found';
|
||||
deviceStatus.value = 'Device_found';
|
||||
break;
|
||||
case ConnectionType.device_not_found:
|
||||
deviceStatus.value = 'device_not_found';
|
||||
deviceStatus.value = 'Device_not_found';
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
@ -155,11 +155,11 @@ class ESenseInput {
|
|||
print('Trying to connect to eSense device namend \'$deviceName\'');
|
||||
eSenseDeviceName = deviceName;
|
||||
eSenseManager.deviceName = deviceName;
|
||||
connected = await eSenseManager.connect();
|
||||
bool connecting = await eSenseManager.connect();
|
||||
print(
|
||||
'Trying to connect to eSense device namend \'${eSenseManager.deviceName}\'');
|
||||
|
||||
deviceStatus.value = connected ? 'connecting...' : 'connection failed';
|
||||
deviceStatus.value = connecting ? 'connecting...' : 'connection failed';
|
||||
print(deviceStatus.value);
|
||||
}
|
||||
}
|
||||
|
|
34
lib/widgets/esense_not_connected_dialog.dart
Normal file
34
lib/widgets/esense_not_connected_dialog.dart
Normal file
|
@ -0,0 +1,34 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class ESenseNotConnectedDialog extends StatelessWidget {
|
||||
const ESenseNotConnectedDialog(
|
||||
{super.key, required this.onCancel, required this.onContinue});
|
||||
|
||||
final VoidCallback onCancel;
|
||||
final VoidCallback onContinue;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text("ESense not connected"),
|
||||
content: const Text(
|
||||
"You will only be able to play with the arrow keys of an external keyboard. "),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context, 'Cancel');
|
||||
onCancel();
|
||||
},
|
||||
child: const Text('Connect to ESense'),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context, 'Cancel');
|
||||
onContinue();
|
||||
},
|
||||
child: const Text('Continue anyway'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
68
lib/widgets/level_list_entry.dart
Normal file
68
lib/widgets/level_list_entry.dart
Normal file
|
@ -0,0 +1,68 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sense_the_rhythm/utils/esense_input.dart';
|
||||
import 'package:sense_the_rhythm/utils/simfile.dart';
|
||||
import 'package:sense_the_rhythm/screens/level.dart';
|
||||
import 'package:sense_the_rhythm/widgets/esense_connect_dialog.dart';
|
||||
import 'package:sense_the_rhythm/widgets/esense_not_connected_dialog.dart';
|
||||
|
||||
class LevelListEntry extends StatelessWidget {
|
||||
const LevelListEntry({
|
||||
super.key,
|
||||
required this.simfile,
|
||||
});
|
||||
|
||||
final Simfile simfile;
|
||||
|
||||
void navigateToLevel(BuildContext context) {
|
||||
Navigator.push(context,
|
||||
MaterialPageRoute(builder: (BuildContext context) => Level(simfile)));
|
||||
}
|
||||
|
||||
void openESenseConnectDialog(context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return ESenseConnectDialog(
|
||||
deviceStatus: ESenseInput.instance.deviceStatus,
|
||||
connect: (String name) {
|
||||
ESenseInput.instance.connectToESense(name);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void tapHandler(BuildContext context) {
|
||||
if (ESenseInput.instance.connected) {
|
||||
navigateToLevel(context);
|
||||
} else {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return ESenseNotConnectedDialog(
|
||||
onCancel: () {
|
||||
openESenseConnectDialog(context);
|
||||
},
|
||||
onContinue: () {
|
||||
navigateToLevel(context);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListTile(
|
||||
leading: Image.file(File(simfile.bannerPath!)),
|
||||
trailing: Icon(Icons.play_arrow),
|
||||
title: Text(simfile.tags["TITLE"]!),
|
||||
subtitle: Text('3:45'),
|
||||
onTap: () {
|
||||
tapHandler(context);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue