From 44ec7eac8c01a65d1fa1107e65e62a300834cf19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Sat, 11 Nov 2023 22:33:36 +0100 Subject: [PATCH] Improve "discoveries" chart --- android/gradle.properties | 4 +- assets/translations/en.json | 3 +- assets/translations/fr.json | 3 +- .../metadata/android/en-US/changelogs/27.txt | 1 + .../metadata/android/fr-FR/changelogs/27.txt | 1 + .../widgets/main_screen/discoveries_card.dart | 27 ++++++-- ...rt.dart => discoveries_chart_artists.dart} | 13 +--- .../main_screen/discoveries_chart_tracks.dart | 69 +++++++++++++++++++ .../discoveries_content_artists.dart | 43 ++++++++++++ ...t.dart => discoveries_content_tracks.dart} | 10 +-- pubspec.yaml | 2 +- 11 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/27.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/27.txt rename lib/ui/widgets/main_screen/{discoveries_chart.dart => discoveries_chart_artists.dart} (79%) create mode 100644 lib/ui/widgets/main_screen/discoveries_chart_tracks.dart create mode 100644 lib/ui/widgets/main_screen/discoveries_content_artists.dart rename lib/ui/widgets/main_screen/{discoveries_content.dart => discoveries_content_tracks.dart} (82%) diff --git a/android/gradle.properties b/android/gradle.properties index f0fcf6c..408253c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=0.0.26 -app.versionCode=26 +app.versionName=0.0.27 +app.versionCode=27 diff --git a/assets/translations/en.json b/assets/translations/en.json index 449c95d..a2823eb 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -17,7 +17,8 @@ "counts_by_day": "Counts by day ({daysCount} days)", "counts_by_hour": "Counts by hour ({daysCount} days)", - "discoveries_title": "Discoveries ({daysCount} days)", + "discoveries_artists_title": "Artists discoveries ({daysCount} days)", + "discoveries_tracks_title": "Tracks discoveries ({daysCount} days)", "top_artists_title": "Top artists ({daysCount} days)", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 1b19c8a..67d019d 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -17,7 +17,8 @@ "counts_by_day": "Écoutes par jour ({daysCount} jours)", "counts_by_hour": "Écoutes par heure ({daysCount} jours)", - "discoveries_title": "Découvertes ({daysCount} jours)", + "discoveries_artists_title": "Artistes découverts ({daysCount} jours)", + "discoveries_tracks_title": "Morceaux découverts ({daysCount} jours)", "top_artists_title": "Top artistes ({daysCount} jours)", diff --git a/fastlane/metadata/android/en-US/changelogs/27.txt b/fastlane/metadata/android/en-US/changelogs/27.txt new file mode 100644 index 0000000..eeb190d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/27.txt @@ -0,0 +1 @@ +Improve "discoveries" chart. diff --git a/fastlane/metadata/android/fr-FR/changelogs/27.txt b/fastlane/metadata/android/fr-FR/changelogs/27.txt new file mode 100644 index 0000000..cb3be4c --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/27.txt @@ -0,0 +1 @@ +Amélioration du graphique des découvertes. diff --git a/lib/ui/widgets/main_screen/discoveries_card.dart b/lib/ui/widgets/main_screen/discoveries_card.dart index 838d379..57f0d04 100644 --- a/lib/ui/widgets/main_screen/discoveries_card.dart +++ b/lib/ui/widgets/main_screen/discoveries_card.dart @@ -5,7 +5,8 @@ import 'package:flutter/material.dart'; import '../../../models/discoveries.dart'; import '../../../network/scrobbles_api.dart'; import '../../../ui/widgets/error.dart'; -import '../../../ui/widgets/main_screen/discoveries_content.dart'; +import 'discoveries_content_artists.dart'; +import 'discoveries_content_tracks.dart'; class ChartDiscoveriesCard extends StatelessWidget { const ChartDiscoveriesCard({super.key}); @@ -33,12 +34,24 @@ class ChartDiscoveriesCard extends StatelessWidget { ), child: Padding( padding: const EdgeInsets.all(8.0), - child: ChartDiscoveriesCardContent( - daysCount: daysCount, - chartData: snapshot.hasData - ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString())) - : DiscoveriesData.createEmpty(), - isLoading: !snapshot.hasData, + child: Column( + children: [ + ChartDiscoveriesArtistsCardContent( + daysCount: daysCount, + chartData: snapshot.hasData + ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString())) + : DiscoveriesData.createEmpty(), + isLoading: !snapshot.hasData, + ), + const SizedBox(height: 8), + ChartDiscoveriesTracksCardContent( + daysCount: daysCount, + chartData: snapshot.hasData + ? DiscoveriesData.fromJson(jsonDecode(snapshot.data.toString())) + : DiscoveriesData.createEmpty(), + isLoading: !snapshot.hasData, + ), + ], ), ), ); diff --git a/lib/ui/widgets/main_screen/discoveries_chart.dart b/lib/ui/widgets/main_screen/discoveries_chart_artists.dart similarity index 79% rename from lib/ui/widgets/main_screen/discoveries_chart.dart rename to lib/ui/widgets/main_screen/discoveries_chart_artists.dart index 4e5ed7d..eb76c31 100644 --- a/lib/ui/widgets/main_screen/discoveries_chart.dart +++ b/lib/ui/widgets/main_screen/discoveries_chart_artists.dart @@ -6,10 +6,10 @@ import '../../../models/discoveries.dart'; import '../../../utils/color_extensions.dart'; import '../../../ui/widgets/charts/custom_bar_chart.dart'; -class ChartDiscoveries extends CustomBarChart { +class ChartDiscoveriesArtists extends CustomBarChart { final DiscoveriesData chartData; - ChartDiscoveries({super.key, required this.chartData}); + ChartDiscoveriesArtists({super.key, required this.chartData}); @override Widget build(BuildContext context) { @@ -31,14 +31,10 @@ class ChartDiscoveries extends CustomBarChart { DiscoveriesDataValue? value = this.chartData.data[key]; if (value != null) { double newArtistsCount = value.newArtistsCount.toDouble(); - double newTracksCount = value.newTracksCount.toDouble(); if (newArtistsCount > maxValue) { maxValue = newArtistsCount; } - if (newTracksCount > maxValue) { - maxValue = newTracksCount; - } } }); @@ -49,7 +45,6 @@ class ChartDiscoveries extends CustomBarChart { List<BarChartGroupData> data = []; final newArtistsBarColor = AppColors.contentColorGreen.darken(20); - final newTracksBarColor = AppColors.contentColorBlue.darken(20); this.chartData.data.keys.forEach((key) { DiscoveriesDataValue? value = this.chartData.data[key]; @@ -60,13 +55,11 @@ class ChartDiscoveries extends CustomBarChart { x: date, values: [ value.newArtistsCount.toDouble(), - value.newTracksCount.toDouble(), ], barColors: [ newArtistsBarColor, - newTracksBarColor, ], - barWidth: barWidth / 2.5, + barWidth: barWidth, )); } }); diff --git a/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart b/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart new file mode 100644 index 0000000..622911d --- /dev/null +++ b/lib/ui/widgets/main_screen/discoveries_chart_tracks.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:fl_chart/fl_chart.dart'; + +import '../../../config/app_colors.dart'; +import '../../../models/discoveries.dart'; +import '../../../utils/color_extensions.dart'; +import '../../../ui/widgets/charts/custom_bar_chart.dart'; + +class ChartDiscoveriesTracks extends CustomBarChart { + final DiscoveriesData chartData; + + ChartDiscoveriesTracks({super.key, required this.chartData}); + + @override + Widget build(BuildContext context) { + return Container( + height: this.chartHeight, + child: LayoutBuilder(builder: (context, constraints) { + return getBarChart( + barWidth: this.getBarWidth(constraints.maxWidth, this.chartData.data.keys.length), + backgroundColor: Theme.of(context).colorScheme.onSurface, + ); + }), + ); + } + + double getMaxCountsValue() { + double maxValue = 0; + + this.chartData.data.keys.forEach((key) { + DiscoveriesDataValue? value = this.chartData.data[key]; + if (value != null) { + double newTracksCount = value.newTracksCount.toDouble(); + + if (newTracksCount > maxValue) { + maxValue = newTracksCount; + } + } + }); + + return maxValue; + } + + List<BarChartGroupData> getDataCounts(double barWidth) { + List<BarChartGroupData> data = []; + + final newTracksBarColor = AppColors.contentColorBlue.darken(20); + + this.chartData.data.keys.forEach((key) { + DiscoveriesDataValue? value = this.chartData.data[key]; + if (value != null) { + final int date = DateTime.parse(key).millisecondsSinceEpoch; + + data.add(this.getBarItem( + x: date, + values: [ + value.newTracksCount.toDouble(), + ], + barColors: [ + newTracksBarColor, + ], + barWidth: barWidth, + )); + } + }); + + return data; + } +} diff --git a/lib/ui/widgets/main_screen/discoveries_content_artists.dart b/lib/ui/widgets/main_screen/discoveries_content_artists.dart new file mode 100644 index 0000000..b608e9d --- /dev/null +++ b/lib/ui/widgets/main_screen/discoveries_content_artists.dart @@ -0,0 +1,43 @@ +import 'dart:convert'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; + +import '../../../models/discoveries.dart'; +import 'discoveries_chart_artists.dart'; + +class ChartDiscoveriesArtistsCardContent extends StatelessWidget { + final int daysCount; + final DiscoveriesData chartData; + final bool isLoading; + + const ChartDiscoveriesArtistsCardContent( + {super.key, required this.daysCount, required this.chartData, required this.isLoading}); + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).primaryTextTheme; + final String placeholder = 'â³'; + + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: <Widget>[ + Text( + 'discoveries_artists_title', + style: textTheme.titleLarge!.apply(fontWeightDelta: 2), + ).tr( + namedArgs: { + 'daysCount': this.daysCount.toString(), + }, + ), + const SizedBox(height: 8), + this.isLoading + ? Text(placeholder) + : ChartDiscoveriesArtists( + chartData: DiscoveriesData.fromJson(jsonDecode(this.chartData.toString())), + ), + ], + ); + } +} diff --git a/lib/ui/widgets/main_screen/discoveries_content.dart b/lib/ui/widgets/main_screen/discoveries_content_tracks.dart similarity index 82% rename from lib/ui/widgets/main_screen/discoveries_content.dart rename to lib/ui/widgets/main_screen/discoveries_content_tracks.dart index 5dccaf0..9ca8ff1 100644 --- a/lib/ui/widgets/main_screen/discoveries_content.dart +++ b/lib/ui/widgets/main_screen/discoveries_content_tracks.dart @@ -4,14 +4,14 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import '../../../models/discoveries.dart'; -import '../../../ui/widgets/main_screen/discoveries_chart.dart'; +import 'discoveries_chart_tracks.dart'; -class ChartDiscoveriesCardContent extends StatelessWidget { +class ChartDiscoveriesTracksCardContent extends StatelessWidget { final int daysCount; final DiscoveriesData chartData; final bool isLoading; - const ChartDiscoveriesCardContent( + const ChartDiscoveriesTracksCardContent( {super.key, required this.daysCount, required this.chartData, required this.isLoading}); @override @@ -24,7 +24,7 @@ class ChartDiscoveriesCardContent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Text( - 'discoveries_title', + 'discoveries_tracks_title', style: textTheme.titleLarge!.apply(fontWeightDelta: 2), ).tr( namedArgs: { @@ -34,7 +34,7 @@ class ChartDiscoveriesCardContent extends StatelessWidget { const SizedBox(height: 8), this.isLoading ? Text(placeholder) - : ChartDiscoveries( + : ChartDiscoveriesTracks( chartData: DiscoveriesData.fromJson(jsonDecode(this.chartData.toString())), ), ], diff --git a/pubspec.yaml b/pubspec.yaml index c6d571c..ad3eda2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Display scrobbles data and charts publish_to: 'none' -version: 0.0.26+26 +version: 0.0.27+27 environment: sdk: '^3.0.0' -- GitLab