Skip to content

Commit 5cc6413

Browse files
committed
addded measurements to dashboard, categories card refactor
1 parent 718dcfa commit 5cc6413

File tree

6 files changed

+234
-86
lines changed

6 files changed

+234
-86
lines changed

lib/screens/dashboard.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
4141
DashboardWorkoutWidget(),
4242
DashboardNutritionWidget(),
4343
DashboardWeightWidget(),
44+
DashboardMeasurementsWidget(),
4445
const DashboardCalendarWidget(),
4546
],
4647
),

lib/widgets/dashboard/widgets.dart

Lines changed: 137 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
*/
1818

19+
import 'package:carousel_slider/carousel_slider.dart';
1920
import 'package:flutter/material.dart';
2021
import 'package:flutter/widgets.dart';
2122
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -35,14 +36,20 @@ import 'package:wger/screens/workout_plan_screen.dart';
3536
import 'package:wger/theme/theme.dart';
3637
import 'package:wger/widgets/core/charts.dart';
3738
import 'package:wger/widgets/core/core.dart';
39+
import 'package:wger/widgets/measurements/categories_card.dart';
3840
import 'package:wger/widgets/nutrition/charts.dart';
3941
import 'package:wger/widgets/nutrition/forms.dart';
4042
import 'package:wger/widgets/weight/forms.dart';
4143
import 'package:wger/widgets/workouts/forms.dart';
4244

45+
import '../../providers/measurement.dart';
46+
import '../../screens/measurement_entries_screen.dart';
47+
import '../measurements/forms.dart';
48+
4349
class DashboardNutritionWidget extends StatefulWidget {
4450
@override
45-
_DashboardNutritionWidgetState createState() => _DashboardNutritionWidgetState();
51+
_DashboardNutritionWidgetState createState() =>
52+
_DashboardNutritionWidgetState();
4653
}
4754

4855
class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
@@ -53,7 +60,8 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
5360
@override
5461
void initState() {
5562
super.initState();
56-
_plan = Provider.of<NutritionPlansProvider>(context, listen: false).currentPlan;
63+
_plan =
64+
Provider.of<NutritionPlansProvider>(context, listen: false).currentPlan;
5765
_hasContent = _plan != null;
5866
}
5967

@@ -96,7 +104,8 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
96104
icon: const Icon(Icons.history_edu),
97105
color: wgerPrimaryButtonColor,
98106
onPressed: () {
99-
Provider.of<NutritionPlansProvider>(context, listen: false).logMealToDiary(meal);
107+
Provider.of<NutritionPlansProvider>(context, listen: false)
108+
.logMealToDiary(meal);
100109
ScaffoldMessenger.of(context).showSnackBar(
101110
SnackBar(
102111
content: Text(
@@ -127,7 +136,8 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
127136
),
128137
),
129138
const SizedBox(width: 5),
130-
Text('${item.amount.toStringAsFixed(0)} ${AppLocalizations.of(context).g}'),
139+
Text(
140+
'${item.amount.toStringAsFixed(0)} ${AppLocalizations.of(context).g}'),
131141
],
132142
),
133143
],
@@ -147,7 +157,9 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
147157
return const Text('');
148158
}
149159

150-
return _showDetail ? const Icon(Icons.expand_less) : const Icon(Icons.expand_more);
160+
return _showDetail
161+
? const Icon(Icons.expand_less)
162+
: const Icon(Icons.expand_more);
151163
}
152164

