From 28d0fe7d8c3a38d7c2ded86c30b549ed6be48f3c Mon Sep 17 00:00:00 2001 From: Orangerot Date: Tue, 14 Jan 2025 16:26:57 +0100 Subject: feat: show duration in level selection + more robust simfile loader --- lib/widgets/arrows.dart | 3 +-- lib/widgets/level_info_chip.dart | 37 +++++++++++++++++++++++++++++++++++++ lib/widgets/level_list_entry.dart | 24 ++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 lib/widgets/level_info_chip.dart (limited to 'lib/widgets') diff --git a/lib/widgets/arrows.dart b/lib/widgets/arrows.dart index cf04e59..162f0f3 100644 --- a/lib/widgets/arrows.dart +++ b/lib/widgets/arrows.dart @@ -4,9 +4,8 @@ import 'package:sense_the_rhythm/widgets/arrow.dart'; class Arrows extends StatelessWidget { final List notes; - final double position; - const Arrows({super.key, required this.notes, required this.position}); + const Arrows({super.key, required this.notes}); @override Widget build(BuildContext context) { diff --git a/lib/widgets/level_info_chip.dart b/lib/widgets/level_info_chip.dart new file mode 100644 index 0000000..8e4146c --- /dev/null +++ b/lib/widgets/level_info_chip.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class LevelInfoChip extends StatelessWidget { + final String label; + final IconData icon; + + const LevelInfoChip({super.key, required this.label, required this.icon}); + + @override + Widget build(BuildContext context) { + return OutlinedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(5)))), + minimumSize: WidgetStateProperty.all(Size(10, 10)), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: WidgetStateProperty.all( + EdgeInsets.symmetric(vertical: 4.0, horizontal: 5.0)) + ), + onPressed: () {}, + child: Row(children: [ + Icon( + icon, + size: 16, + ), + SizedBox(width: 4), + Text( + label, + style: TextStyle( + fontSize: 14, + fontWeight: + FontWeight.w200), // Adjust font size for smaller appearance + ), + ]), + ); + } +} diff --git a/lib/widgets/level_list_entry.dart b/lib/widgets/level_list_entry.dart index 832186f..abb4784 100644 --- a/lib/widgets/level_list_entry.dart +++ b/lib/widgets/level_list_entry.dart @@ -6,6 +6,7 @@ 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'; +import 'package:sense_the_rhythm/widgets/level_info_chip.dart'; class LevelListEntry extends StatelessWidget { const LevelListEntry({ @@ -62,8 +63,27 @@ class LevelListEntry extends StatelessWidget { return ListTile( leading: Image.file(File(simfile.bannerPath!)), trailing: Icon(Icons.play_arrow), - title: Text(simfile.tags["TITLE"]!), - subtitle: Text('3:45'), + title: Text( + simfile.tags["TITLE"]!, + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: Row( + spacing: 2, + children: [ + LevelInfoChip( + label: + '${simfile.duration!.inMinutes}:${simfile.duration!.inSeconds.remainder(60).toString().padLeft(2, "0")}', + icon: Icons.timer_outlined, + ), + LevelInfoChip( + label: '${simfile.bpms.entries.first.value.toInt()} BPM', + icon: Icons.graphic_eq, + ), + ], + ), + ), onTap: () { tapHandler(context); }, -- cgit v1.2.3