@@ -21,7 +21,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
21
21
import 'package:flutter_svg_icons/flutter_svg_icons.dart' ;
22
22
import 'package:provider/provider.dart' ;
23
23
import 'package:wger/helpers/consts.dart' ;
24
- import 'package:wger/models/nutrition/log.dart' ;
25
24
import 'package:wger/models/nutrition/meal.dart' ;
26
25
import 'package:wger/models/nutrition/meal_item.dart' ;
27
26
import 'package:wger/providers/nutrition.dart' ;
@@ -30,6 +29,8 @@ import 'package:wger/screens/log_meal_screen.dart';
30
29
import 'package:wger/widgets/nutrition/charts.dart' ;
31
30
import 'package:wger/widgets/nutrition/forms.dart' ;
32
31
import 'package:wger/widgets/nutrition/helpers.dart' ;
32
+ import 'package:wger/widgets/nutrition/nutrition_tile.dart' ;
33
+ import 'package:wger/widgets/nutrition/nutrition_tiles.dart' ;
33
34
import 'package:wger/widgets/nutrition/widgets.dart' ;
34
35
35
36
enum viewMode {
@@ -157,15 +158,33 @@ class _MealWidgetState extends State<MealWidget> {
157
158
)),
158
159
if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails)
159
160
const Divider (),
160
- if (_viewMode == viewMode.withAllDetails) const NutritionDiaryheader (),
161
+ if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails)
162
+ const DiaryheaderTile (),
161
163
if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails)
162
164
if (widget._meal.mealItems.isEmpty && widget._meal.isRealMeal)
163
- const ListTile (title: Text ('No ingredients defined yet' ))
165
+ NutritionTile (
166
+ title: Text (
167
+ AppLocalizations .of (context).noIngredientsDefined,
168
+ textAlign: TextAlign .left,
169
+ ))
164
170
else
165
- ...widget._meal.mealItems.map ((item) => MealItemWidget (item, _viewMode, _editing)),
171
+ ...widget._meal.mealItems
172
+ .map ((item) => MealItemEditableFullTile (item, _viewMode, _editing)),
173
+ if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails)
174
+ const Divider (),
175
+ if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails)
176
+ NutritionTile (
177
+ vPadding: 0 ,
178
+ leading: const Text ('total' ),
179
+ title: getNutritionRow (
180
+ context,
181
+ muted (getNutritionalValues (widget._meal.plannedNutritionalValues, context)),
182
+ ),
183
+ ),
166
184
if (_viewMode == viewMode.withAllDetails)
167
185
Column (
168
186
children: [
187
+ const Divider (),
169
188
Center (
170
189
child: Text (
171
190
AppLocalizations .of (context).loggedToday,
@@ -181,7 +200,7 @@ class _MealWidgetState extends State<MealWidget> {
181
200
padding: const EdgeInsets .all (8.0 ),
182
201
child: Column (
183
202
children: [
184
- NutritionDiaryEntry (diaryEntry: item),
203
+ DiaryEntryTile (diaryEntry: item),
185
204
],
186
205
),
187
206
)),
@@ -194,12 +213,13 @@ class _MealWidgetState extends State<MealWidget> {
194
213
}
195
214
}
196
215
197
- class MealItemWidget extends StatelessWidget {
216
+ /// An editable NutritionTile showing the avatar, name, nutritional values
217
+ class MealItemEditableFullTile extends StatelessWidget {
198
218
final bool _editing;
199
219
final viewMode _viewMode;
200
220
final MealItem _item;
201
221
202
- const MealItemWidget (this ._item, this ._viewMode, this ._editing);
222
+ const MealItemEditableFullTile (this ._item, this ._viewMode, this ._editing);
203
223
204
224
@override
205
225
Widget build (BuildContext context) {
@@ -213,22 +233,24 @@ class MealItemWidget extends StatelessWidget {
213
233
final String unit = AppLocalizations .of (context).g;
214
234
final values = _item.nutritionalValues;
215
235
216
- return ListTile (
236
+ return NutritionTile (
217
237
leading: IngredientAvatar (ingredient: _item.ingredient),
218
- title: Text (
219
- '${_item .amount .toStringAsFixed (0 )}$unit ${_item .ingredient .name }' ,
220
- overflow: TextOverflow .ellipsis,
221
- ),
222
- subtitle: Row (
223
- mainAxisAlignment: MainAxisAlignment .spaceBetween,
238
+ title: Row (
224
239
mainAxisSize: MainAxisSize .max,
225
240
children: [
226
- if (_viewMode == viewMode.withAllDetails) ...getMutedNutritionalValues (values, context)
241
+ Text (
242
+ '${_item .amount .toStringAsFixed (0 )}$unit ${_item .ingredient .name }' ,
243
+ overflow: TextOverflow .ellipsis,
244
+ textAlign: TextAlign .left,
245
+ ),
227
246
],
228
247
),
248
+ subtitle: (_viewMode != viewMode.withAllDetails && ! _editing)
249
+ ? null
250
+ : getNutritionRow (context, muted (getNutritionalValues (values, context))),
229
251
trailing: _editing
230
252
? IconButton (
231
- icon: const Icon (Icons .delete),
253
+ icon: const Icon (Icons .delete, size : ICON_SIZE_SMALL ),
232
254
tooltip: AppLocalizations .of (context).delete,
233
255
iconSize: ICON_SIZE_SMALL ,
234
256
onPressed: () {
@@ -250,38 +272,6 @@ class MealItemWidget extends StatelessWidget {
250
272
}
251
273
}
252
274
253
- class LogDiaryItemWidget extends StatelessWidget {
254
- final Log _item;
255
-
256
- const LogDiaryItemWidget (this ._item);
257
-
258
- @override
259
- Widget build (BuildContext context) {
260
- // TODO(x): add real support for weight units
261
- /*
262
- String unit = _item.weightUnitId == null
263
- ? AppLocalizations.of(context).g
264
- : _item.weightUnitObj!.weightUnit.name;
265
-
266
- */
267
- final String unit = AppLocalizations .of (context).g;
268
- final values = _item.nutritionalValues;
269
-
270
- return ListTile (
271
- leading: IngredientAvatar (ingredient: _item.ingredient),
272
- title: Text (
273
- '${_item .amount .toStringAsFixed (0 )}$unit ${_item .ingredient .name }' ,
274
- overflow: TextOverflow .ellipsis,
275
- ),
276
- subtitle: Row (
277
- mainAxisAlignment: MainAxisAlignment .spaceBetween,
278
- mainAxisSize: MainAxisSize .max,
279
- children: [...getMutedNutritionalValues (values, context)],
280
- ),
281
- );
282
- }
283
- }
284
-
285
275
class MealHeader extends StatelessWidget {
286
276
final Meal _meal;
287
277
final bool _editing;
0 commit comments