diff options
Diffstat (limited to 'lib/widgets')
| -rw-r--r-- | lib/widgets/esense_not_connected_dialog.dart | 34 | ||||
| -rw-r--r-- | lib/widgets/level_list_entry.dart | 68 | 
2 files changed, 102 insertions, 0 deletions
| 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: <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'), +        ), +      ], +    ); +  } +} 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); +      }, +    ); +  } +} | 
