WT 1.1.7+2 SearchBar, Timer for ExerciseControl

This commit is contained in:
bossanyit
2021-02-28 17:03:47 +01:00
parent cf348cebb0
commit 6bea5e70e1
77 changed files with 1581 additions and 1008 deletions
+1 -3
View File
@@ -2,12 +2,10 @@ import 'dart:collection';
import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/customer.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+1 -1
View File
@@ -1,7 +1,7 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/custom_exercise_form_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/service/logging.dart';
+4 -4
View File
@@ -2,7 +2,7 @@ import 'dart:collection';
import 'dart:ui';
import 'package:aitrainer_app/bloc/body_type/bodytype_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/trans.dart';
@@ -44,7 +44,7 @@ class _CustomerBodyTypeAnimationPageState extends State<CustomerBodyTypeAnimatio
alignment: Alignment.center,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_black_G_background.jpg'),
image: AssetImage('asset/image/WT_plainblack_background.jpg'),
fit: BoxFit.cover,
alignment: Alignment.topCenter,
),
@@ -445,8 +445,8 @@ class _QuestionState extends State<Question> with TickerProviderStateMixin {
}
void buildAnimation() {
_controller = AnimationController(duration: const Duration(milliseconds: 1000), vsync: this);
_animation = CurvedAnimation(parent: _controller, curve: Curves.slowMiddle);
_controller = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);
_animation = CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn);
_controller.forward();
}
-220
View File
@@ -1,220 +0,0 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/app_bar_progress.dart';
import 'package:aitrainer_app/widgets/dialog_html.dart';
import 'package:badges/badges.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
// ignore: must_be_immutable
class CustomerBodyTypePage extends StatefulWidget {
_CustomerBodyTypePageState _state;
_CustomerBodyTypePageState createState() {
_state = _CustomerBodyTypePageState();
return _state;
}
}
class BodyTypeItem {
static String endomorph = "endomorph";
static String ectomorph = "ectomorph";
static String mesomorph = "mesomorph";
}
class _CustomerBodyTypePageState extends State<CustomerBodyTypePage> with Trans {
String selected;
bool fulldata = false;
@override
Widget build(BuildContext context) {
CustomerRepository customerRepository;
dynamic args = ModalRoute.of(context).settings.arguments;
if (args is HashMap && args['personal_data'] != null) {
fulldata = args['personal_data'];
customerRepository = args['bloc'];
} else {
customerRepository = ModalRoute.of(context).settings.arguments;
}
final double cWidth = MediaQuery.of(context).size.width * 0.75;
setContext(context);
return Scaffold(
appBar: fulldata
? AppBarMin(
back: true,
)
: AppBarProgress(min: 76, max: 100),
body: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_light_background.jpg'),
fit: BoxFit.cover,
alignment: Alignment.center,
),
),
child: BlocProvider(
create: (context) => CustomerChangeBloc(customerRepository: customerRepository),
child: Builder(builder: (context) {
// ignore: close_sinks
CustomerChangeBloc changeBloc = BlocProvider.of<CustomerChangeBloc>(context);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Divider(),
Wrap(
//runAlignment: WrapAlignment.center,
alignment: WrapAlignment.center,
children: [
Text(
t("Your Body Type"),
textAlign: TextAlign.center,
style: TextStyle(color: Colors.orange, fontSize: 42, fontFamily: 'Arial', fontWeight: FontWeight.w900),
)
]),
Divider(),
Badge(
badgeColor: customerRepository.bodyType == BodyTypeItem.ectomorph ? Colors.orange[200] : Colors.blue[50],
badgeContent: GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("Ectomorph"),
htmlData: t("Ectomorph_desc"),
);
})
},
child: Icon(Icons.info_outline_rounded),
),
child: FlatButton(
child: Container(
width: cWidth,
child: Column(
children: [
InkWell(
child: Text(
t("Ectomorph"),
style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900),
),
highlightColor: Colors.white,
),
],
),
),
padding: EdgeInsets.all(10.0),
shape: getShape(customerRepository, BodyTypeItem.ectomorph),
onPressed: () => {
setState(() {
selected = BodyTypeItem.ectomorph;
changeBloc.add(CustomerBodyTypeChange(bodyType: selected));
}),
})),
Divider(),
Badge(
badgeColor: customerRepository.bodyType == BodyTypeItem.endomorph ? Colors.orange : Colors.blue[50],
badgeContent: GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("Endomorph"),
htmlData: t("Endomorph_desc"),
);
})
},
child: Icon(Icons.info_outline_rounded)),
child: FlatButton(
child: Container(
width: cWidth,
child: Column(
children: [
Text(t("Endomorph"),
textWidthBasis: TextWidthBasis.longestLine,
style:
TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900)),
],
)),
padding: EdgeInsets.all(10.0),
shape: getShape(customerRepository, BodyTypeItem.endomorph),
onPressed: () => {
setState(() {
selected = BodyTypeItem.endomorph;
changeBloc.add(CustomerBodyTypeChange(bodyType: selected));
}),
})),
Divider(),
Badge(
badgeColor: customerRepository.bodyType == BodyTypeItem.mesomorph ? Colors.orange[200] : Colors.blue[50],
badgeContent: GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("Mesomorph"),
htmlData: t("Mesomorph_desc"),
);
})
},
child: Icon(Icons.info_outline_rounded),
),
child: FlatButton(
child: Container(
width: cWidth,
child: Column(
children: [
InkWell(
child: Text(
t("Mesomorph"),
style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900),
),
highlightColor: Colors.white,
),
],
),
),
padding: EdgeInsets.all(10.0),
shape: getShape(customerRepository, BodyTypeItem.mesomorph),
onPressed: () => {
setState(() {
selected = BodyTypeItem.mesomorph;
changeBloc.add(CustomerBodyTypeChange(bodyType: selected));
}),
})),
Divider(),
RaisedButton(
color: Colors.orange,
textColor: Colors.white,
child: Text(fulldata ? t("Save") : t("Next")),
onPressed: () => {
changeBloc.add(CustomerSave()),
Navigator.of(context).pop(),
if (fulldata == false) {Navigator.of(context).pushNamed("customerWelcomePage", arguments: customerRepository)}
},
)
],
);
})),
));
}
dynamic getShape(CustomerRepository customerRepository, String fitnessLevel) {
String selected = customerRepository.bodyType;
dynamic returnCode = (selected == fitnessLevel)
? RoundedRectangleBorder(
side: BorderSide(width: 4, color: Colors.orange),
)
: RoundedRectangleBorder(
side: BorderSide(width: 1, color: Colors.blue),
);
//return
return returnCode;
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
import 'package:aitrainer_app/bloc/customer_exercise_device/customer_exercise_device_bloc.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise_device.dart';
import 'package:aitrainer_app/repository/customer_exercise_device_repository.dart';
+1 -1
View File
@@ -1,7 +1,7 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/model/fitness_state.dart';
import 'package:aitrainer_app/util/trans.dart';
+1 -1
View File
@@ -1,7 +1,7 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
+1 -1
View File
@@ -1,4 +1,4 @@
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/util/app_localization.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter/material.dart';
+1 -1
View File
@@ -2,7 +2,7 @@ import 'dart:collection';
import 'dart:ui';
import 'package:aitrainer_app/bloc/result/result_bloc.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise.dart';
import 'package:aitrainer_app/model/exercise_ability.dart';
+144 -135
View File
@@ -1,15 +1,16 @@
import 'dart:collection';
import 'package:aitrainer_app/bloc/exercise_control/exercise_control_bloc.dart';
import 'package:aitrainer_app/bloc/timer/timer_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/dialog_html.dart';
import 'package:aitrainer_app/widgets/number_picker.dart';
import 'package:aitrainer_app/widgets/timer_widget.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -38,9 +39,12 @@ class _ExerciseControlPage extends State<ExerciseControlPage> with Trans {
final double percent = arguments['percent'];
final bool readonly = arguments['readonly'];
setContext(context);
// ignore: close_sinks
TimerBloc timerBloc = BlocProvider.of<TimerBloc>(context);
return BlocProvider(
create: (context) => ExerciseControlBloc(exerciseRepository: exerciseRepository, percentToCalculate: percent, readonly: readonly)
create: (context) => ExerciseControlBloc(
exerciseRepository: exerciseRepository, percentToCalculate: percent, readonly: readonly, timerBloc: timerBloc)
..add(ExerciseControlLoad()),
child: BlocConsumer<ExerciseControlBloc, ExerciseControlState>(listener: (context, state) {
if (state is ExerciseControlError) {
@@ -53,7 +57,7 @@ class _ExerciseControlPage extends State<ExerciseControlPage> with Trans {
_controller.animateTo(exerciseBloc.scrollOffset, duration: Duration(milliseconds: 300), curve: Curves.easeIn);
}
return ModalProgressHUD(
child: getControlForm(exerciseBloc),
child: getControlForm(exerciseBloc, timerBloc),
inAsyncCall: state is ExerciseControlLoading,
opacity: 0.5,
color: Colors.black54,
@@ -62,7 +66,7 @@ class _ExerciseControlPage extends State<ExerciseControlPage> with Trans {
}));
}
Form getControlForm(ExerciseControlBloc exerciseBloc) {
Form getControlForm(ExerciseControlBloc exerciseBloc, TimerBloc timerBloc) {
this.offset = exerciseBloc.scrollOffset;
String exerciseName = AppLanguage().appLocal == Locale("en")
? exerciseBloc.exerciseRepository.exerciseType.name
@@ -84,120 +88,63 @@ class _ExerciseControlPage extends State<ExerciseControlPage> with Trans {
alignment: Alignment.topCenter,
),
),
child: Container(
padding: const EdgeInsets.only(top: 10, left: 25, right: 25),
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
controller: _controller,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
exerciseName,
style: GoogleFonts.archivoBlack(
fontWeight: FontWeight.bold,
fontSize: 24,
color: Colors.white,
shadows: <Shadow>[
Shadow(
offset: Offset(2.0, 2.0),
blurRadius: 6.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 12.0,
color: Colors.black54,
),
],
),
overflow: TextOverflow.fade,
textAlign: TextAlign.center,
maxLines: 2,
softWrap: true,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(t("Your 1RM:"),
style: GoogleFonts.inter(
color: Colors.yellow[300],
fontSize: 18,
shadows: <Shadow>[
Shadow(
offset: Offset(-2.0, -2.0),
blurRadius: 12.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 12.0,
color: Colors.black54,
),
],
)),
Text(
" " +
exerciseBloc.initialRM.toStringAsFixed(0) +
" " +
exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit,
style: GoogleFonts.inter(
color: Colors.yellow[300],
fontSize: 18,
fontWeight: FontWeight.bold,
shadows: <Shadow>[
Shadow(
offset: Offset(-2.0, -2.0),
blurRadius: 6.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 6.0,
color: Colors.black54,
),
],
),
child: Stack(children: [
Container(
padding: const EdgeInsets.only(top: 10, left: 25, right: 25),
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
controller: _controller,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
exerciseName,
style: GoogleFonts.archivoBlack(
fontWeight: FontWeight.bold,
fontSize: 24,
color: Colors.white,
shadows: <Shadow>[
Shadow(
offset: Offset(2.0, 2.0),
blurRadius: 6.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 12.0,
color: Colors.black54,
),
],
),
SizedBox(width: 10),
GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("OneRepMax"),
htmlData: t("OneRepMax_desc"),
);
})
},
child: Icon(CustomIcon.question, color: Colors.yellow[300]))
],
),
Divider(),
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Flexible(
child: Text(t("Why do you need Exercise Control?"),
overflow: TextOverflow.fade,
textAlign: TextAlign.center,
maxLines: 2,
softWrap: true,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Divider(
color: Colors.transparent,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(t("Your 1RM:"),
style: GoogleFonts.inter(
color: Colors.yellow[300],
fontSize: 18,
shadows: <Shadow>[
Shadow(
offset: Offset(2.0, 2.0),
blurRadius: 6.0,
offset: Offset(-2.0, -2.0),
blurRadius: 12.0,
color: Colors.black54,
),
Shadow(
@@ -206,29 +153,91 @@ class _ExerciseControlPage extends State<ExerciseControlPage> with Trans {
color: Colors.black54,
),
],
))),
SizedBox(width: 10),
GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("Control Exercise:"),
htmlData: t("controlexercise_desc"),
);
})
},
child: Icon(CustomIcon.question, color: Colors.yellow[300]))
)),
Text(
" " +
exerciseBloc.initialRM.toStringAsFixed(0) +
" " +
exerciseBloc.exerciseRepository.exerciseType.unitQuantityUnit,
style: GoogleFonts.inter(
color: Colors.yellow[300],
fontSize: 18,
fontWeight: FontWeight.bold,
shadows: <Shadow>[
Shadow(
offset: Offset(-2.0, -2.0),
blurRadius: 6.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 6.0,
color: Colors.black54,
),
],
),
),
SizedBox(width: 10),
GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("OneRepMax"),
htmlData: t("OneRepMax_desc"),
);
})
},
child: Icon(CustomIcon.question, color: Colors.yellow[300]))
],
),
Divider(),
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Flexible(
child: Text(t("Why do you need Exercise Control?"),
style: GoogleFonts.inter(
color: Colors.yellow[300],
fontSize: 18,
shadows: <Shadow>[
Shadow(
offset: Offset(2.0, 2.0),
blurRadius: 6.0,
color: Colors.black54,
),
Shadow(
offset: Offset(-3.0, 3.0),
blurRadius: 12.0,
color: Colors.black54,
),
],
))),
SizedBox(width: 10),
GestureDetector(
onTap: () => {
showDialog(
context: context,
builder: (BuildContext context) {
return DialogHTML(
title: t("Control Exercise:"),
htmlData: t("controlexercise_desc"),
);
})
},
child: Icon(CustomIcon.question, color: Colors.yellow[300]))
]),
Divider(),
numberPickForm(exerciseBloc, 1),
Divider(),
numberPickForm(exerciseBloc, 2),
Divider(),
numberPickForm(exerciseBloc, 3),
]),
Divider(),
numberPickForm(exerciseBloc, 1),
Divider(),
numberPickForm(exerciseBloc, 2),
Divider(),
numberPickForm(exerciseBloc, 3),
]),
))),
)),
TimerWidget(
bloc: timerBloc,
),
])),
//bottomNavigationBar: BottomNavigator(bottomNavIndex: 1),
),
);
+1 -1
View File
@@ -3,7 +3,7 @@ import 'dart:collection';
import 'package:aitrainer_app/bloc/exercise_execute_plan/exercise_execute_plan_bloc.dart';
import 'package:aitrainer_app/bloc/exercise_execute_plan_add/exercise_execute_plan_add_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
+1 -1
View File
@@ -7,7 +7,7 @@ import 'package:aitrainer_app/widgets/dialog_premium.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise.dart';
import 'package:aitrainer_app/model/exercise_type.dart';
+1 -1
View File
@@ -3,7 +3,7 @@ import 'dart:collection';
import 'package:aitrainer_app/bloc/exercise_new/exercise_new_bloc.dart';
import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/model/exercise_ability.dart';
import 'package:aitrainer_app/model/exercise_type.dart';
@@ -2,7 +2,7 @@ import 'dart:collection';
import 'package:aitrainer_app/bloc/exercise_plan/exercise_plan_bloc.dart';
import 'package:aitrainer_app/bloc/exercise_plan_custom_add/exercise_plan_custom_add_bloc.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/workout_menu_tree.dart';
import 'package:aitrainer_app/repository/exercise_plan_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
+1 -1
View File
@@ -1,4 +1,4 @@
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/repository/exercise_repository.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:flutter/cupertino.dart';
+3 -4
View File
@@ -2,7 +2,6 @@ import 'dart:io';
import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/bloc/login/login_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
@@ -183,17 +182,17 @@ class LoginPage extends StatelessWidget with Trans {
),
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[
InkWell(
child: Text(AppLocalizations.of(context).translate('SignUpLink')),
child: Text(t('SignUpLink')),
onTap: () => Navigator.of(context).pushNamed('registration'),
),
Spacer(flex: 2),
InkWell(
child: Text(AppLocalizations.of(context).translate('I forgot the password')),
child: Text(t('I forgot the password')),
onTap: () => Navigator.of(context).pushNamed('resetPassword'),
),
Spacer(flex: 2),
InkWell(
child: Text(AppLocalizations.of(context).translate('Privacy')),
child: Text(t('Privacy')),
onTap: () => {
showDialog(
context: context,
-3
View File
@@ -83,15 +83,12 @@ class _MyDevelopmentMuscleState extends State<MyDevelopmentMusclePage> with Comm
),
backgroundColor: Colors.orange,
));
} else if (state is DevelopmentByMuscleLoadingState) {
//LoadingDialog.show(context);
}
},
builder: (context, state) {
if (state is DevelopmentByMuscleStateInitial) {
return Container();
} else {
//LoadingDialog.hide(context);
return TreeView(
startExpanded: false,
children: _getTreeChildren(bloc.workoutTreeRepository.sortedTree, bloc),
+19
View File
@@ -77,6 +77,25 @@ class _MyDevelopmentPage extends State<MyDevelopmentPage> with Trans {
},
isLocked: true,
),
/* ImageButton(
width: imageWidth,
textAlignment: Alignment.topLeft,
text: t("My Sizes Development"),
style: GoogleFonts.robotoMono(
textStyle: TextStyle(
fontSize: 14, color: Colors.white, fontWeight: FontWeight.bold, backgroundColor: Colors.black54.withOpacity(0.4)),
),
image: "asset/image/testemfejl400x400.jpg",
left: 5,
onTap: () => {
if (Cache().userLoggedIn != null)
{
args['customerId'] = Cache().userLoggedIn.customerId,
Navigator.of(context).pushNamed('mydevelopmentSizesPage', arguments: args)
}
},
isLocked: true,
), */
ImageButton(
width: imageWidth,
textAlignment: Alignment.topLeft,
+196
View File
@@ -0,0 +1,196 @@
import 'package:aitrainer_app/bloc/development_sizes/development_sizes_bloc.dart';
import 'package:aitrainer_app/model/property.dart';
import 'package:aitrainer_app/repository/customer_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_form_bloc/flutter_form_bloc.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import '../widgets/app_bar.dart';
import '../widgets/input_dialog_widget.dart';
class SizesDevelopmentPage extends StatefulWidget {
const SizesDevelopmentPage();
@override
_SizeState createState() => _SizeState();
}
class _SizeState extends State<SizesDevelopmentPage> with Trans {
@override
Widget build(BuildContext context) {
setContext(context);
return BlocProvider(
create: (context) => DevelopmentSizesBloc(customerRepository: CustomerRepository())..add(DevelopmentSizesLoad()),
child: BlocConsumer<DevelopmentSizesBloc, DevelopmentSizesState>(listener: (context, state) {
if (state is DevelopmentSizesError) {
Scaffold.of(context)
.showSnackBar(SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white))));
}
}, builder: (context, state) {
final bloc = BlocProvider.of<DevelopmentSizesBloc>(context);
return ModalProgressHUD(
child: getForm(bloc),
inAsyncCall: state is DevelopmentSizesLoad,
opacity: 0.5,
color: Colors.black54,
progressIndicator: CircularProgressIndicator(),
);
}),
);
}
Widget getForm(DevelopmentSizesBloc bloc) {
return Form(
child: Scaffold(
resizeToAvoidBottomInset: true,
appBar: AppBarNav(depth: 1),
body: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_black_background.jpg'),
fit: BoxFit.fill,
alignment: Alignment.center,
),
),
child: SafeArea(
child: Container(
padding: EdgeInsets.only(top: 10),
child: Column(crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [
Stack(
alignment: Alignment.center,
children: getSizeFigure(bloc),
)
]))),
)));
}
List<Widget> getSizeFigure(DevelopmentSizesBloc bloc) {
double mediaWidth = MediaQuery.of(context).size.width * .8;
double mediaHeight = MediaQuery.of(context).size.height * .8;
bloc.customerRepository.setMediaDimensions(mediaWidth, mediaHeight);
List<Widget> list = List();
list.add(
bloc.isMan
? Image.asset(
"asset/image/man_sizes.png",
height: mediaHeight,
width: mediaWidth,
)
: Image.asset(
"asset/image/woman_sizes.png",
height: mediaHeight,
width: mediaWidth,
),
);
list.add(Positioned(
top: bloc.customerRepository.getWeightCoordinate(bloc.isMan, isTop: true).toDouble(),
left: bloc.customerRepository.getWeightCoordinate(bloc.isMan, isTop: false, isLeft: true).toDouble() - 45,
child: GestureDetector(
//onTap: () => onPressed(bloc.customerRepository.getPropertyByName("Weight")),
child: Image.asset(
"asset/image/merleg.png",
height: 120,
width: 120,
color: Colors.blue,
)),
));
list.addAll(getSizeElements(bloc));
list.add(
Positioned(
top: mediaHeight * .07,
left: bloc.isMan ? mediaWidth * .62 : mediaWidth * .65,
child: Stack(
alignment: Alignment.topLeft,
children: [
SizedBox(height: 80, width: 100),
Text(t("Your Size Diagrams"),
maxLines: 2,
style: GoogleFonts.archivoBlack(
shadows: <Shadow>[
Shadow(
offset: Offset(5.0, 5.0),
blurRadius: 3.0,
color: Colors.black54,
),
],
fontSize: 20,
color: Colors.orange[500],
)),
],
)),
);
return list;
}
List<Widget> getSizeElements(DevelopmentSizesBloc bloc) {
List<Widget> list = List();
bloc.customerRepository.manSizes.forEach((element) {
list.add(
Positioned(
top: element.top.toDouble(),
left: element.left.toDouble(),
child: element.value != 0
? Container(
width: 20,
height: 20,
decoration: BoxDecoration(
color: bloc.isMan ? Colors.green[800] : Color(0xFFEA776C),
borderRadius: BorderRadius.all(
Radius.circular(20),
),
),
padding: EdgeInsets.zero,
child: IconButton(
icon: Icon(Icons.trending_up, color: Colors.green),
padding: EdgeInsets.zero,
color: Colors.red[800],
splashColor: Colors.amber,
onPressed: () => onPressed(element),
))
: Container(
width: 23,
height: 23,
padding: EdgeInsets.zero,
decoration: BoxDecoration(
color: bloc.isMan ? Colors.white10 : Color(0xFFEA776C),
borderRadius: BorderRadius.all(
Radius.circular(23),
),
),
child: IconButton(
icon: Icon(Icons.trending_up, color: Colors.red),
padding: EdgeInsets.zero,
color: Colors.red[800],
splashColor: Colors.amber,
onPressed: () => onPressed(element),
))),
);
});
return list;
}
void onPressed(Property element) {
print(element.propertyName);
showDialog(
context: context,
builder: (context) => InputDialog(
title: t("Size Of Your"),
subtitle: element.propertyNameTranslation,
initialValue: element.value,
onChanged: (value) {
//widget.exerciseBloc.add(ExerciseNewSizeChange(propertyName: element.propertyName, value: value));
},
));
}
}
+2 -3
View File
@@ -2,7 +2,6 @@ import 'dart:io';
import 'package:aitrainer_app/bloc/account/account_bloc.dart';
import 'package:aitrainer_app/bloc/login/login_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
@@ -208,12 +207,12 @@ class RegistrationPage extends StatelessWidget with Trans {
),
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[
InkWell(
child: Text(AppLocalizations.of(context).translate('Login')),
child: Text(t('Login')),
onTap: () => Navigator.of(context).pushNamed('login'),
),
Spacer(flex: 2),
InkWell(
child: Text(AppLocalizations.of(context).translate('Privacy')),
child: Text(t('Privacy')),
onTap: () => {
showDialog(
context: context,
+2 -4
View File
@@ -1,5 +1,4 @@
import 'package:aitrainer_app/bloc/reset_password_bloc.dart';
import 'package:aitrainer_app/localization/app_localization.dart';
import 'package:aitrainer_app/repository/user_repository.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
@@ -77,8 +76,7 @@ class ResetPasswordPage extends StatelessWidget with Trans {
mainAxisAlignment: MainAxisAlignment.start,
children: [
new InkWell(
child: new Text(AppLocalizations.of(context).translate('I forgot the password'),
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 24)),
child: new Text(t('I forgot the password'), style: TextStyle(fontWeight: FontWeight.bold, fontSize: 24)),
),
],
),
@@ -119,7 +117,7 @@ class ResetPasswordPage extends StatelessWidget with Trans {
),
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[
new InkWell(
child: new Text(AppLocalizations.of(context).translate('Login')),
child: new Text(t('Login')),
onTap: () => Navigator.of(context).pushNamed('login'),
),
Spacer(flex: 1),
+1 -1
View File
@@ -1,7 +1,7 @@
import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
import 'package:aitrainer_app/bloc/settings/settings_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/localization/app_language.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/util/trans.dart';