mirror of
https://github.com/wger-project/flutter.git
synced 2026-02-18 00:17:48 +01:00
Update gym_mode.dart
This commit is contained in:
@@ -15,7 +15,6 @@
|
||||
* 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 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -46,11 +45,9 @@ import 'package:wger/widgets/workouts/forms.dart';
|
||||
class GymMode extends StatefulWidget {
|
||||
final Day _workoutDay;
|
||||
late TimeOfDay _start;
|
||||
|
||||
GymMode(this._workoutDay) {
|
||||
_start = TimeOfDay.now();
|
||||
}
|
||||
|
||||
@override
|
||||
_GymModeState createState() => _GymModeState();
|
||||
}
|
||||
@@ -60,11 +57,9 @@ class _GymModeState extends State<GymMode> {
|
||||
|
||||
/// Map with the first (navigation) page for each exercise
|
||||
Map<String, int> _exercisePages = new Map();
|
||||
|
||||
PageController _controller = PageController(
|
||||
initialPage: 0,
|
||||
);
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
@@ -74,12 +69,10 @@ class _GymModeState extends State<GymMode> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
// Calculate amount of elements for progress indicator
|
||||
for (var set in widget._workoutDay.sets) {
|
||||
_totalElements = _totalElements + set.settingsComputed.length;
|
||||
}
|
||||
|
||||
// Calculate the pages for the navigation
|
||||
//
|
||||
// This duplicates the code below in the getContent method, but it seems to
|
||||
@@ -88,8 +81,8 @@ class _GymModeState extends State<GymMode> {
|
||||
for (var set in widget._workoutDay.sets) {
|
||||
var firstPage = true;
|
||||
for (var setting in set.settingsComputed) {
|
||||
final exercise = Provider.of<ExercisesProvider>(context, listen: false)
|
||||
.findById(setting.exerciseId);
|
||||
final exercise =
|
||||
Provider.of<ExercisesProvider>(context, listen: false).findById(setting.exerciseId);
|
||||
|
||||
if (firstPage) {
|
||||
_exercisePages[exercise.name] = currentPage;
|
||||
@@ -108,10 +101,8 @@ class _GymModeState extends State<GymMode> {
|
||||
|
||||
// Returns the list of exercise overview, sets and pause pages
|
||||
List<Widget> getContent() {
|
||||
final exerciseProvider =
|
||||
Provider.of<ExercisesProvider>(context, listen: false);
|
||||
final workoutProvider =
|
||||
Provider.of<WorkoutPlansProvider>(context, listen: false);
|
||||
final exerciseProvider = Provider.of<ExercisesProvider>(context, listen: false);
|
||||
final workoutProvider = Provider.of<WorkoutPlansProvider>(context, listen: false);
|
||||
var currentElement = 1;
|
||||
List<Widget> out = [];
|
||||
|
||||
@@ -202,10 +193,7 @@ class StartPage extends StatelessWidget {
|
||||
s.exerciseObj.name,
|
||||
style: Theme.of(context).textTheme.headline6,
|
||||
),
|
||||
...set
|
||||
.getSmartRepr(s.exerciseObj)
|
||||
.map((e) => Text(e))
|
||||
.toList(),
|
||||
...set.getSmartRepr(s.exerciseObj).map((e) => Text(e)).toList(),
|
||||
SizedBox(height: 15),
|
||||
],
|
||||
);
|
||||
@@ -220,8 +208,7 @@ class StartPage extends StatelessWidget {
|
||||
ElevatedButton(
|
||||
child: Text(AppLocalizations.of(context).start),
|
||||
onPressed: () {
|
||||
_controller.nextPage(
|
||||
duration: Duration(milliseconds: 200), curve: Curves.bounceIn);
|
||||
_controller.nextPage(duration: Duration(milliseconds: 200), curve: Curves.bounceIn);
|
||||
},
|
||||
),
|
||||
NavigationFooter(
|
||||
@@ -355,8 +342,7 @@ class _LogPageState extends State<LogPage> {
|
||||
),
|
||||
onPressed: () {
|
||||
try {
|
||||
double newValue =
|
||||
double.parse(_weightController.text) - (2 * minPlateWeight);
|
||||
double newValue = double.parse(_weightController.text) - (2 * minPlateWeight);
|
||||
if (newValue > 0) {
|
||||
setState(() {
|
||||
widget._log.weight = newValue;
|
||||
@@ -404,8 +390,7 @@ class _LogPageState extends State<LogPage> {
|
||||
),
|
||||
onPressed: () {
|
||||
try {
|
||||
double newValue =
|
||||
double.parse(_weightController.text) + (2 * minPlateWeight);
|
||||
double newValue = double.parse(_weightController.text) + (2 * minPlateWeight);
|
||||
setState(() {
|
||||
widget._log.weight = newValue;
|
||||
_weightController.text = newValue.toString();
|
||||
@@ -476,8 +461,7 @@ class _LogPageState extends State<LogPage> {
|
||||
|
||||
// Save the entry on the server
|
||||
try {
|
||||
await Provider.of<WorkoutPlansProvider>(context, listen: false)
|
||||
.addLog(widget._log);
|
||||
await Provider.of<WorkoutPlansProvider>(context, listen: false).addLog(widget._log);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
duration: Duration(seconds: 2), // default is 4
|
||||
@@ -511,14 +495,11 @@ class _LogPageState extends State<LogPage> {
|
||||
style: Theme.of(context).textTheme.headline6,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
...widget._workoutPlan
|
||||
.filterLogsByExercise(widget._exercise, unique: true)
|
||||
.map((log) {
|
||||
...widget._workoutPlan.filterLogsByExercise(widget._exercise, unique: true).map((log) {
|
||||
return ListTile(
|
||||
title: Text(log.singleLogRepTextNoNl),
|
||||
subtitle: Text(
|
||||
DateFormat.yMd(Localizations.localeOf(context).languageCode)
|
||||
.format(log.date)),
|
||||
subtitle:
|
||||
Text(DateFormat.yMd(Localizations.localeOf(context).languageCode).format(log.date)),
|
||||
trailing: Icon(Icons.copy),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
@@ -571,8 +552,7 @@ class _LogPageState extends State<LogPage> {
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 3),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 3),
|
||||
child: SizedBox(
|
||||
height: 35,
|
||||
width: 35,
|
||||
@@ -580,8 +560,7 @@ class _LogPageState extends State<LogPage> {
|
||||
alignment: Alignment.center,
|
||||
child: Text(
|
||||
key.toString(),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold),
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -594,8 +573,7 @@ class _LogPageState extends State<LogPage> {
|
||||
.toList()
|
||||
],
|
||||
)
|
||||
: MutedText(
|
||||
AppLocalizations.of(context).plateCalculatorNotDivisible),
|
||||
: MutedText(AppLocalizations.of(context).plateCalculatorNotDivisible),
|
||||
),
|
||||
SizedBox(height: 3),
|
||||
],
|
||||
@@ -625,16 +603,11 @@ class _LogPageState extends State<LogPage> {
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
Expanded(
|
||||
child: (widget._workoutPlan
|
||||
.filterLogsByExercise(widget._exercise)
|
||||
.length >
|
||||
0)
|
||||
child: (widget._workoutPlan.filterLogsByExercise(widget._exercise).length > 0)
|
||||
? getPastLogs()
|
||||
: Container()),
|
||||
// Only show calculator for barbell
|
||||
if (widget._log.exerciseObj.equipment
|
||||
.map((e) => e.id)
|
||||
.contains(ID_EQUIPMENT_BARBELL))
|
||||
if (widget._log.exerciseObj.equipment.map((e) => e.id).contains(ID_EQUIPMENT_BARBELL))
|
||||
getPlates(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 15),
|
||||
@@ -695,9 +668,7 @@ class ExerciseOverview extends StatelessWidget {
|
||||
child: ListView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
children: [
|
||||
..._exercise.images
|
||||
.map((e) => ExerciseImageWidget(image: e))
|
||||
.toList(),
|
||||
..._exercise.images.map((e) => ExerciseImageWidget(image: e)).toList(),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -823,8 +794,7 @@ class _SessionPageState extends State<SessionPage> {
|
||||
onFieldSubmitted: (_) {},
|
||||
onTap: () async {
|
||||
// Stop keyboard from appearing
|
||||
FocusScope.of(context)
|
||||
.requestFocus(new FocusNode());
|
||||
FocusScope.of(context).requestFocus(new FocusNode());
|
||||
|
||||
// Open time picker
|
||||
var pickedTime = await showTimePicker(
|
||||
@@ -833,21 +803,17 @@ class _SessionPageState extends State<SessionPage> {
|
||||
);
|
||||
|
||||
if (pickedTime != null) {
|
||||
timeStartController.text =
|
||||
timeToString(pickedTime)!;
|
||||
timeStartController.text = timeToString(pickedTime)!;
|
||||
}
|
||||
},
|
||||
onSaved: (newValue) {
|
||||
_session.timeStart = stringToTime(newValue);
|
||||
},
|
||||
validator: (_) {
|
||||
TimeOfDay startTime =
|
||||
stringToTime(timeStartController.text);
|
||||
TimeOfDay endTime =
|
||||
stringToTime(timeEndController.text);
|
||||
TimeOfDay startTime = stringToTime(timeStartController.text);
|
||||
TimeOfDay endTime = stringToTime(timeEndController.text);
|
||||
if (startTime.isAfter(endTime)) {
|
||||
return AppLocalizations.of(context)
|
||||
.timeStartAhead;
|
||||
return AppLocalizations.of(context).timeStartAhead;
|
||||
}
|
||||
return null;
|
||||
}),
|
||||
@@ -855,8 +821,8 @@ class _SessionPageState extends State<SessionPage> {
|
||||
SizedBox(width: 10),
|
||||
Flexible(
|
||||
child: TextFormField(
|
||||
decoration: InputDecoration(
|
||||
labelText: AppLocalizations.of(context).timeEnd),
|
||||
decoration:
|
||||
InputDecoration(labelText: AppLocalizations.of(context).timeEnd),
|
||||
controller: timeEndController,
|
||||
onFieldSubmitted: (_) {},
|
||||
onTap: () async {
|
||||
@@ -890,8 +856,7 @@ class _SessionPageState extends State<SessionPage> {
|
||||
|
||||
// Save the entry on the server
|
||||
try {
|
||||
await Provider.of<WorkoutPlansProvider>(context,
|
||||
listen: false)
|
||||
await Provider.of<WorkoutPlansProvider>(context, listen: false)
|
||||
.addSession(_session);
|
||||
Navigator.of(context).pop();
|
||||
} on WgerHttpException catch (error) {
|
||||
@@ -984,10 +949,7 @@ class _TimerWidgetState extends State<TimerWidget> {
|
||||
child: Center(
|
||||
child: Text(
|
||||
DateFormat('m:ss').format(today.add(Duration(seconds: _seconds))),
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.headline1!
|
||||
.copyWith(color: wgerPrimaryColor),
|
||||
style: Theme.of(context).textTheme.headline1!.copyWith(color: wgerPrimaryColor),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user