mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
log meals page + new 'log {meal,ingredient} to diary' dashboard buttons
This commit is contained in:
@@ -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(),
|
||||
|
||||
@@ -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(
|
||||
|
||||
56
lib/screens/log_meals_screen.dart
Normal file
56
lib/screens/log_meals_screen.dart
Normal 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,
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user