log meals page + new 'log {meal,ingredient} to diary' dashboard buttons

This commit is contained in:
Dieter Plaetinck
2024-06-01 21:44:56 +02:00
parent fe2cc30675
commit 3922549be8
6 changed files with 85 additions and 7 deletions

View File

@@ -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(),

View File

@@ -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<LogMealScreen> {
),
);
Navigator.of(context).pop();
if (args.popTwice) {
Navigator.of(context).pop();
}
},
),
TextButton(

View File

@@ -0,0 +1,56 @@
/*
* This file is part of wger Workout Manager <https://github.com/wger-project>.
* 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 <http://www.gnu.org/licenses/>.
*/
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<LogMealsScreen> createState() => _LogMealsScreenState();
}
class _LogMealsScreenState extends State<LogMealsScreen> {
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,
)),
);
}
}

View File

@@ -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<DashboardNutritionWidget> {
),
if (_hasContent)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
TextButton(
child: Text(AppLocalizations.of(context).goToDetailPage),
@@ -204,11 +206,11 @@ class _DashboardNutritionWidgetState extends State<DashboardNutritionWidget> {
.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<DashboardNutritionWidget> {
);
},
),
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);
},
),
],
),
],

View File

@@ -40,10 +40,12 @@ enum viewMode {
class MealWidget extends StatefulWidget {
final Meal _meal;
final List<MealItem> _recentMealItems;
final bool popTwice;
const MealWidget(
this._meal,
this._recentMealItems,
this.popTwice,
);
@override
@@ -89,6 +91,7 @@ class _MealWidgetState extends State<MealWidget> {
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,

View File

@@ -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(