From 03eaa16842f02fca4245318f6d81c81658580aa2 Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Fri, 7 Apr 2023 11:50:02 +1200 Subject: [PATCH] Split up routes --- .vim/coc-settings.json | 1 + lib/best_page.dart | 17 ++++ lib/edit_set.dart | 86 +++++++++++++++++++++ lib/home_page.dart | 172 +++++++++++++++++++++++++++++++++++++++++ lib/main.dart | 136 +++++++------------------------- lib/plans_page.dart | 17 ++++ lib/settings_page.dart | 17 ++++ lib/timer_page.dart | 17 ++++ lib/workouts_page.dart | 17 ++++ test/widget_test.dart | 3 +- 10 files changed, 372 insertions(+), 111 deletions(-) create mode 100644 .vim/coc-settings.json create mode 100644 lib/best_page.dart create mode 100644 lib/edit_set.dart create mode 100644 lib/home_page.dart create mode 100644 lib/plans_page.dart create mode 100644 lib/settings_page.dart create mode 100644 lib/timer_page.dart create mode 100644 lib/workouts_page.dart diff --git a/.vim/coc-settings.json b/.vim/coc-settings.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.vim/coc-settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lib/best_page.dart b/lib/best_page.dart new file mode 100644 index 0000000..7ebe945 --- /dev/null +++ b/lib/best_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class BestPage extends StatelessWidget { + const BestPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Best'), + ), + body: const Center( + child: Text('Welcome to the Best Page!'), + ), + ); + } +} diff --git a/lib/edit_set.dart b/lib/edit_set.dart new file mode 100644 index 0000000..d3ab393 --- /dev/null +++ b/lib/edit_set.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:fmassive/home_page.dart'; + +class EditGymSetPage extends StatefulWidget { + final GymSet gymSet; + + EditGymSetPage({required this.gymSet}); + + @override + _EditGymSetPageState createState() => _EditGymSetPageState(); +} + +class _EditGymSetPageState extends State { + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _repsController = TextEditingController(); + final TextEditingController _weightController = TextEditingController(); + + late GymSet _editedGymSet; + + @override + void initState() { + super.initState(); + // Initialize the edited GymSet object with the values from the input GymSet object + _editedGymSet = GymSet( + name: widget.gymSet.name, + reps: widget.gymSet.reps, + weight: widget.gymSet.weight, + created: DateTime.now()); + // Set the text controller values + _nameController.text = _editedGymSet.name; + _repsController.text = _editedGymSet.reps.toString(); + _weightController.text = _editedGymSet.weight.toString(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Edit Gym Set'), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextFormField( + controller: _nameController, + decoration: const InputDecoration(labelText: 'Name'), + onChanged: (value) { + setState(() { + _editedGymSet.name = value; + }); + }, + ), + TextFormField( + controller: _repsController, + decoration: const InputDecoration(labelText: 'Reps'), + keyboardType: TextInputType.number, + onChanged: (value) { + setState(() { + _editedGymSet.reps = int.tryParse(value) ?? 0; + }); + }, + ), + TextFormField( + controller: _weightController, + decoration: const InputDecoration(labelText: 'Weight (kg)'), + keyboardType: TextInputType.number, + onChanged: (value) { + setState(() { + _editedGymSet.weight = int.tryParse(value) ?? 0; + }); + }, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.pop(context, _editedGymSet); + }, + child: const Icon(Icons.check), + ), + ); + } +} diff --git a/lib/home_page.dart b/lib/home_page.dart new file mode 100644 index 0000000..50ae45f --- /dev/null +++ b/lib/home_page.dart @@ -0,0 +1,172 @@ +import 'package:flutter/material.dart'; +import 'package:fmassive/edit_set.dart'; + +class HomePage extends StatelessWidget { + HomePage({super.key}); + + final List> _pageData = [ + {'title': 'Home', 'icon': Icons.home}, + {'title': 'Plans', 'icon': Icons.calendar_today}, + {'title': 'Best', 'icon': Icons.star}, + {'title': 'Workouts', 'icon': Icons.fitness_center}, + {'title': 'Timer', 'icon': Icons.timer}, + {'title': 'Settings', 'icon': Icons.settings}, + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(_pageData[0]['title']), + ), + drawer: Drawer( + child: ListView.builder( + itemCount: _pageData.length, + itemBuilder: (context, index) { + return ListTile( + leading: Icon(_pageData[index]['icon']), + title: Text(_pageData[index]['title']), + onTap: () { + Navigator.pop(context); + Navigator.pushNamed( + context, '/${_pageData[index]['title'].toLowerCase()}'); + }, + ); + }, + ), + ), + body: const Center( + child: GymSetPage(), + ), + ); + } +} + +class GymSet { + String name; + int reps; + int weight; + DateTime created; + + GymSet( + {required this.name, + required this.reps, + required this.weight, + required this.created}); +} + +class GymSetPage extends StatefulWidget { + const GymSetPage({Key? key}) : super(key: key); + + @override + _GymSetPageState createState() => _GymSetPageState(); +} + +class _GymSetPageState extends State { + final List _gymSets = [ + GymSet( + name: "Bench press", + reps: 10, + weight: 50, + created: DateTime(2022, 1, 1)), + GymSet( + name: "Bench press", + reps: 8, + weight: 60, + created: DateTime(2022, 1, 2)), + GymSet( + name: "Bench press", + reps: 6, + weight: 70, + created: DateTime(2022, 1, 3)), + GymSet( + name: "Shoulder press", + reps: 12, + weight: 40, + created: DateTime(2022, 1, 4)), + GymSet( + name: "Shoulder press", + reps: 15, + weight: 35, + created: DateTime(2022, 1, 5)), + ]; + + List _searchResults = []; + + final TextEditingController _searchController = TextEditingController(); + + void _searchGymSets(String searchQuery) { + List results = []; + + if (searchQuery.isEmpty) { + results = _gymSets; + } else { + for (int i = 0; i < _gymSets.length; i++) { + if (_gymSets[i].reps.toString().contains(searchQuery) || + _gymSets[i].weight.toString().contains(searchQuery) || + _gymSets[i].created.toString().contains(searchQuery) || + _gymSets[i].name.contains(searchQuery)) { + results.add(_gymSets[i]); + } + } + } + + setState(() { + _searchResults = results; + }); + } + + @override + void initState() { + super.initState(); + + // Initialize the search results to all the gym sets + _searchResults = _gymSets; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: TextField( + controller: _searchController, + decoration: const InputDecoration( + hintText: 'Search Gym Sets', + border: InputBorder.none, + ), + onChanged: (searchQuery) { + _searchGymSets(searchQuery); + }, + ), + ), + body: ListView.builder( + itemCount: _searchResults.length, + itemBuilder: (context, index) { + return ListTile( + title: Text( + '${_searchResults[index].name}: ${_searchResults[index].reps}x${_searchResults[index].weight}kg'), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + EditGymSetPage(gymSet: _searchResults[index]), + ), + ); + }); + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + EditGymSetPage(gymSet: _searchResults[0]), + ), + ); + }, + child: const Icon(Icons.add))); + } +} diff --git a/lib/main.dart b/lib/main.dart index 087dc4a..2393e32 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,127 +1,45 @@ import 'package:flutter/material.dart'; +import 'package:fmassive/best_page.dart'; +import 'package:fmassive/edit_set.dart'; +import 'package:fmassive/home_page.dart'; +import 'package:fmassive/plans_page.dart'; +import 'package:fmassive/settings_page.dart'; +import 'package:fmassive/timer_page.dart'; +import 'package:fmassive/workouts_page.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { + MyApp({Key? key}) : super(key: key); + + final navigatorKey = GlobalKey(); + @override Widget build(BuildContext context) { + final edit = EditGymSetPage( + gymSet: GymSet(name: '', reps: 0, weight: 0, created: DateTime.now())); + + final Map routes = { + '/home': (context) => HomePage(), + '/plans': (context) => const PlansPage(), + '/best': (context) => const BestPage(), + '/workouts': (context) => const WorkoutsPage(), + '/timer': (context) => const TimerPage(), + '/settings': (context) => const SettingsPage(), + '/edit-set': (context) => edit, + }; + return MaterialApp( title: 'Gym App', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), - home: HomePage(), - ); - } -} - -class HomePage extends StatelessWidget { - final List _pageTitles = [ - 'Home', - 'Plans', - 'Best', - 'Workouts', - 'Timer', - 'Settings' - ]; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(_pageTitles[0]), - ), - drawer: Drawer( - child: ListView.builder( - itemCount: _pageTitles.length, - itemBuilder: (context, index) { - return ListTile( - title: Text(_pageTitles[index]), - onTap: () { - Navigator.pop(context); - Navigator.pushNamed( - context, '/${_pageTitles[index].toLowerCase()}'); - }, - ); - }, - ), - ), - body: Center( - child: Text('Welcome to the Home Page!'), - ), - ); - } -} - -class PlansPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Plans'), - ), - body: Center( - child: Text('Welcome to the Plans Page!'), - ), - ); - } -} - -class BestPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Best'), - ), - body: Center( - child: Text('Welcome to the Best Page!'), - ), - ); - } -} - -class WorkoutsPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Workouts'), - ), - body: Center( - child: Text('Welcome to the Workouts Page!'), - ), - ); - } -} - -class TimerPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Timer'), - ), - body: Center( - child: Text('Welcome to the Timer Page!'), - ), - ); - } -} - -class SettingsPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Settings'), - ), - body: Center( - child: Text('Welcome to the Settings Page!'), - ), + initialRoute: '/home', + routes: routes, + navigatorKey: navigatorKey, ); } } diff --git a/lib/plans_page.dart b/lib/plans_page.dart new file mode 100644 index 0000000..8bff1b4 --- /dev/null +++ b/lib/plans_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class PlansPage extends StatelessWidget { + const PlansPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Plans'), + ), + body: const Center( + child: Text('Welcome to the Plans Page!'), + ), + ); + } +} diff --git a/lib/settings_page.dart b/lib/settings_page.dart new file mode 100644 index 0000000..33f98e2 --- /dev/null +++ b/lib/settings_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class SettingsPage extends StatelessWidget { + const SettingsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Settings'), + ), + body: const Center( + child: Text('Welcome to the Settings Page!'), + ), + ); + } +} diff --git a/lib/timer_page.dart b/lib/timer_page.dart new file mode 100644 index 0000000..9746462 --- /dev/null +++ b/lib/timer_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class TimerPage extends StatelessWidget { + const TimerPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Timer'), + ), + body: const Center( + child: Text('Welcome to the Timer Page!'), + ), + ); + } +} diff --git a/lib/workouts_page.dart b/lib/workouts_page.dart new file mode 100644 index 0000000..9d680d1 --- /dev/null +++ b/lib/workouts_page.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class WorkoutsPage extends StatelessWidget { + const WorkoutsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Workouts'), + ), + body: const Center( + child: Text('Welcome to the Workouts Page!'), + ), + ); + } +} diff --git a/test/widget_test.dart b/test/widget_test.dart index e8d6d3e..0174dfe 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,13 +7,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; - import 'package:fmassive/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); + await tester.pumpWidget(MyApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);