From 3922549be87427d3ae14d4cb91b7c8a36d074292 Mon Sep 17 00:00:00 2001 From: Dieter Plaetinck Date: Sat, 1 Jun 2024 21:44:56 +0200 Subject: [PATCH] log meals page + new 'log {meal,ingredient} to diary' dashboard buttons --- lib/main.dart | 2 + lib/screens/log_meal_screen.dart | 6 +- lib/screens/log_meals_screen.dart | 56 +++++++++++++++++++ lib/widgets/dashboard/widgets.dart | 19 +++++-- lib/widgets/nutrition/meal.dart | 7 ++- .../nutrition/nutritional_plan_detail.dart | 2 + 6 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 lib/screens/log_meals_screen.dart diff --git a/lib/main.dart b/lib/main.dart index c035e5e5..6b2785e8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -39,6 +39,7 @@ import 'package:wger/screens/gallery_screen.dart'; import 'package:wger/screens/gym_mode.dart'; import 'package:wger/screens/home_tabs_screen.dart'; import 'package:wger/screens/log_meal_screen.dart'; +import 'package:wger/screens/log_meals_screen.dart'; import 'package:wger/screens/measurement_categories_screen.dart'; import 'package:wger/screens/measurement_entries_screen.dart'; import 'package:wger/screens/nutritional_diary_screen.dart'; @@ -159,6 +160,7 @@ class MyApp extends StatelessWidget { NutritionalPlansScreen.routeName: (ctx) => NutritionalPlansScreen(), NutritionalDiaryScreen.routeName: (ctx) => NutritionalDiaryScreen(), NutritionalPlanScreen.routeName: (ctx) => NutritionalPlanScreen(), + LogMealsScreen.routeName: (ctx) => LogMealsScreen(), LogMealScreen.routeName: (ctx) => LogMealScreen(), WeightScreen.routeName: (ctx) => WeightScreen(), WorkoutPlanScreen.routeName: (ctx) => WorkoutPlanScreen(), diff --git a/lib/screens/log_meal_screen.dart b/lib/screens/log_meal_screen.dart index 158ae8ed..cfae7e50 100644 --- a/lib/screens/log_meal_screen.dart +++ b/lib/screens/log_meal_screen.dart @@ -26,8 +26,9 @@ import 'package:wger/widgets/nutrition/widgets.dart'; class LogMealArguments { final Meal meal; + final bool popTwice; - LogMealArguments(this.meal); + LogMealArguments(this.meal, this.popTwice); } class LogMealScreen extends StatefulWidget { @@ -104,6 +105,9 @@ class _LogMealScreenState extends State { ), ); Navigator.of(context).pop(); + if (args.popTwice) { + Navigator.of(context).pop(); + } }, ), TextButton( diff --git a/lib/screens/log_meals_screen.dart b/lib/screens/log_meals_screen.dart new file mode 100644 index 00000000..70d8dd33 --- /dev/null +++ b/lib/screens/log_meals_screen.dart @@ -0,0 +1,56 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) 2020, 2021 wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:provider/provider.dart'; +import 'package:wger/models/nutrition/meal.dart'; +import 'package:wger/models/nutrition/nutritional_plan.dart'; +import 'package:wger/providers/nutrition.dart'; +import 'package:wger/screens/log_meal_screen.dart'; +import 'package:wger/widgets/nutrition/meal.dart'; +import 'package:wger/widgets/nutrition/widgets.dart'; + +class LogMealsScreen extends StatefulWidget { + static const routeName = '/log-meals'; + + @override + State createState() => _LogMealsScreenState(); +} + +class _LogMealsScreenState extends State { + double portionPct = 100; + + @override + Widget build(BuildContext context) { + final nutritionalPlan = ModalRoute.of(context)!.settings.arguments as NutritionalPlan; + + return Scaffold( + appBar: AppBar( + title: Text('Select a meal to log to diary'), + ), + body: ListView.builder( + itemCount: nutritionalPlan.meals.length, + itemBuilder: (context, index) => MealWidget( + nutritionalPlan.meals[index], + nutritionalPlan.dedupMealItems, + true, + )), + ); + } +} diff --git a/lib/widgets/dashboard/widgets.dart b/lib/widgets/dashboard/widgets.dart index 1f9d4bd8..dcee9b7e 100644 --- a/lib/widgets/dashboard/widgets.dart +++ b/lib/widgets/dashboard/widgets.dart @@ -19,6 +19,7 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_svg_icons/flutter_svg_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -31,6 +32,7 @@ import 'package:wger/providers/user.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/form_screen.dart'; import 'package:wger/screens/gym_mode.dart'; +import 'package:wger/screens/log_meals_screen.dart'; import 'package:wger/screens/measurement_categories_screen.dart'; import 'package:wger/screens/nutritional_plan_screen.dart'; import 'package:wger/screens/weight_screen.dart'; @@ -195,7 +197,7 @@ class _DashboardNutritionWidgetState extends State { ), if (_hasContent) Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( child: Text(AppLocalizations.of(context).goToDetailPage), @@ -204,11 +206,11 @@ class _DashboardNutritionWidgetState extends State { .pushNamed(NutritionalPlanScreen.routeName, arguments: _plan); }, ), + Expanded(child: Container()), IconButton( - icon: const Icon( - Icons.history_edu, - ), - tooltip: AppLocalizations.of(context).logIngredient, + icon: const SvgIcon(icon: SvgIconData('assets/icons/ingredient-diary.svg')), + tooltip: AppLocalizations.of(context) + .logIngredient, // TODO: message should mention *ingredient* onPressed: () { Navigator.pushNamed( context, @@ -221,6 +223,13 @@ class _DashboardNutritionWidgetState extends State { ); }, ), + IconButton( + icon: const SvgIcon(icon: SvgIconData('assets/icons/meal-diary.svg')), + tooltip: 'Save meal to nutrition diary', + onPressed: () { + Navigator.of(context).pushNamed(LogMealsScreen.routeName, arguments: _plan); + }, + ), ], ), ], diff --git a/lib/widgets/nutrition/meal.dart b/lib/widgets/nutrition/meal.dart index e11b6e7c..ff148e76 100644 --- a/lib/widgets/nutrition/meal.dart +++ b/lib/widgets/nutrition/meal.dart @@ -40,10 +40,12 @@ enum viewMode { class MealWidget extends StatefulWidget { final Meal _meal; final List _recentMealItems; + final bool popTwice; const MealWidget( this._meal, this._recentMealItems, + this.popTwice, ); @override @@ -89,6 +91,7 @@ class _MealWidgetState extends State { MealHeader( editing: _editing, toggleEditing: _toggleEditing, + popTwice: widget.popTwice, viewMode: _viewMode, toggleViewMode: _toggleDetails, meal: widget._meal, @@ -278,6 +281,7 @@ class LogDiaryItemWidget extends StatelessWidget { class MealHeader extends StatelessWidget { final Meal _meal; final bool _editing; + final bool popTwice; final viewMode _viewMode; final Function _toggleEditing; final Function _toggleViewMode; @@ -285,6 +289,7 @@ class MealHeader extends StatelessWidget { const MealHeader({ required Meal meal, required bool editing, + this.popTwice = false, required viewMode viewMode, required Function toggleEditing, required Function toggleViewMode, @@ -365,7 +370,7 @@ class MealHeader extends StatelessWidget { ? () { Navigator.of(context).pushNamed( LogMealScreen.routeName, - arguments: LogMealArguments(_meal), + arguments: LogMealArguments(_meal, popTwice), ); } : null, diff --git a/lib/widgets/nutrition/nutritional_plan_detail.dart b/lib/widgets/nutrition/nutritional_plan_detail.dart index cf873904..d77ee4a2 100644 --- a/lib/widgets/nutrition/nutritional_plan_detail.dart +++ b/lib/widgets/nutrition/nutritional_plan_detail.dart @@ -57,10 +57,12 @@ class NutritionalPlanDetailWidget extends StatelessWidget { ..._nutritionalPlan.meals.map((meal) => MealWidget( meal, _nutritionalPlan.dedupMealItems, + false, )), MealWidget( _nutritionalPlan.pseudoMealOthers('Other logs'), _nutritionalPlan.dedupMealItems, + false, ), if (!_nutritionalPlan.onlyLogging) Padding(