diff --git a/android/gradle.properties b/android/gradle.properties index 777ac2de0980e935649cf32bd85097eaf789185a..cd2d833ca96b3d1ada4a39df51dc5f5ee67665b7 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.16 -app.versionCode=16 +app.versionName=0.0.17 +app.versionCode=17 diff --git a/fastlane/metadata/android/en-US/changelogs/17.txt b/fastlane/metadata/android/en-US/changelogs/17.txt new file mode 100644 index 0000000000000000000000000000000000000000..9af6c6572ed39cb47a96a0cbb85ff38e30a25c3b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/17.txt @@ -0,0 +1 @@ +Stack global counts and eclecticism charts. diff --git a/fastlane/metadata/android/fr-FR/changelogs/17.txt b/fastlane/metadata/android/fr-FR/changelogs/17.txt new file mode 100644 index 0000000000000000000000000000000000000000..a3cdc481a58bb0c2c7ade0994175198f29a953e8 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/17.txt @@ -0,0 +1 @@ +Superposition des graphiques d'écoutes global et d'éclectisme. diff --git a/lib/ui/widgets/charts/custom_bar_chart.dart b/lib/ui/widgets/charts/custom_bar_chart.dart index 606b7bd09b87fe56920aa5c49ba949075c94a2f9..2d0e8514648418feb5f7fb9660f67d9069a55c3a 100644 --- a/lib/ui/widgets/charts/custom_bar_chart.dart +++ b/lib/ui/widgets/charts/custom_bar_chart.dart @@ -37,7 +37,7 @@ class CustomBarChart extends StatelessWidget { } double getBarWidth(double containerWidth, int barsCount) { - return 0.7 * (containerWidth / barsCount); + return 0.65 * (containerWidth / barsCount); } List<BarChartGroupData> getDataCounts(double barWidth) { @@ -118,11 +118,21 @@ class CustomBarChart extends StatelessWidget { final AxisTitles verticalTitles = AxisTitles( sideTitles: SideTitles( showTitles: true, - reservedSize: 30, + reservedSize: 35, getTitlesWidget: getVerticalTitlesWidget, interval: this.verticalTicksInterval, ), ); + + final AxisTitles verticalSpacer = AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 35, + getTitlesWidget: getVerticalTitlesSpacerWidget, + interval: this.verticalTicksInterval, + ), + ); + final AxisTitles horizontalTitles = AxisTitles( sideTitles: SideTitles( showTitles: true, @@ -136,13 +146,14 @@ class CustomBarChart extends StatelessWidget { bottomTitles: horizontalTitles, leftTitles: verticalTitles, topTitles: none, - rightTitles: verticalTitles, + rightTitles: verticalSpacer, ); } Widget getVerticalTitlesWidget(double value, TitleMeta meta) { String suffix = this.verticalAxisTitleSuffix != '' ? ' ' + this.verticalAxisTitleSuffix : ''; + return SideTitleWidget( axisSide: meta.axisSide, space: 4, @@ -156,6 +167,14 @@ class CustomBarChart extends StatelessWidget { ); } + Widget getVerticalTitlesSpacerWidget(double value, TitleMeta meta) { + return SideTitleWidget( + axisSide: meta.axisSide, + space: 4, + child: Text(''), + ); + } + Widget getHorizontalTitlesWidget(double value, TitleMeta meta) { final DateFormat formatter = DateFormat('dd/MM'); @@ -165,13 +184,16 @@ class CustomBarChart extends StatelessWidget { return SideTitleWidget( axisSide: meta.axisSide, space: 4, - child: RotationTransition( - turns: new AlwaysStoppedAnimation(-30 / 360), - child: Text( - text, - style: TextStyle( - color: AppColors.mainTextColor1, - fontSize: this.titleFontSize, + child: Padding( + padding: EdgeInsets.only(right: 10), + child: RotationTransition( + turns: new AlwaysStoppedAnimation(-30 / 360), + child: Text( + text, + style: TextStyle( + color: AppColors.mainTextColor1, + fontSize: this.titleFontSize, + ), ), ), ), diff --git a/lib/ui/widgets/charts/custom_line_chart.dart b/lib/ui/widgets/charts/custom_line_chart.dart index 472ba539f36d65edbedd35e53a9ab5de70a6c9c9..53034a9a281d46fc8fa8509e597fde7ffa92a995 100644 --- a/lib/ui/widgets/charts/custom_line_chart.dart +++ b/lib/ui/widgets/charts/custom_line_chart.dart @@ -1,9 +1,7 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import '../../../config/app_colors.dart'; -import '../../../utils/color_extensions.dart'; class CustomLineChart extends StatelessWidget { CustomLineChart({super.key}); @@ -20,34 +18,54 @@ class CustomLineChart extends StatelessWidget { ); } - LinearGradient getGradient(Color baseColor) { - return LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: <Color>[ - baseColor.lighten(30), - baseColor, - baseColor.darken(30), - ], - tileMode: TileMode.mirror, - ); - } - FlBorderData getBorderData() { return FlBorderData( - show: true, - border: Border.all( - color: AppColors.borderColor, - width: 2, - ), + show: false, ); } FlGridData getGridData() { return const FlGridData( + show: false, + ); + } + + FlTitlesData getTitlesData() { + const AxisTitles none = const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ); + + final AxisTitles verticalTitles = AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 35, + getTitlesWidget: getVerticalTitlesWidget, + interval: 25, + ), + ); + + final AxisTitles verticalSpacer = AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 35, + getTitlesWidget: getVerticalTitlesSpacerWidget, + ), + ); + + final AxisTitles horizontalTitles = AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 20, + getTitlesWidget: getHorizontalTitlesWidget, + ), + ); + + return FlTitlesData( show: true, - drawHorizontalLine: true, - drawVerticalLine: false, + bottomTitles: horizontalTitles, + leftTitles: verticalSpacer, + topTitles: none, + rightTitles: verticalTitles, ); } @@ -56,7 +74,7 @@ class CustomLineChart extends StatelessWidget { axisSide: meta.axisSide, space: 4, child: Text( - value.toInt().toString(), + value.toInt().toString() + ' %', style: TextStyle( color: AppColors.mainTextColor1, fontSize: this.titleFontSize, @@ -65,28 +83,18 @@ class CustomLineChart extends StatelessWidget { ); } - Widget getHorizontalTitlesWidget(double value, TitleMeta meta) { - final DateFormat formatter = DateFormat('dd/MM'); - - final DateTime date = DateTime.fromMillisecondsSinceEpoch(value.toInt()); - final String text = formatter.format(date); - + Widget getVerticalTitlesSpacerWidget(double value, TitleMeta meta) { return SideTitleWidget( axisSide: meta.axisSide, space: 4, - child: RotationTransition( - turns: new AlwaysStoppedAnimation(-30 / 360), - child: Text( - text, - style: TextStyle( - color: AppColors.mainTextColor1, - fontSize: this.titleFontSize, - ), - ), - ), + child: Text(''), ); } + Widget getHorizontalTitlesWidget(double value, TitleMeta meta) { + return Text(''); + } + LineTouchData getLineTouchDataEclecticism() { return LineTouchData( handleBuiltInTouches: true, diff --git a/lib/ui/widgets/main_screen/timeline_chart_counts.dart b/lib/ui/widgets/main_screen/timeline_chart_counts.dart index 4024e7a38182804cdb7d8f69afde2b2f6d469124..02534a9d5f761c4a3212e57ac369bdddc4259250 100644 --- a/lib/ui/widgets/main_screen/timeline_chart_counts.dart +++ b/lib/ui/widgets/main_screen/timeline_chart_counts.dart @@ -10,7 +10,7 @@ class ChartTimelineCounts extends CustomBarChart { ChartTimelineCounts({super.key, required this.chartData}); - final double chartHeight = 150.0; + final double chartHeight = 120.0; final double verticalTicksInterval = 50; @override diff --git a/lib/ui/widgets/main_screen/timeline_chart_eclecticism.dart b/lib/ui/widgets/main_screen/timeline_chart_eclecticism.dart index c78e8fac576f816b27df7585553d96ebce134963..9db1699a2448e02dd0bd8a2afa0caa6d210089ab 100644 --- a/lib/ui/widgets/main_screen/timeline_chart_eclecticism.dart +++ b/lib/ui/widgets/main_screen/timeline_chart_eclecticism.dart @@ -13,16 +13,19 @@ class ChartTimelineEclecticism extends CustomLineChart { @override Widget build(BuildContext context) { + final horizontalScale = getHorizontalScale(); + return Container( height: this.chartHeight, child: LineChart( LineChartData( lineBarsData: getDataEclecticism(), - backgroundColor: Theme.of(context).colorScheme.onSurface, borderData: getBorderData(), gridData: getGridData(), titlesData: getTitlesData(), lineTouchData: getLineTouchDataEclecticism(), + minX: horizontalScale['min'], + maxX: horizontalScale['max'], maxY: 100, minY: 0, ), @@ -31,6 +34,33 @@ class ChartTimelineEclecticism extends CustomLineChart { ); } + Map<String, double> getHorizontalScale() { + // Left/right margins: 12h, in milliseconds + int margin = 12 * 60 * 60 * 1000; + + double minDateAsDouble = double.maxFinite; + double maxDateAsDouble = -double.maxFinite; + + this.chartData.data.keys.forEach((element) { + TimelineDataValue? value = this.chartData.data[element]; + if (value != null) { + final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble(); + + if (date < minDateAsDouble) { + minDateAsDouble = date; + } + if (date > maxDateAsDouble) { + maxDateAsDouble = date; + } + } + }); + + return { + 'min': minDateAsDouble - margin, + 'max': maxDateAsDouble + margin, + }; + } + List<LineChartBarData> getDataEclecticism() { List<FlSpot> spots = []; @@ -45,53 +75,17 @@ class ChartTimelineEclecticism extends CustomLineChart { }); final baseColor = AppColors.contentColorCyan; - final gradient = getGradient(baseColor); final borderColor = baseColor.darken(20); return [ LineChartBarData( isCurved: true, color: borderColor, - barWidth: 3, + barWidth: 2, isStrokeCapRound: false, dotData: const FlDotData(show: false), - belowBarData: BarAreaData( - show: true, - color: baseColor, - gradient: gradient, - ), spots: spots, ), ]; } - - FlTitlesData getTitlesData() { - const AxisTitles none = const AxisTitles( - sideTitles: SideTitles(showTitles: false), - ); - - final AxisTitles verticalTitles = AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 30, - getTitlesWidget: getVerticalTitlesWidget, - interval: 25, - ), - ); - final AxisTitles horizontalTitles = AxisTitles( - sideTitles: SideTitles( - showTitles: true, - reservedSize: 20, - getTitlesWidget: getHorizontalTitlesWidget, - ), - ); - - return FlTitlesData( - show: true, - bottomTitles: horizontalTitles, - leftTitles: verticalTitles, - topTitles: none, - rightTitles: verticalTitles, - ); - } } diff --git a/lib/ui/widgets/main_screen/timeline_content.dart b/lib/ui/widgets/main_screen/timeline_content.dart index f460cdf31dc349d7b9292a0fb7a0895e40f3c40c..1533ee1740202592639c273ef2c6a667b2219091 100644 --- a/lib/ui/widgets/main_screen/timeline_content.dart +++ b/lib/ui/widgets/main_screen/timeline_content.dart @@ -35,14 +35,11 @@ class ChartTimelineCardContent extends StatelessWidget { const SizedBox(height: 8), this.isLoading ? Text(placeholder) - : Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + : Stack( children: [ ChartTimelineCounts( chartData: TimelineData.fromJson(jsonDecode(this.chartData.toString())), ), - const SizedBox(height: 8), ChartTimelineEclecticism( chartData: TimelineData.fromJson(jsonDecode(this.chartData.toString())), ), diff --git a/pubspec.yaml b/pubspec.yaml index 9a70a6477a52b11f65feca6bd7e840f1f11f6aac..a0a42d30fec4548672b162a6f929c67c6ba4d6d0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Display scrobbles data and charts publish_to: 'none' -version: 0.0.16+16 +version: 0.0.17+17 environment: sdk: '^3.0.0'