153165
@override
@@ -157,7 +169,9 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
157169
children: [
158170
ListTile(
159171
title: Text(
160-
_hasContent ? _plan!.description : AppLocalizations.of(context).nutritionalPlan,
172+
_hasContent
173+
? _plan!.description
174+
: AppLocalizations.of(context).nutritionalPlan,
161175
style: Theme.of(context).textTheme.headline4,
162176
),
163177
subtitle: Text(
@@ -186,7 +200,8 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
186200
Container(
187201
padding: const EdgeInsets.all(15),
188202
height: 180,
189-
child: NutritionalPlanPieChartWidget(_plan!.nutritionalValues),
203+
child:
204+
NutritionalPlanPieChartWidget(_plan!.nutritionalValues),
190205
)
191206
],
192207
),
@@ -218,8 +233,9 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
218233
TextButton(
219234
child: Text(AppLocalizations.of(context).goToDetailPage),
220235
onPressed: () {
221-
Navigator.of(context)
222-
.pushNamed(NutritionalPlanScreen.routeName, arguments: _plan);
236+
Navigator.of(context).pushNamed(
237+
NutritionalPlanScreen.routeName,
238+
arguments: _plan);
223239
},
224240
),
225241
],
@@ -253,7 +269,7 @@ class _DashboardWeightWidgetState extends State<DashboardWeightWidget> {
253269
style: Theme.of(context).textTheme.headline4,
254270
),
255271
leading: const FaIcon(
256-
FontAwesomeIcons.weightScale,
272+
FontAwesomeIcons.weight,
257273
color: Colors.black,
258274
),
259275
trailing: IconButton(
@@ -286,9 +302,11 @@ class _DashboardWeightWidgetState extends State<DashboardWeightWidget> {
286302
mainAxisAlignment: MainAxisAlignment.end,
287303
children: <Widget>[
288304
TextButton(
289-
child: Text(AppLocalizations.of(context).goToDetailPage),
305+
child: Text(
306+
AppLocalizations.of(context).goToDetailPage),
290307
onPressed: () {
291-
Navigator.of(context).pushNamed(WeightScreen.routeName);
308+
Navigator.of(context)
309+
.pushNamed(WeightScreen.routeName);
292310
}),
293311
],
294312
),
@@ -309,6 +327,101 @@ class _DashboardWeightWidgetState extends State<DashboardWeightWidget> {
309327
}
310328
}
311329

330+
class DashboardMeasurementsWidget extends StatefulWidget {
331+
@override
332+
_DashboardMeasurementsWidgetState createState() =>
333+
_DashboardMeasurementsWidgetState();
334+
}
335+
336+
class _DashboardMeasurementsWidgetState
337+
extends State<DashboardMeasurementsWidget> {
338+
int _current = 0;
339+
final CarouselController _controller = CarouselController();
340+
341+
@override
342+
Widget build(BuildContext context) {
343+
final _provider = Provider.of<MeasurementProvider>(context, listen: false);
344+
345+
var items = _provider.categories
346+
.map(
347+
(item) => CategoriesCard(item),
348+
)
349+
.toList();
350+
return Consumer<BodyWeightProvider>(
351+
builder: (context, workoutProvider, child) => Card(
352+
child: Column(
353+
mainAxisSize: MainAxisSize.min,
354+
children: [
355+
ListTile(
356+
title: Text(
357+
AppLocalizations.of(context).measurements,
358+
style: Theme.of(context).textTheme.headline4,
359+
),
360+
leading: const FaIcon(
361+
FontAwesomeIcons.weight,
362+
color: Colors.black,
363+
),
364+
),
365+
Column(
366+
children: [
367+
if (items.isNotEmpty)
368+
Column(children: [
369+
CarouselSlider(
370+
items: items,
371+
carouselController: _controller,
372+
options: CarouselOptions(
373+
autoPlay: false,
374+
enlargeCenterPage: false,
375+
viewportFraction: 1,
376+
enableInfiniteScroll: false,
377+
aspectRatio: 1.1,
378+
onPageChanged: (index, reason) {
379+
setState(() {
380+
_current = index;
381+
});
382+
}),
383+
),
384+
Padding(
385+
padding: const EdgeInsets.only(bottom: 10),
386+
child: Row(
387+
mainAxisAlignment: MainAxisAlignment.center,
388+
children: items.asMap().entries.map((entry) {
389+
return GestureDetector(
390+
onTap: () => _controller.animateToPage(entry.key),
391+
child: Container(
392+
width: 12.0,
393+
height: 12.0,
394+
margin: EdgeInsets.symmetric(
395+
vertical: 8.0, horizontal: 4.0),
396+
decoration: BoxDecoration(
397+
shape: BoxShape.circle,
398+
color: (Theme.of(context).brightness ==
399+
Brightness.dark
400+
? Colors.white
401+
: wgerPrimaryColor)
402+
.withOpacity(
403+
_current == entry.key ? 0.9 : 0.4)),
404+
),
405+
);
406+
}).toList(),
407+
),
408+
),
409+
])
410+
else
411+
NothingFound(
412+
AppLocalizations.of(context).noWeightEntries,
413+
AppLocalizations.of(context).newEntry,
414+
WeightForm(),
415+
),
416+
],
417+
),
418+
],
419+
),
420+
),
421+
);
422+
}
423+
}
424+
312425
class DashboardWorkoutWidget extends StatefulWidget {
313426
@override
314427
_DashboardWorkoutWidgetState createState() => _DashboardWorkoutWidgetState();
@@ -332,7 +445,9 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
332445
return const Text('');
333446
}
334447

