diff --git a/lib/checklist.dart b/lib/checklist.dart new file mode 100644 index 0000000..6d6b104 --- /dev/null +++ b/lib/checklist.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:happy_camper_proto/listpage.dart'; +import 'package:happy_camper_proto/preplist.dart'; + +class PrepPage extends StatefulWidget { + const PrepPage({super.key, required this.prepLists}); + + final List prepLists; + + @override + State createState() => _PrepPageState(); +} + +class _PrepPageState extends State { + late List prepLists; + + @override + void initState() { + prepLists = widget.prepLists; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemBuilder: (context, index) { + var list = prepLists[index]; + return ListTile( + title: Text(list.name), + subtitle: Text( + "Incomplete: ${list.countIncomplete}, Complete: ${list.countComplete}"), + onTap: () async { + await Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ListPage(list: list))); + setState(() {}); + }, + ); + }, + itemCount: prepLists.length, + ); + } +} diff --git a/lib/listpage.dart b/lib/listpage.dart new file mode 100644 index 0000000..373bc3b --- /dev/null +++ b/lib/listpage.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:happy_camper_proto/preplist.dart'; +import 'package:happy_camper_proto/task.dart'; + +class ListPage extends StatefulWidget { + const ListPage({super.key, required this.list}); + + final Preplist list; + + @override + State createState() => _ListPageState(); +} + +class _ListPageState extends State { + late Preplist list; + @override + void initState() { + list = widget.list; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(list.name), + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + ), + body: ListView.builder( + itemCount: list.tasks.length, + itemBuilder: (context, index) { + Task task = list.tasks[index]; + return ListTile( + title: Text(task.text), + leading: IconButton( + icon: Icon(task.complete + ? Icons.check_box_outlined + : Icons.check_box_outline_blank), + onPressed: () { + setState(() { + task.complete = (!task.complete); + }); + }, + )); + }, + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 8e94089..7ba9f5a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:happy_camper_proto/checklist.dart'; +import 'package:happy_camper_proto/preplist.dart'; void main() { runApp(const MyApp()); @@ -7,27 +9,11 @@ void main() { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), @@ -39,15 +25,6 @@ class MyApp extends StatelessWidget { class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - final String title; @override @@ -55,71 +32,66 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - int _counter = 0; + late Widget page; + int _selectedPage = 0; - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); + List prepLists = Preplist.exampleData(); + + void _showPage(int i) { + _selectedPage = i; + switch (_selectedPage) { + case 0: + page = PrepPage(prepLists: prepLists); + break; + default: + page = const Center( + child: Text("Hello World"), + ); + } + setState(() {}); + } + + @override + void initState() { + page = PrepPage(prepLists: prepLists); + super.initState(); } @override Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), + body: page, + bottomNavigationBar: BottomNavigationBar( + currentIndex: _selectedPage, + selectedItemColor: Theme.of(context).colorScheme.inversePrimary, + selectedFontSize: + (Theme.of(context).textTheme.labelLarge?.fontSize ?? 10) + 1, + onTap: _showPage, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.check), + label: "Prep", + ), + BottomNavigationBarItem( + icon: Icon(Icons.checklist), + label: "Templates", + ), + BottomNavigationBarItem( + icon: Icon(Icons.route), + label: "Route", + ), + ], ), floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + onPressed: () {}, + ), + floatingActionButtonLocation: + FloatingActionButtonLocation.miniCenterFloat, ); } } diff --git a/lib/preplist.dart b/lib/preplist.dart new file mode 100644 index 0000000..47a2ddc --- /dev/null +++ b/lib/preplist.dart @@ -0,0 +1,44 @@ +import 'package:happy_camper_proto/task.dart'; + +class Preplist { + Preplist({required this.name, required this.tasks}); + + String name; + List tasks; + + int get count { + return tasks.length; + } + + int get countIncomplete { + return tasks.where((task) => !task.complete).length; + } + + int get countComplete { + return tasks.where((task) => task.complete).length; + } + + static List exampleData() => [ + Preplist( + name: "example 1", + tasks: [ + Task(text: "test 1", complete: true), + Task(text: "test 2"), + Task(text: "test 3"), + Task(text: "test 4", complete: true), + ], + ), + Preplist( + name: "example 2", + tasks: [ + Task(text: "test 5"), + ], + ), + Preplist( + name: "example 3", + tasks: [ + Task(text: "test 6", complete: true), + ], + ), + ]; +} diff --git a/lib/task.dart b/lib/task.dart new file mode 100644 index 0000000..73ee45c --- /dev/null +++ b/lib/task.dart @@ -0,0 +1,6 @@ +class Task { + Task({required this.text, this.complete = false}); + + String text; + bool complete; +}