This repository has been archived on 2024-03-27. You can view files and clone it, but cannot push or open issues/pull-requests.
encrateia/lib/widgets/athlete_widgets/athlete_moving_time_widget....

136 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import '/models/activity.dart';
import '/models/activity_list.dart';
import '/models/athlete.dart';
import '/models/tag_group.dart';
import '/utils/athlete_volume_chart.dart';
import '/utils/enums.dart';
import '/utils/image_utils.dart' as image_utils;
import '/utils/my_button.dart';
class AthleteMovingTimeWidget extends StatefulWidget {
const AthleteMovingTimeWidget({this.athlete});
final Athlete athlete;
@override
_AthleteMovingTimeWidgetState createState() =>
_AthleteMovingTimeWidgetState();
}
class _AthleteMovingTimeWidgetState extends State<AthleteMovingTimeWidget> {
ActivityList<Activity> activities = ActivityList<Activity>(<Activity>[]);
List<TagGroup> tagGroups = <TagGroup>[];
String loadingStatus = 'Loading ...';
String screenShotButtonText = 'Save as .png-Image';
GlobalKey widgetKey = GlobalKey();
List<String> sports;
String selectedSports = 'running';
@override
void initState() {
getData();
super.initState();
}
@override
Widget build(BuildContext context) {
if (activities.isNotEmpty) {
final List<Activity> distanceActivities = activities
.where((Activity activity) =>
activity.distance != null && activity.distance > 0)
.toList();
if (distanceActivities.isNotEmpty) {
return ListTileTheme(
iconColor: Colors.deepOrange,
child: ListView(
padding: const EdgeInsets.only(left: 25),
children: <Widget>[
RepaintBoundary(
key: widgetKey,
child: AthleteVolumeChart(
athlete: widget.athlete,
chartTitleText: 'Moving Time over Time (h)',
activities: activities,
volumeAttr: ActivityAttr.movingTimeThisYear,
),
),
Row(children: <Widget>[
const Spacer(),
MyButton.save(
child: Text(screenShotButtonText),
onPressed: () async {
await image_utils.capturePng(widgetKey: widgetKey);
screenShotButtonText = 'Image saved';
setState(() {});
},
),
const SizedBox(width: 20),
]),
Row(
children: <Widget>[
const Spacer(),
const Text('Select Sport'),
const SizedBox(width: 20),
DropdownButton<String>(
items: sports.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
value: selectedSports,
onChanged: (String value) {
selectedSports = value;
getData();
},
),
const Spacer(),
],
),
],
),
);
} else {
return const Center(
child: Text('No volume data available.'),
);
}
} else {
return Center(child: Text(loadingStatus));
}
}
Future<void> getData() async {
final Athlete athlete = widget.athlete;
final List<Activity> unfilteredActivities = await athlete.validActivities;
int movingTimeSoFar = 0;
int year = 1900;
sports = <String>['all'] +
unfilteredActivities
.map((Activity activity) => activity.sport)
.toSet()
.toList();
activities = ActivityList<Activity>(selectedSports == 'all'
? unfilteredActivities
: unfilteredActivities
.where((Activity activity) => activity.sport == selectedSports)
.toList());
for (final Activity activity in activities.reversed) {
if (activity.timeStamp.year != year) {
year = activity.timeStamp.year;
movingTimeSoFar = activity.movingTime;
} else {
movingTimeSoFar += activity.movingTime;
}
activity.movingTimeSoFar = movingTimeSoFar;
}
setState(() =>
loadingStatus = activities.length.toString() + ' activities found');
}
}