diff --git a/lib/components/Shared/TrackTile.dart b/lib/components/Shared/TrackTile.dart index d098e2f3..b8b9b2f9 100644 --- a/lib/components/Shared/TrackTile.dart +++ b/lib/components/Shared/TrackTile.dart @@ -196,7 +196,7 @@ class TrackTile extends HookConsumerWidget { ), SizedBox( height: 20, - width: 25, + width: 15, child: Text( (track.key + 1).toString(), textAlign: TextAlign.center, diff --git a/lib/components/Shared/TracksTableView.dart b/lib/components/Shared/TracksTableView.dart index 670c37ec..c88266ba 100644 --- a/lib/components/Shared/TracksTableView.dart +++ b/lib/components/Shared/TracksTableView.dart @@ -39,6 +39,13 @@ class TracksTableView extends HookConsumerWidget { final selected = useState>([]); final showCheck = useState(false); + final selectedTracks = useMemoized( + () => tracks.where( + (track) => selected.value.contains(track.id), + ), + [tracks], + ); + return SliverList( delegate: SliverChildListDelegate([ if (heading != null) heading!, @@ -101,9 +108,11 @@ class TracksTableView extends HookConsumerWidget { PopupMenuItem( enabled: selected.value.isNotEmpty, child: Row( - children: const [ - Icon(Icons.file_download_outlined), - Text("Download"), + children: [ + const Icon(Icons.file_download_outlined), + Text( + "Download ${selectedTracks.isNotEmpty ? "(${selectedTracks.length})" : ""}", + ), ], ), value: "download", @@ -123,9 +132,6 @@ class TracksTableView extends HookConsumerWidget { final queue = Queue( delay: const Duration(seconds: 5), ); - final selectedTracks = tracks.where( - (track) => selected.value.contains(track.id), - ); for (final selectedTrack in selectedTracks) { queue.add(() async { downloader.addToQueue( @@ -136,6 +142,9 @@ class TracksTableView extends HookConsumerWidget { ); }); } + + selected.value = []; + showCheck.value = false; await queue.onComplete; break; } diff --git a/lib/main.dart b/lib/main.dart index 7dcda878..5709e033 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -109,7 +109,7 @@ class _SpotubeState extends ConsumerState with WidgetsBindingObserver { super.initState(); SharedPreferences.getInstance().then(((value) => localStorage = value)); WidgetsBinding.instance.addObserver(this); - FlutterDownloader.registerCallback(downloadCallback); + if (kIsMobile) FlutterDownloader.registerCallback(downloadCallback); } @pragma('vm:entry-point') diff --git a/lib/themes/dark-theme.dart b/lib/themes/dark-theme.dart index 9bb7b286..8e91bfd9 100644 --- a/lib/themes/dark-theme.dart +++ b/lib/themes/dark-theme.dart @@ -73,5 +73,12 @@ ThemeData darkTheme({ cardColor: backgroundMaterialColor[800], canvasColor: backgroundMaterialColor[900], listTileTheme: const ListTileThemeData(horizontalTitleGap: 0), + checkboxTheme: CheckboxThemeData( + fillColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { + return accentMaterialColor[500]; + } + }), + ), ); } diff --git a/lib/themes/light-theme.dart b/lib/themes/light-theme.dart index c8b7b92c..2784fb4e 100644 --- a/lib/themes/light-theme.dart +++ b/lib/themes/light-theme.dart @@ -97,5 +97,12 @@ ThemeData lightTheme({ ), cardColor: backgroundMaterialColor[50], canvasColor: backgroundMaterialColor[50], + checkboxTheme: CheckboxThemeData( + fillColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { + return accentMaterialColor[500]; + } + }), + ), ); }