From 48ec2edbb329ecf084ac5db5bef3fe2973b96fdc Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Fri, 15 Apr 2022 13:03:35 +0200 Subject: [PATCH] Cleanup app bars The dashboard has the main app bar that allows to change the settings, while each screen has its own with custom actions --- lib/l10n/app_en.arb | 2 + lib/screens/add_exercise_screen.dart | 4 +- lib/screens/dashboard.dart | 2 +- lib/screens/exercises_screen.dart | 2 +- lib/screens/gallery_screen.dart | 3 +- lib/screens/home_tabs_screen.dart | 5 +- lib/screens/nutritional_plans_screen.dart | 2 +- lib/screens/weight_screen.dart | 2 +- lib/screens/workout_plans_screen.dart | 7 +-- lib/widgets/core/app_bar.dart | 22 +++++++- lib/widgets/exercises/filter_row.dart | 2 +- lib/widgets/workouts/app_bar.dart | 62 +++++++++++++++++++++++ 12 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 lib/widgets/workouts/app_bar.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2f1c2fbd..3868b8f8 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -100,6 +100,7 @@ "@successfullySaved": { "description": "Message when an item was successfully saved" }, + "exerciseList": "Exercise list", "exercise": "Exercise", "@exercise": { "description": "An exercise for a workout" @@ -584,6 +585,7 @@ "images": "Images", "language": "Language", "addExercise": "Add exercise", + "contributeExercise": "Contribute an exercise", "translation": "Translation", "translateExercise": "Translate this exercise now", "baseData": "Basics in English", diff --git a/lib/screens/add_exercise_screen.dart b/lib/screens/add_exercise_screen.dart index 56cafe32..ba285eec 100644 --- a/lib/screens/add_exercise_screen.dart +++ b/lib/screens/add_exercise_screen.dart @@ -70,9 +70,7 @@ class _AddExerciseScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar( - AppLocalizations.of(context).addExercise, - ), + appBar: EmptyAppBar(AppLocalizations.of(context).contributeExercise), body: Stepper( controlsBuilder: _controlsBuilder, steps: [ diff --git a/lib/screens/dashboard.dart b/lib/screens/dashboard.dart index c397c5b5..4f82d8da 100644 --- a/lib/screens/dashboard.dart +++ b/lib/screens/dashboard.dart @@ -34,7 +34,7 @@ class _DashboardScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar(AppLocalizations.of(context).labelDashboard), + appBar: MainAppBar(AppLocalizations.of(context).labelDashboard), body: SingleChildScrollView( child: Column( children: [ diff --git a/lib/screens/exercises_screen.dart b/lib/screens/exercises_screen.dart index 199e5e32..6bf72cb8 100644 --- a/lib/screens/exercises_screen.dart +++ b/lib/screens/exercises_screen.dart @@ -24,7 +24,7 @@ class _ExercisesScreenState extends State { final exercisesList = Provider.of(context).filteredExerciseBases; return Scaffold( - appBar: WgerAppBar(AppLocalizations.of(context).exercises), + appBar: EmptyAppBar(AppLocalizations.of(context).exercises), body: Column( children: [ FilterRow(), diff --git a/lib/screens/gallery_screen.dart b/lib/screens/gallery_screen.dart index 4a32589c..3dbebc7b 100644 --- a/lib/screens/gallery_screen.dart +++ b/lib/screens/gallery_screen.dart @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; @@ -35,7 +34,7 @@ class GalleryScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar(AppLocalizations.of(context).gallery), + appBar: EmptyAppBar(AppLocalizations.of(context).gallery), floatingActionButton: FloatingActionButton( child: const Icon(Icons.add), onPressed: () { diff --git a/lib/screens/home_tabs_screen.dart b/lib/screens/home_tabs_screen.dart index a8e705f4..48389d86 100644 --- a/lib/screens/home_tabs_screen.dart +++ b/lib/screens/home_tabs_screen.dart @@ -31,8 +31,8 @@ import 'package:wger/providers/measurement.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/dashboard.dart'; -import 'package:wger/screens/exercises_screen.dart'; import 'package:wger/screens/gallery_screen.dart'; +import 'package:wger/screens/nutritional_plans_screen.dart'; import 'package:wger/screens/weight_screen.dart'; import 'package:wger/screens/workout_plans_screen.dart'; import 'package:wger/theme/theme.dart'; @@ -64,8 +64,7 @@ class _HomeTabsScreenState extends State with SingleTickerProvid final _screenList = [ DashboardScreen(), WorkoutPlansScreen(), - // Replaced [NutritionScreen] for debugging purposes - ExercisesScreen(), + NutritionScreen(), WeightScreen(), const GalleryScreen(), ]; diff --git a/lib/screens/nutritional_plans_screen.dart b/lib/screens/nutritional_plans_screen.dart index 5ca0a419..ecc67077 100644 --- a/lib/screens/nutritional_plans_screen.dart +++ b/lib/screens/nutritional_plans_screen.dart @@ -31,7 +31,7 @@ class NutritionScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar(AppLocalizations.of(context).nutritionalPlans), + appBar: EmptyAppBar(AppLocalizations.of(context).nutritionalPlans), floatingActionButton: FloatingActionButton( child: const Icon(Icons.add), onPressed: () async { diff --git a/lib/screens/weight_screen.dart b/lib/screens/weight_screen.dart index 1b8f8fa5..385ae768 100644 --- a/lib/screens/weight_screen.dart +++ b/lib/screens/weight_screen.dart @@ -31,7 +31,7 @@ class WeightScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar(AppLocalizations.of(context).weight), + appBar: EmptyAppBar(AppLocalizations.of(context).weight), floatingActionButton: FloatingActionButton( child: const Icon(Icons.add), onPressed: () async { diff --git a/lib/screens/workout_plans_screen.dart b/lib/screens/workout_plans_screen.dart index a4412581..4d3dbfdf 100644 --- a/lib/screens/workout_plans_screen.dart +++ b/lib/screens/workout_plans_screen.dart @@ -16,14 +16,13 @@ * along with this program. If not, see . */ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:wger/models/workouts/workout_plan.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/form_screen.dart'; -import 'package:wger/widgets/core/app_bar.dart'; +import 'package:wger/widgets/workouts/app_bar.dart'; import 'package:wger/widgets/workouts/forms.dart'; import 'package:wger/widgets/workouts/workout_plans_list.dart'; @@ -33,9 +32,7 @@ class WorkoutPlansScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: WgerAppBar( - AppLocalizations.of(context).labelWorkoutPlans, - ), + appBar: WorkoutOverviewAppBar(), floatingActionButton: FloatingActionButton( child: const Icon(Icons.add), onPressed: () { diff --git a/lib/widgets/core/app_bar.dart b/lib/widgets/core/app_bar.dart index b7bddf51..5311f681 100644 --- a/lib/widgets/core/app_bar.dart +++ b/lib/widgets/core/app_bar.dart @@ -27,10 +27,10 @@ import 'package:wger/providers/nutrition.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/widgets/core/about.dart'; -class WgerAppBar extends StatelessWidget with PreferredSizeWidget { +class MainAppBar extends StatelessWidget with PreferredSizeWidget { final String _title; - WgerAppBar(this._title); + MainAppBar(this._title); @override Widget build(BuildContext context) { @@ -86,3 +86,21 @@ class WgerAppBar extends StatelessWidget with PreferredSizeWidget { @override Size get preferredSize => const Size.fromHeight(kToolbarHeight); } + +/// App bar that only displays a title +class EmptyAppBar extends StatelessWidget with PreferredSizeWidget { + final String _title; + + EmptyAppBar(this._title); + + @override + Widget build(BuildContext context) { + return AppBar( + title: Text(_title), + actions: const [], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} diff --git a/lib/widgets/exercises/filter_row.dart b/lib/widgets/exercises/filter_row.dart index 433e7e09..8fb4c5ea 100644 --- a/lib/widgets/exercises/filter_row.dart +++ b/lib/widgets/exercises/filter_row.dart @@ -89,7 +89,7 @@ class _FilterRowState extends State { itemBuilder: (context) { return [ PopupMenuItem( - child: Text(AppLocalizations.of(context).addExercise), + child: Text(AppLocalizations.of(context).contributeExercise), value: ExerciseMoreOption.ADD_EXERCISE, ) ]; diff --git a/lib/widgets/workouts/app_bar.dart b/lib/widgets/workouts/app_bar.dart new file mode 100644 index 00000000..ab8bd148 --- /dev/null +++ b/lib/widgets/workouts/app_bar.dart @@ -0,0 +1,62 @@ +/* + * 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. + * + * This program 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:wger/screens/add_exercise_screen.dart'; +import 'package:wger/screens/exercises_screen.dart'; + +enum _WorkoutAppBarOptions { + list, + contribute, +} + +class WorkoutOverviewAppBar extends StatelessWidget with PreferredSizeWidget { + @override + Widget build(BuildContext context) { + return AppBar( + title: Text(AppLocalizations.of(context).labelWorkoutPlans), + actions: [ + PopupMenuButton(itemBuilder: (context) { + return [ + PopupMenuItem<_WorkoutAppBarOptions>( + value: _WorkoutAppBarOptions.list, + child: Text(AppLocalizations.of(context).exerciseList), + ), + PopupMenuItem<_WorkoutAppBarOptions>( + value: _WorkoutAppBarOptions.contribute, + child: Text(AppLocalizations.of(context).contributeExercise), + ), + ]; + }, onSelected: (value) { + switch (value) { + case _WorkoutAppBarOptions.contribute: + Navigator.of(context).pushNamed(AddExerciseScreen.routeName); + break; + case _WorkoutAppBarOptions.list: + Navigator.of(context).pushNamed(ExercisesScreen.routeName); + break; + } + }), + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +}