From 4fb6af0135c4e3c67b3ddadaa0e60e2bae45d73c Mon Sep 17 00:00:00 2001 From: Orangerot Date: Mon, 13 Jan 2025 18:03:02 +0100 Subject: feat: when selecting level show ESenseNotConnectedDialog if not connected to esense --- lib/widgets/esense_not_connected_dialog.dart | 34 ++++++++++++++ lib/widgets/level_list_entry.dart | 68 ++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 lib/widgets/esense_not_connected_dialog.dart create mode 100644 lib/widgets/level_list_entry.dart (limited to 'lib/widgets') diff --git a/lib/widgets/esense_not_connected_dialog.dart b/lib/widgets/esense_not_connected_dialog.dart new file mode 100644 index 0000000..32d1d6b --- /dev/null +++ b/lib/widgets/esense_not_connected_dialog.dart @@ -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: [ + 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'), + ), + ], + ); + } +} diff --git a/lib/widgets/level_list_entry.dart b/lib/widgets/level_list_entry.dart new file mode 100644 index 0000000..a47a9c2 --- /dev/null +++ b/lib/widgets/level_list_entry.dart @@ -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); + }, + ); + } +} -- cgit v1.2.3