diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5064174 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,92 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change. + +Please note we have a code of conduct, please follow it in all your interactions with the project. + +## Pull Request Process + +1. Ensure any install or build dependencies are removed before the end of the layer when doing a + build. +2. Update the [README.md](README.md) with details of changes to the interface, this includes new environment + variables, exposed ports, useful file locations and container parameters. +3. Increase the version numbers in any examples files and the [README.md](README.md) to the new version that this + Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. + +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [ruidy.nemausat@gmail.com]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..8ae4ed0 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) [2021] [Ruidy] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index c70cdf5..a68c0e8 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,77 @@ Compute and track your Body Mass Index and Body Fat Percentage - [ ] bmi tracker: date, value, graph - [ ] profile: save age, height, genre, local storage - [x] bmi on second screen -- [ ] feedback on genre select +- [x] feedback on genre select -* [doc](https://www.santepratique.fr/nutrition/calcul-imc) +## Getting Started +These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. + +### Prerequisites + +You need a recent version of Flutter. Please follow installation steps for your platform from the official [documentation](https://flutter.dev/docs/get-started/install). + +### Installing + +Clone the repository using + +```shell +git clone https://github.com/rjNemo/bmi_calculator_app.git +``` + +And run the development application with + +```shell +flutter run +``` + +## Running the tests + +Explain how to run the automated tests for this system + +### Break down into end to end tests + +Explain what these tests test and why + +```shell script +Give an example +``` + +### And coding style tests + +Explain what these tests test and why + +```shell script +Give an example +``` + +## Deployment + +Add additional notes about how to deploy this on a live system + +## Built With + +- [Flutter](https://flutter.dev/) - Beautiful native apps in record time + +## Contributing + +Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. + +## Versioning + +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/rjNemo/bmi_calculator_app/tags). + +## Authors + +- **Ruidy** - _Initial work_ - [Ruidy](https://github.com/rjNemo) + +See also the list of [contributors](https://github.com/rjNemo/bmi_calculator_app/contributors) who participated in this project. + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details + +## Acknowledgments + +- [doc](https://www.santepratique.fr/nutrition/calcul-imc) - [design inspiration](https://dribbble.com/shots/13913052-DailyUI-004-Calculator) diff --git a/lib/calculator.dart b/lib/calculator.dart index a9e8c35..dc5ba81 100644 --- a/lib/calculator.dart +++ b/lib/calculator.dart @@ -28,95 +28,98 @@ class _CalculatorPageState extends State { (1.2 * bodyMassIndex() + .23 * _age - 10.8 * _gender - 5.4).round(); @override - Widget build(BuildContext context) => Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: Ink( - decoration: const ShapeDecoration( - color: Colors.lightGreen, - shape: CircleBorder(), - ), - child: IconButton( - icon: const Icon(Icons.female), - tooltip: 'Choose female gender', - onPressed: () { - setState(() => _gender = 0); - }, - color: Colors.white, - ), + Widget build(BuildContext context) { + bool _isWoman = _gender == 0; + + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Ink( + decoration: ShapeDecoration( + color: _isWoman ? Colors.lightGreen : null, + shape: CircleBorder(), + ), + child: IconButton( + icon: Icon(Icons.female), + tooltip: 'Choose female gender', + onPressed: () { + setState(() => _gender = 0); + }, + color: _isWoman ? Colors.white : Colors.lightGreen, ), ), - Expanded( - child: Ink( - decoration: const ShapeDecoration( - color: Colors.lightGreen, - shape: CircleBorder(), - ), - child: IconButton( - icon: const Icon(Icons.male), - tooltip: 'Choose male gender', - onPressed: () { - setState(() => _gender = 1); - }, - color: Colors.white, - ), + ), + Expanded( + child: Ink( + decoration: ShapeDecoration( + color: !_isWoman ? Colors.lightGreen : null, + shape: CircleBorder(), + ), + child: IconButton( + icon: Icon(Icons.male), + tooltip: 'Choose male gender', + onPressed: () { + setState(() => _gender = 1); + }, + color: !_isWoman ? Colors.white : Colors.lightGreen, ), ), - ], - ), - Text('Weight'), - Text("${_weight.round().toString()} kg"), - Slider( - value: _weight, - min: 0, - max: 100, - divisions: 100, - label: _weight.round().toString(), - onChanged: (double value) => setState(() => _weight = value), - ), - Text('Height'), - Text("${_height.round().toString()} cm"), - Slider( - value: _height, - min: 100, - max: 200, - divisions: 100, - label: _height.round().toString(), - onChanged: (double value) => setState(() => _height = value), - ), - Text('Age'), - Text("${_age.round().toString()} years old"), - Slider( - value: _age, - min: 10, - max: 100, - divisions: 100, - label: _age.round().toString(), - onChanged: (double value) => setState(() => _age = value), - ), - ElevatedButton( - onPressed: () { - print( - "BMI: ${bodyMassIndex()}; BFP: ${bodyFatPercentage()}"); - Navigator.pushNamed( - context, - ResultPage.routeName, - arguments: Results(bodyMassIndex(), bodyFatPercentage()), - ); - }, - child: Text('Calculate'), - ), - ], - ), + ), + ], + ), + Text('Weight'), + Text("${_weight.round().toString()} kg"), + Slider( + value: _weight, + min: 0, + max: 100, + divisions: 100, + label: _weight.round().toString(), + onChanged: (double value) => setState(() => _weight = value), + ), + Text('Height'), + Text("${_height.round().toString()} cm"), + Slider( + value: _height, + min: 100, + max: 200, + divisions: 100, + label: _height.round().toString(), + onChanged: (double value) => setState(() => _height = value), + ), + Text('Age'), + Text("${_age.round().toString()} years old"), + Slider( + value: _age, + min: 10, + max: 100, + divisions: 100, + label: _age.round().toString(), + onChanged: (double value) => setState(() => _age = value), + ), + ElevatedButton( + onPressed: () { + print("BMI: ${bodyMassIndex()}; BFP: ${bodyFatPercentage()}"); + Navigator.pushNamed( + context, + ResultPage.routeName, + arguments: Results(bodyMassIndex(), bodyFatPercentage()), + ); + }, + child: Text('Calculate'), + ), + ], ), - ); + ), + ); + } } diff --git a/lib/result.dart b/lib/result.dart index 69fbeda..c04061a 100644 --- a/lib/result.dart +++ b/lib/result.dart @@ -5,6 +5,15 @@ class Results { int bodyFatPercentage; Results(this.bodyMassIndex, this.bodyFatPercentage); + + String category() { + if (bodyMassIndex > 12) { + return "Normal"; + } + return "Too much"; + } + + Icon icon() => Icon(Icons.female); } class ResultPage extends StatelessWidget { @@ -20,15 +29,21 @@ class ResultPage extends StatelessWidget { ), body: Center( child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + results.icon(), // + Text("Below are your results given your height, age and gender."), Text( - "Your results: BMI: ${results.bodyMassIndex}; BFP: ${results.bodyFatPercentage}"), + "Your BMI is ${results.bodyMassIndex}, and your BFP is ${results.bodyFatPercentage}, indicating your weight is in the ${results.category()} for adults of your height.", + ), + Text( + "Maintaining a healthy weight may reduce the risk of chronic diseases associated with overweight and obesity.", + ), ElevatedButton( onPressed: () { Navigator.pop(context); }, - child: Text('Go back!'), + child: Text('Recalculate BMI'), ), ], )),