diff --git a/lib/common_widget/graph/bpm_by_time.dart b/lib/common_widget/graph/bpm_by_time.dart index 968d0e1..e5d859f 100644 --- a/lib/common_widget/graph/bpm_by_time.dart +++ b/lib/common_widget/graph/bpm_by_time.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/data_for_graph/func_bpm_and_speed_by_time.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/data_for_graph/func_bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/mobile/mobile_bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/graph/web/web_bpm_by_time.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; @@ -18,9 +20,11 @@ class BpmByTime extends StatefulWidget { class _BpmByTime extends State { @override Widget build(BuildContext context) { + final FuncBpmByTime funcBpm = FuncBpmByTime(widget.data); + return ScreenTypeLayout.builder( mobile: (_) => MobileBpmByTime(widget.media, widget.data), - desktop: (_) => WebBpmByTime(widget.media, widget.data), + desktop: (_) => WebBpmByTime(widget.media, widget.data, funcBpm), ); } } \ No newline at end of file diff --git a/lib/common_widget/graph/data_for_graph/func_bpm_and_speed_by_time.dart b/lib/common_widget/graph/data_for_graph/func_bpm_and_speed_by_time.dart index ae9f413..135c5af 100644 --- a/lib/common_widget/graph/data_for_graph/func_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/data_for_graph/func_bpm_and_speed_by_time.dart @@ -17,6 +17,19 @@ class FuncBpmAndSpeedByTime { reservedSize: 40, ); + SideTitles get leftTitles => SideTitles( + getTitlesWidget: leftTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + SideTitles get bottomTitles => SideTitles( + getTitlesWidget: bottomTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 20, + ); + late final lineBarsData = [ LineChartBarData( spots: data.bpmSecondes, @@ -38,30 +51,33 @@ class FuncBpmAndSpeedByTime { late final tooltipsOnBar = lineBarsData[0]; Widget rightTitleWidgets(double value, TitleMeta meta) { + double interval = data.maxBPM / 5; String text; switch (value.toInt()) { case 0: - text = '0%'; + text = '0 BPM'; break; case 20: - text = '20%'; + text = (interval).toStringAsFixed(2)+" BPM"; break; case 40: - text = '40%'; + text = (interval*2).toStringAsFixed(2)+" BPM"; break; case 60: - text = '60%'; + text = (interval*3).toStringAsFixed(2)+" BPM"; break; case 80: - text = '80%'; + text = (interval*4).toStringAsFixed(2)+" BPM"; break; case 100: - text = '100%'; + text = (interval*5).toString()+" BPM"; break; default: return Container(); } + + return Text(text, style: TextStyle( color: TColor.gray, @@ -69,7 +85,78 @@ class FuncBpmAndSpeedByTime { ), textAlign: TextAlign.center); } + Widget bottomTitleWidgets(double value, TitleMeta meta) { + double interval = data.time/ 5; + String text; + switch (value) { + case 0: + text = '0 s'; + break; + case 20: + text = (interval).toStringAsFixed(2)+" s"; + break; + case 40: + text = (interval*2).toStringAsFixed(2)+" s"; + break; + case 60: + text = (interval*3).toStringAsFixed(2)+" s"; + break; + case 80: + text = (interval*4).toStringAsFixed(2)+" s"; + break; + case 100: + text = (interval*5).toStringAsFixed(2)+" s"; + break; + default: + return Container(); + } + + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + Widget leftTitleWidgets(double value, TitleMeta meta) { + double interval = data.maxSpeed / 5; + + String text; + switch (value.toInt()) { + case 0: + text = '0 m/s'; + break; + case 20: + text = (interval / 5).toStringAsFixed(2)+" m/s"; + break; + case 40: + text = (interval*2).toStringAsFixed(2)+" m/s"; + break; + case 60: + text = (interval*3).toStringAsFixed(2)+" m/s"; + break; + case 80: + text = (interval*4).toStringAsFixed(2)+" m/s"; + break; + case 100: + text = (interval*5).toStringAsFixed(2)+" m/s"; + break; + default: + return Container(); + } + + + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } List get lineBarsData1 => [ lineChartBarData1_1, lineChartBarData1_2, diff --git a/lib/common_widget/graph/data_for_graph/func_bpm_by_time.dart b/lib/common_widget/graph/data_for_graph/func_bpm_by_time.dart new file mode 100644 index 0000000..3c48bf9 --- /dev/null +++ b/lib/common_widget/graph/data_for_graph/func_bpm_by_time.dart @@ -0,0 +1,106 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; + +class FuncBpmByTime { + final DataHomeView data; + + FuncBpmByTime(this.data); + + + SideTitles get rightTitles => SideTitles( + getTitlesWidget: rightTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 40, + ); + + SideTitles get bottomTitles => SideTitles( + getTitlesWidget: bottomTitleWidgets, + showTitles: true, + interval: 20, + reservedSize: 20, + ); + + + + Widget rightTitleWidgets(double value, TitleMeta meta) { + int minBpm = data.minBPM; + int maxBpm = data.maxBPM; + double interval = (maxBpm-minBpm)/ 5; + + print(value.toString()+ "tessst"); + String text; + switch (value.toInt()) { + case 0: + text = (minBpm).toStringAsFixed(2)+" BPM"; + break; + case 20: + text = (minBpm+interval).toStringAsFixed(2)+" BPM"; + break; + case 40: + text = (minBpm+interval*2).toStringAsFixed(2)+" BPM"; + break; + case 60: + text = (minBpm+interval*3).toStringAsFixed(2)+" BPM"; + break; + case 80: + text = (minBpm+interval*4).toStringAsFixed(2)+" BPM"; + break; + case 100: + text = (maxBpm).toStringAsFixed(2)+" BPM"; + break; + default: + return Container(); + } + + + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + Widget bottomTitleWidgets(double value, TitleMeta meta) { + double interval = data.time/ 5; + String text; + switch (value) { + case 0: + text = '0 s'; + break; + case 20: + text = (interval).toStringAsFixed(2)+" s"; + break; + case 40: + text = (interval*2).toStringAsFixed(2)+" s"; + break; + case 60: + text = (interval*3).toStringAsFixed(2)+" s"; + break; + case 80: + text = (interval*4).toStringAsFixed(2)+" s"; + break; + case 100: + text = (interval*5).toStringAsFixed(2)+" s"; + break; + default: + return Container(); + } + + + + return Text(text, + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); + } + + + + +} diff --git a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart index 1b9203d..ec8ad66 100644 --- a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart @@ -24,10 +24,9 @@ class _WebGraphBpmAndSpeedByTime extends State { Widget build(BuildContext context) { final double maxY = widget.data.maxBPM + 2; final double minY = widget.data.minBPM - 2; - final double maxX = + final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; const double minX = 0.0; - return Container( padding: const EdgeInsets.only(left: 15), height: widget.media.width * 0.20, @@ -104,37 +103,25 @@ class _WebGraphBpmAndSpeedByTime extends State { ), ), lineBarsData: widget.func.lineBarsData1, - minY: 0, + minY: -10, maxY: 110, titlesData: FlTitlesData( show: true, leftTitles: AxisTitles( - sideTitles: widget.func.rightTitles, + sideTitles: widget.func.leftTitles, ), topTitles: const AxisTitles(), - bottomTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 20, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text( - "${double.parse((value / 10).toStringAsFixed(2))}s"); - }, - )), + bottomTitles:AxisTitles( + sideTitles: widget.func.bottomTitles, + ), rightTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 70, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text( - "${double.parse(value.toStringAsFixed(2))} BPM"); - }, - ))), + sideTitles: widget.func.rightTitles, + ),), gridData: FlGridData( drawVerticalLine: true, drawHorizontalLine: true, horizontalInterval: (maxY - minY) / 5, - verticalInterval: (maxX - minX) / 4, + verticalInterval: (maxX - minX) / 5 , getDrawingHorizontalLine: (value) { return FlLine( color: TColor.gray.withOpacity(0.15), diff --git a/lib/common_widget/graph/web/web_bpm_by_time.dart b/lib/common_widget/graph/web/web_bpm_by_time.dart index b529862..f6970a9 100644 --- a/lib/common_widget/graph/web/web_bpm_by_time.dart +++ b/lib/common_widget/graph/web/web_bpm_by_time.dart @@ -2,14 +2,17 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/data_for_graph/func_bpm_by_time.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; class WebBpmByTime extends StatefulWidget { final Size media; final DataHomeView data; + final FuncBpmByTime func; - const WebBpmByTime(this.media, this.data, {Key? key}) : super(key: key); + const WebBpmByTime(this.media, this.data, this.func, {Key? key}) + : super(key: key); @override State createState() => _WebBpmByTime(); @@ -18,25 +21,6 @@ class WebBpmByTime extends StatefulWidget { class _WebBpmByTime extends State { @override Widget build(BuildContext context) { - final double maxY = context - .watch() - .managerSelectedActivity - .activitySelected - .first - .activityInfo - .bpmMax + - 2; - final double minY = context - .watch() - .managerSelectedActivity - .activitySelected - .first - .activityInfo - .bpmMin - - 2; - final double maxX = - widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - const double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, @@ -53,16 +37,11 @@ class _WebBpmByTime extends State { width: widget.media.width * 0.35, child: LineChart(LineChartData( lineBarsData: lineBarsData, + minY: widget.data.minBPM.toDouble() * 0.95, borderData: FlBorderData(show: false), - maxY: maxY, - minY: minY, - maxX: maxX, - minX: minX, gridData: FlGridData( drawVerticalLine: true, drawHorizontalLine: true, - horizontalInterval: (maxY - minY) / 5, - verticalInterval: (maxX - minX) / 4, getDrawingHorizontalLine: (value) { return FlLine( color: TColor.gray.withOpacity(0.15), @@ -73,19 +52,19 @@ class _WebBpmByTime extends State { leftTitles: const AxisTitles(), topTitles: const AxisTitles(), bottomTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 20, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text("${double.parse(value.toStringAsFixed(2))}s"); - }, - )), + sideTitles: widget.func.bottomTitles, + ), rightTitles: AxisTitles( sideTitles: SideTitles( reservedSize: 70, showTitles: true, getTitlesWidget: (value, meta) { - return Text("${double.parse(value.toStringAsFixed(2))} BPM"); + return Text("${double.parse(value.toStringAsFixed(2))} BPM", + style: TextStyle( + color: TColor.gray, + fontSize: 12, + ), + textAlign: TextAlign.center); }, )), )))); diff --git a/lib/modele/utile/home_view/data_home_view.dart b/lib/modele/utile/home_view/data_home_view.dart index 6c3220f..089b37f 100644 --- a/lib/modele/utile/home_view/data_home_view.dart +++ b/lib/modele/utile/home_view/data_home_view.dart @@ -7,6 +7,8 @@ class DataHomeView { late List altitudeSeconde; int minBPM = 0; int maxBPM = 0; + double maxSpeed = 0; + double time = 0; DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes, this.altitudeSeconde); diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index b1e2a94..36bec08 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -21,8 +21,8 @@ class HomeViewUtil { List bpmSecondes2 = List.from(bpmSecondes); - return DataHomeView(bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), - normaliserDeuxiemeElement(vitesseSecondes), altitudeSeconde); + return DataHomeView(normaliserPremierElement(bpmSecondes), normaliserPremierElement(normaliserDeuxiemeElement(bpmSecondes2)), + normaliserPremierElement(normaliserDeuxiemeElement(vitesseSecondes)), altitudeSeconde); } List normaliserDeuxiemeElement(List liste) { @@ -41,4 +41,21 @@ class HomeViewUtil { } return liste; } + List normaliserPremierElement(List liste) { + // Trouver le plus grand élément dans le premier élément de chaque FlSpot + double maxElement = 0.0; + for (var spot in liste) { + if (spot.x > maxElement) { + maxElement = spot.x; + } + } + // Calculer le facteur de normalisation + double normalisationFactor = maxElement != 0.0 ? 100 / maxElement : 1.0; + // Mettre à jour tous les premiers éléments de la liste + for (int i = 0; i < liste.length; i++) { + liste[i] = FlSpot(liste[i].x * normalisationFactor, liste[i].y); + } + return liste; +} + } diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 44d337a..89a389a 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -57,9 +57,12 @@ class _WebHomeView extends State { context.watch().managerSelectedActivity.getMaxSpeed(); double avgSpeed = context.watch().managerSelectedActivity.getAvgSpeed(); - + data = HomeViewUtil().initData(context); - + data.maxBPM = maxBpm; + data.minBPM = minBpm; + data.maxSpeed = maxSpeed; + data.time = context.watch().managerSelectedActivity.getTotalTime(); return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -121,7 +124,7 @@ class _WebHomeView extends State { fontWeight: FontWeight.w700), ), SizedBox( - height: media.width * 0.02, + height: media.width * 0.03, ), Row( crossAxisAlignment: CrossAxisAlignment.start,