Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plate 46 calc #688

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"dart.lineLength": 100,
"diffEditor.ignoreTrimWhitespace": true,
"cmake.sourceDirectory": "/Users/ayush/flutter/linux",
}
1 change: 1 addition & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
- Thilina Herath - <https://github.com/ThilinaTCH>
- Marko Milosevic - <https://github.com/TaarnStar>
- Karthik Reddy (Axel) - <https://github.com/AxelBlaz3>
- Ayush Sourav Jagaty - <https://github.com/AyushJagaty>
- Ogundoyin Toluwani - <https://github.com/Tolu007>
- Nenza Nurfirmansyah - <https://github.com/nenzan>
- Florian Schmitz - <https://github.com/floodoo>
Expand Down
2 changes: 1 addition & 1 deletion ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048

COCOAPODS: 1.16.0
COCOAPODS: 1.15.2
13 changes: 13 additions & 0 deletions lib/helpers/exercises/plate_configurator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';

class PlateConfiguration extends ChangeNotifier {
//olympic standard weights
List<double> _plateWeights = [1.25, 2.5, 5, 10, 15, 20, 25];

List<double> get plateWeights => _plateWeights;

void setPlateWeights(List<double> weights) {
_plateWeights = weights;
notifyListeners();
}
}
1 change: 0 additions & 1 deletion lib/helpers/gym_mode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
/// Calculates the number of plates needed to reach a specific weight
List<num> plateCalculator(num totalWeight, num barWeight, List<num> plates) {
final List<num> ans = [];

// Weight is less than the bar
if (totalWeight < barWeight) {
return [];
Expand Down
1 change: 1 addition & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"@passwordTooShort": {
"description": "Error message when the user a password that is too short"
},
"selectAvailablePlates": "Select Available Plates",
"password": "Password",
"@password": {},
"confirmPassword": "Confirm password",
Expand Down
6 changes: 3 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
* 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 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:wger/core/locator.dart';
import 'package:wger/providers/add_exercise.dart';
import 'package:wger/providers/base_provider.dart';
Expand All @@ -27,6 +27,7 @@ import 'package:wger/providers/exercises.dart';
import 'package:wger/providers/gallery.dart';
import 'package:wger/providers/measurement.dart';
import 'package:wger/providers/nutrition.dart';
import 'package:wger/providers/plate_weights.dart';
import 'package:wger/providers/user.dart';
import 'package:wger/providers/workout_plans.dart';
import 'package:wger/screens/add_exercise_screen.dart';
Expand Down Expand Up @@ -57,10 +58,8 @@ import 'providers/auth.dart';

void main() async {
//zx.setLogEnabled(kDebugMode);

// Needs to be called before runApp
WidgetsFlutterBinding.ensureInitialized();

// Locator to initialize exerciseDB
await ServiceLocator().configure();
// Application
Expand All @@ -73,6 +72,7 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context)=> PlateWeights()),
ChangeNotifierProvider(create: (ctx) => AuthProvider()),
ChangeNotifierProxyProvider<AuthProvider, ExercisesProvider>(
create: (context) => ExercisesProvider(
Expand Down
105 changes: 105 additions & 0 deletions lib/providers/plate_weights.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import 'dart:convert';
import 'package:flutter/widgets.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:wger/helpers/gym_mode.dart';

class PlateWeights extends ChangeNotifier{
bool isMetric = true;
bool plateChoiceExists = false;
bool loadedFromSharedPref = false;
num totalWeight = 0;
num barWeight = 20;
num convertTolbs = 2.205;
num totalWeightInKg = 0;
num barWeightInKg = 20;
List<num> selectedWeights = [];
List<num> kgWeights = [1.25, 2.5, 5, 10, 15, 20, 25];
List<num> lbsWeights = [2.5, 5, 10, 25, 35, 45];
List<num> customPlates = [];
late Map<num,int> grouped;
List<num> get data => selectedWeights;
set data(List<num> newData){
selectedWeights = newData;
//saving data to shared preference
saveIntoSharedPrefs();
notifyListeners();
}
Future<void> saveIntoSharedPrefs() async{
final pref = await SharedPreferences.getInstance();
//converting List Weights to String
final String selectedPlates = jsonEncode(selectedWeights);
pref.setString('selectedPlates', selectedPlates);
notifyListeners();
}

void readPlates() async{
final pref = await SharedPreferences.getInstance();
final platePrefData = pref.getString('selectedPlates');
if(platePrefData != null){
try{
final plateData = json.decode(platePrefData);
if(plateData is List){
selectedWeights = plateData.cast<num>();
}else{
throw const FormatException('Not a List');
}
}catch(e){
selectedWeights = [];
}
}
print('loaded');
notifyListeners();
}

Future<void> toggleSelection(num x) async{
if(selectedWeights.contains(x)) {
selectedWeights.remove(x);
}else {
selectedWeights.add(x);
}
final prefs = await SharedPreferences.getInstance();
prefs.setString('selectedPlates',jsonEncode(selectedWeights));
notifyListeners();
}

void unitChange() {
if(isMetric==false) {
totalWeight = totalWeightInKg;
isMetric = true;
barWeight = barWeightInKg;
} else {
isMetric = false;
totalWeight = totalWeightInKg*2.205;
barWeight = barWeightInKg*2.205;
}
notifyListeners();
}

void clear() async{
selectedWeights.clear();
final prefs = await SharedPreferences.getInstance();
prefs.setString('selectedPlates',jsonEncode(selectedWeights));
notifyListeners();
}

void setWeight(num x) {
totalWeight = x;
totalWeightInKg=x;
notifyListeners();
}

void calculatePlates() {
selectedWeights.sort();
customPlates = plateCalculator(totalWeight,barWeight,selectedWeights);
grouped = groupPlates(customPlates);
notifyListeners();
}

void resetPlates() async{
selectedWeights = [];
final prefs = await SharedPreferences.getInstance();
prefs.setString('selectedPlates',jsonEncode(selectedWeights));
notifyListeners();
}

}
12 changes: 11 additions & 1 deletion lib/providers/user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:path/path.dart';
import 'package:wger/models/user/profile.dart';
import 'package:wger/providers/base_provider.dart';

Expand All @@ -35,7 +37,15 @@ class UserProvider with ChangeNotifier {
void clear() {
profile = null;
}

// change the unit of plates
void unitChange(){
if(profile?.weightUnitStr == 'kg'){
profile?.weightUnitStr = 'lb';
}else{
profile?.weightUnitStr = 'kg';
}
ChangeNotifier();
}
/// Fetch the current user's profile
Future<void> fetchAndSetProfile() async {
final userData = await baseProvider.fetch(baseProvider.makeUrl(PROFILE_URL));
Expand Down
174 changes: 174 additions & 0 deletions lib/screens/add_plate_weights.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:provider/provider.dart';
import 'package:wger/providers/plate_weights.dart';
import 'package:wger/providers/user.dart';

class AddPlateWeights extends StatefulWidget {
const AddPlateWeights({super.key});

@override
State<AddPlateWeights> createState() => _AddPlateWeightsState();
}

class _AddPlateWeightsState extends State<AddPlateWeights> with SingleTickerProviderStateMixin{
late AnimationController _controller;
late Animation<Offset> _animation;

@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_){
Provider.of<PlateWeights>(context,listen: false).readPlates();
});
_controller = AnimationController(
vsync: this,
duration: Duration(seconds: 1),
);
_animation = Tween<Offset>(
begin: const Offset(-1.0, 0.0), // Start off-screen
end: const Offset(0.0, 0.0), // End at original position
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
));

_controller.forward(); // Start the animation
}

@override
void dispose() {
_controller.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
bool unit = true;
return Consumer2<PlateWeights,UserProvider> (
builder:(context,plateProvider,userProvider,child)=> Scaffold (
appBar: AppBar (
title: const Text('Select Available Plates'),
),
body: Column (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make sure there is enough margin on the right side of the screen as well (or wrap around if there's not enough space). Also I would name the dropdown something like "preferred unit". If you want, you can extract this info from the profile from the UserProvider (the isMetric).

Bildschirmfoto 2024-12-12 um 13 02 35

children: [
Row (
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Preferred Unit'),
DropdownButton (
onChanged: (newValue){
plateProvider.clear();
if(newValue=='kg') {
unit = true;
} else {
unit = false;
}
print(unit);
if(unit != userProvider.profile?.isMetric) {
userProvider.unitChange();
//plateProvider.unitChange();
_controller.reset();
_controller.forward();
}
},
items: ['kg','lbs'].map((unit){
return DropdownMenuItem<String> (
value: unit,
child: Text(unit),
);
}).toList(),
),
],
),
SingleChildScrollView (
scrollDirection: Axis.horizontal,
child: Row (
children: (userProvider.profile?.weightUnitStr == 'kg')
? plateProvider.kgWeights.map((number) {
return SlideTransition(
position: _animation,
child: GestureDetector(
onTap: () => plateProvider.toggleSelection(number),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container (
margin: const EdgeInsets.all(8),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration (
color: plateProvider.selectedWeights.contains(number)
? const Color.fromARGB(255, 82, 226, 236)
: const Color.fromARGB(255, 97, 105, 101),
borderRadius: BorderRadius.circular(10),
),
child: Text (
'$number kg', // Add unit to text
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
),
),
);
}).toList()
: plateProvider.lbsWeights.map((number) {
return SlideTransition(
position: _animation,
child: GestureDetector(
onTap: () => plateProvider.toggleSelection(number),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.all(8),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration (
color: plateProvider.selectedWeights.contains(number)
? const Color.fromARGB(255, 82, 226, 236)
: const Color.fromARGB(255, 97, 105, 101),
borderRadius: BorderRadius.circular(10),
),
child: Text (
'$number lbs', // Add unit to text
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
),
),
);
}).toList(),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: (){
plateProvider.saveIntoSharedPrefs();
if(plateProvider.selectedWeights.isNotEmpty){
plateProvider.plateChoiceExists=true;
plateProvider.calculatePlates();
}
Navigator.pop(context);
},
child: const Text('Done'),
),
ElevatedButton(
onPressed: (){
plateProvider.resetPlates();
},
child: const Text('Reset',style: TextStyle(color: Colors.red,fontWeight: FontWeight.bold))
),
],
),
]
),
),
);
}
}
Loading