correction graph titres
continuous-integration/drone/push Build is passing Details

pull/4/head
Othmane BENJELLOUN 1 year ago
parent 540d5e3fb8
commit 6580f8324c

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.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/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/common_widget/graph/web/web_bpm_by_time.dart';
import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.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<BpmByTime> { class _BpmByTime extends State<BpmByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final FuncBpmByTime funcBpm = FuncBpmByTime(widget.data);
return ScreenTypeLayout.builder( return ScreenTypeLayout.builder(
mobile: (_) => MobileBpmByTime(widget.media, widget.data), mobile: (_) => MobileBpmByTime(widget.media, widget.data),
desktop: (_) => WebBpmByTime(widget.media, widget.data), desktop: (_) => WebBpmByTime(widget.media, widget.data, funcBpm),
); );
} }
} }

@ -17,6 +17,19 @@ class FuncBpmAndSpeedByTime {
reservedSize: 40, 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 = [ late final lineBarsData = [
LineChartBarData( LineChartBarData(
spots: data.bpmSecondes, spots: data.bpmSecondes,
@ -38,30 +51,68 @@ class FuncBpmAndSpeedByTime {
late final tooltipsOnBar = lineBarsData[0]; late final tooltipsOnBar = lineBarsData[0];
Widget rightTitleWidgets(double value, TitleMeta meta) { Widget rightTitleWidgets(double value, TitleMeta meta) {
double interval = data.maxBPM / 5;
String text; String text;
switch (value.toInt()) { switch (value.toInt()) {
case 0: case 0:
text = '0%'; text = '0 BPM';
break;
case 20:
text = (interval).toStringAsFixed(2)+" BPM";
break;
case 40:
text = (interval*2).toStringAsFixed(2)+" BPM";
break;
case 60:
text = (interval*3).toStringAsFixed(2)+" BPM";
break;
case 80:
text = (interval*4).toStringAsFixed(2)+" BPM";
break;
case 100:
text = (interval*5).toString()+" 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; break;
case 20: case 20:
text = '20%'; text = (interval).toStringAsFixed(2)+" s";
break; break;
case 40: case 40:
text = '40%'; text = (interval*2).toStringAsFixed(2)+" s";
break; break;
case 60: case 60:
text = '60%'; text = (interval*3).toStringAsFixed(2)+" s";
break; break;
case 80: case 80:
text = '80%'; text = (interval*4).toStringAsFixed(2)+" s";
break; break;
case 100: case 100:
text = '100%'; text = (interval*5).toStringAsFixed(2)+" s";
break; break;
default: default:
return Container(); return Container();
} }
return Text(text, return Text(text,
style: TextStyle( style: TextStyle(
color: TColor.gray, color: TColor.gray,
@ -70,6 +121,42 @@ class FuncBpmAndSpeedByTime {
textAlign: TextAlign.center); 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<LineChartBarData> get lineBarsData1 => [ List<LineChartBarData> get lineBarsData1 => [
lineChartBarData1_1, lineChartBarData1_1,
lineChartBarData1_2, lineChartBarData1_2,

@ -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);
}
}

@ -27,7 +27,6 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
const double minX = 0.0; const double minX = 0.0;
return Container( return Container(
padding: const EdgeInsets.only(left: 15), padding: const EdgeInsets.only(left: 15),
height: widget.media.width * 0.20, height: widget.media.width * 0.20,
@ -104,37 +103,25 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
), ),
), ),
lineBarsData: widget.func.lineBarsData1, lineBarsData: widget.func.lineBarsData1,
minY: 0, minY: -10,
maxY: 110, maxY: 110,
titlesData: FlTitlesData( titlesData: FlTitlesData(
show: true, show: true,
leftTitles: AxisTitles( leftTitles: AxisTitles(
sideTitles: widget.func.rightTitles, sideTitles: widget.func.leftTitles,
), ),
topTitles: const AxisTitles(), topTitles: const AxisTitles(),
bottomTitles:AxisTitles( bottomTitles:AxisTitles(
sideTitles: SideTitles( sideTitles: widget.func.bottomTitles,
reservedSize: 20, ),
showTitles: true,
getTitlesWidget: (value, meta) {
return Text(
"${double.parse((value / 10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles( rightTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: widget.func.rightTitles,
reservedSize: 70, ),),
showTitles: true,
getTitlesWidget: (value, meta) {
return Text(
"${double.parse(value.toStringAsFixed(2))} BPM");
},
))),
gridData: FlGridData( gridData: FlGridData(
drawVerticalLine: true, drawVerticalLine: true,
drawHorizontalLine: true, drawHorizontalLine: true,
horizontalInterval: (maxY - minY) / 5, horizontalInterval: (maxY - minY) / 5,
verticalInterval: (maxX - minX) / 4, verticalInterval: (maxX - minX) / 5 ,
getDrawingHorizontalLine: (value) { getDrawingHorizontalLine: (value) {
return FlLine( return FlLine(
color: TColor.gray.withOpacity(0.15), color: TColor.gray.withOpacity(0.15),

@ -1,15 +1,15 @@
import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.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/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common_widget/graph/data_for_graph/func_bpm_by_time.dart';
import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart';
class WebBpmByTime extends StatefulWidget { class WebBpmByTime extends StatefulWidget {
final Size media; final Size media;
final DataHomeView data; 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 @override
State<WebBpmByTime> createState() => _WebBpmByTime(); State<WebBpmByTime> createState() => _WebBpmByTime();
@ -18,13 +18,6 @@ class WebBpmByTime extends StatefulWidget {
class _WebBpmByTime extends State<WebBpmByTime> { class _WebBpmByTime extends State<WebBpmByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY =
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY =
context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
const double minX = 0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
spots: widget.data.bpmSecondes, spots: widget.data.bpmSecondes,
@ -39,18 +32,14 @@ class _WebBpmByTime extends State<WebBpmByTime> {
padding: const EdgeInsets.only(left: 15), padding: const EdgeInsets.only(left: 15),
height: widget.media.width * 0.20, height: widget.media.width * 0.20,
width: widget.media.width * 0.35, width: widget.media.width * 0.35,
child: LineChart(LineChartData( child: LineChart(LineChartData(
lineBarsData: lineBarsData, lineBarsData: lineBarsData,
minY: widget.data.minBPM.toDouble()*0.95,
borderData: FlBorderData(show: false), borderData: FlBorderData(show: false),
maxY: maxY,
minY: minY,
maxX: maxX,
minX: minX,
gridData: FlGridData( gridData: FlGridData(
drawVerticalLine: true, drawVerticalLine: true,
drawHorizontalLine: true, drawHorizontalLine: true,
horizontalInterval: (maxY - minY) / 5,
verticalInterval: (maxX - minX) / 4,
getDrawingHorizontalLine: (value) { getDrawingHorizontalLine: (value) {
return FlLine( return FlLine(
color: TColor.gray.withOpacity(0.15), color: TColor.gray.withOpacity(0.15),
@ -61,19 +50,19 @@ class _WebBpmByTime extends State<WebBpmByTime> {
leftTitles: const AxisTitles(), leftTitles: const AxisTitles(),
topTitles: const AxisTitles(), topTitles: const AxisTitles(),
bottomTitles: AxisTitles( bottomTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: widget.func.bottomTitles,
reservedSize: 20, ),
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles( rightTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
reservedSize: 70, reservedSize: 70,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { 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);
}, },
)), )),
)))); ))));

@ -7,6 +7,8 @@ class DataHomeView {
late List<FlSpot> altitudeSeconde; late List<FlSpot> altitudeSeconde;
int minBPM = 0; int minBPM = 0;
int maxBPM = 0; int maxBPM = 0;
double maxSpeed = 0;
double time = 0;
DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes, DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes,
this.altitudeSeconde); this.altitudeSeconde);

@ -21,8 +21,8 @@ class HomeViewUtil {
List<FlSpot> bpmSecondes2 = List.from(bpmSecondes); List<FlSpot> bpmSecondes2 = List.from(bpmSecondes);
return DataHomeView(bpmSecondes, normaliserDeuxiemeElement(bpmSecondes2), return DataHomeView(normaliserPremierElement(bpmSecondes), normaliserPremierElement(normaliserDeuxiemeElement(bpmSecondes2)),
normaliserDeuxiemeElement(vitesseSecondes), altitudeSeconde); normaliserPremierElement(normaliserDeuxiemeElement(vitesseSecondes)), altitudeSeconde);
} }
List<FlSpot> normaliserDeuxiemeElement(List<FlSpot> liste) { List<FlSpot> normaliserDeuxiemeElement(List<FlSpot> liste) {
@ -41,4 +41,21 @@ class HomeViewUtil {
} }
return liste; return liste;
} }
List<FlSpot> normaliserPremierElement(List<FlSpot> 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;
}
} }

@ -41,7 +41,10 @@ class _WebHomeView extends State<WebHomeView> {
context.watch<User>().managerSelectedActivity.getAvgSpeed(); context.watch<User>().managerSelectedActivity.getAvgSpeed();
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
data.maxBPM = maxBpm;
data.minBPM = minBpm;
data.maxSpeed = maxSpeed;
data.time = context.watch<User>().managerSelectedActivity.getTotalTime();
return Scaffold( return Scaffold(
backgroundColor: TColor.white, backgroundColor: TColor.white,
body: SingleChildScrollView( body: SingleChildScrollView(
@ -103,7 +106,7 @@ class _WebHomeView extends State<WebHomeView> {
fontWeight: FontWeight.w700), fontWeight: FontWeight.w700),
), ),
SizedBox( SizedBox(
height: media.width * 0.02, height: media.width * 0.03,
), ),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

Loading…
Cancel
Save