335-
return _showDetail ? const Icon(Icons.expand_less) : const Icon(Icons.expand_more);
448+
return _showDetail
449+
? const Icon(Icons.expand_less)
450+
: const Icon(Icons.expand_more);
336451
}
337452

338453
List<Widget> getContent() {
@@ -364,7 +479,8 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
364479
icon: const Icon(Icons.play_arrow),
365480
color: wgerPrimaryButtonColor,
366481
onPressed: () {
367-
Navigator.of(context).pushNamed(GymModeScreen.routeName, arguments: day);
482+
Navigator.of(context)
483+
.pushNamed(GymModeScreen.routeName, arguments: day);
368484
},
369485
),
370486
],
@@ -386,7 +502,8 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
386502
children: [
387503
Text(s.exerciseObj.name),
388504
const SizedBox(width: 10),
389-
MutedText(set.getSmartRepr(s.exerciseObj).join('\n')),
505+
MutedText(
506+
set.getSmartRepr(s.exerciseObj).join('\n')),
390507
],
391508
),
392509
const SizedBox(height: 10),
@@ -411,7 +528,9 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
411528
children: [
412529
ListTile(
413530
title: Text(
414-
_hasContent ? _workoutPlan!.name : AppLocalizations.of(context).labelWorkoutPlan,
531+
_hasContent
532+
? _workoutPlan!.name
533+
: AppLocalizations.of(context).labelWorkoutPlan,
415534
style: Theme.of(context).textTheme.headline4,
416535
),
417536
subtitle: Text(
@@ -453,8 +572,8 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
453572
TextButton(
454573
child: Text(AppLocalizations.of(context).goToDetailPage),
455574
onPressed: () {
456-
Navigator.of(context)
457-
.pushNamed(WorkoutPlanScreen.routeName, arguments: _workoutPlan);
575+
Navigator.of(context).pushNamed(WorkoutPlanScreen.routeName,
576+
arguments: _workoutPlan);
458577
},
459578
),
460579
],

lib/widgets/measurements/categories.dart

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import 'package:wger/screens/form_screen.dart';
2424
import 'package:wger/screens/measurement_entries_screen.dart';
2525
import 'package:wger/widgets/core/charts.dart';
2626

27+
import 'categories_card.dart';
2728
import 'forms.dart';
2829

2930
class CategoriesList extends StatelessWidget {
@@ -37,58 +38,7 @@ class CategoriesList extends StatelessWidget {
3738
itemBuilder: (context, index) {
3839
final currentCategory = _provider.categories[index];
3940

40-
return Card(
41-
child: Column(
42-
children: [
43-
Padding(
44-
padding: const EdgeInsets.only(top: 5),
45-
child: Text(
46-
currentCategory.name,
47-
style: Theme.of(context).textTheme.headline6,
48-
),
49-
),
50-
Container(
51-
color: Colors.white,
52-
padding: const EdgeInsets.all(10),
53-
height: 220,
54-
child: MeasurementChartWidget(
55-
currentCategory.entries
56-
.map((e) => MeasurementChartEntry(e.value, e.date))
57-
.toList(),
58-
unit: currentCategory.unit,
59-
),
60-
),
61-
const Divider(),
62-
Row(
63-
mainAxisAlignment: MainAxisAlignment.spaceBetween,
64-
children: <Widget>[
65-
TextButton(
66-
child: Text(AppLocalizations.of(context).goToDetailPage),
67-
onPressed: () {
68-
Navigator.pushNamed(
69-
context,
70-
MeasurementEntriesScreen.routeName,
71-
arguments: currentCategory.id,
72-
);
73-
}),
74-
IconButton(
75-
onPressed: () async {
76-
await Navigator.pushNamed(
77-
context,
78-
FormScreen.routeName,
79-
arguments: FormScreenArguments(
80-
AppLocalizations.of(context).newEntry,
81-
MeasurementEntryForm(currentCategory.id!),
82-
),
83-
);
84-
},
85-
icon: const Icon(Icons.add),
86-
),
87-
],
88-
),
89-
],
90-
),
91-
);
41+
return CategoriesCard(currentCategory);
9242
},
9343
);
9444
}

0 commit comments

Comments
 (0)