adding tasks and templates

This commit is contained in:
Andrei Stoica 2024-11-05 04:28:18 -05:00
parent 2907073f22
commit 7b939628b2
6 changed files with 332 additions and 7 deletions

View File

@ -22,7 +22,12 @@ class _PrepPageState extends State<PrepPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ListView.builder( return ListView.separated(
itemCount: prepLists.length,
separatorBuilder: (context, index) => const Padding(
padding: EdgeInsets.symmetric(horizontal: 20),
child: Divider(color: Colors.grey),
),
itemBuilder: (context, index) { itemBuilder: (context, index) {
var list = prepLists[index]; var list = prepLists[index];
return ListTile( return ListTile(
@ -36,7 +41,6 @@ class _PrepPageState extends State<PrepPage> {
}, },
); );
}, },
itemCount: prepLists.length,
); );
} }
} }

View File

@ -13,6 +13,36 @@ class ListPage extends StatefulWidget {
class _ListPageState extends State<ListPage> { class _ListPageState extends State<ListPage> {
late Preplist list; late Preplist list;
void _showAddItem() async {
var item = await showDialog(
context: context,
builder: (context) {
GlobalKey<FormState> formKey = GlobalKey();
TextEditingController inputController = TextEditingController();
return AlertDialog(
title: const Text("Add item"),
content: Form(
key: formKey,
child: TextFormField(
controller: inputController,
decoration: const InputDecoration(hintText: "Task"),
)),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(inputController.text);
},
child: const Text("Add"))
],
);
});
setState(() {
list.tasks.add(Task(text: item));
});
}
@override @override
void initState() { void initState() {
list = widget.list; list = widget.list;
@ -44,6 +74,11 @@ class _ListPageState extends State<ListPage> {
)); ));
}, },
), ),
floatingActionButton: FloatingActionButton(
shape: const CircleBorder(),
onPressed: _showAddItem,
child: const Icon(Icons.add),
),
); );
} }
} }

65
lib/listtemplates.dart Normal file
View File

@ -0,0 +1,65 @@
import 'package:happy_camper_proto/preplist.dart';
import 'package:happy_camper_proto/task.dart';
class ListTemplate {
ListTemplate({required this.name, List<Preplist>? lists}) {
this.lists = lists ?? [];
}
String name;
late List<Preplist> lists;
get length => lists.length;
static List<ListTemplate> exampleData() {
return [
ListTemplate(
name: "example template 1",
lists: [
Preplist(
name: "Example List 1",
tasks: [Task(text: "task 1")],
),
Preplist(
name: "Example List 2",
tasks: [
Task(text: "task 2"),
Task(text: "task 3"),
],
),
],
),
ListTemplate(
name: "example template 2",
lists: [
Preplist(
name: "Example List 3",
tasks: [
Task(text: "task 4"),
Task(text: "task 5"),
],
)
],
),
ListTemplate(
name: "example template 3",
lists: [
Preplist(
name: "Example List 4",
tasks: [
Task(text: "task 6"),
Task(text: "task 7"),
],
),
Preplist(
name: "Example List 5",
tasks: [
Task(text: "task 8"),
Task(text: "task 9"),
],
)
],
),
];
}
}

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:happy_camper_proto/checklist.dart'; import 'package:happy_camper_proto/checklist.dart';
import 'package:happy_camper_proto/listtemplates.dart';
import 'package:happy_camper_proto/preplist.dart'; import 'package:happy_camper_proto/preplist.dart';
import 'package:happy_camper_proto/templates_page.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
@ -35,7 +37,8 @@ class _MyHomePageState extends State<MyHomePage> {
late Widget page; late Widget page;
int _selectedPage = 0; int _selectedPage = 0;
List<Preplist> prepLists = Preplist.exampleData(); late List<Preplist> prepLists;
late List<ListTemplate> listTemplates;
void _showPage(int i) { void _showPage(int i) {
_selectedPage = i; _selectedPage = i;
@ -43,6 +46,9 @@ class _MyHomePageState extends State<MyHomePage> {
case 0: case 0:
page = PrepPage(prepLists: prepLists); page = PrepPage(prepLists: prepLists);
break; break;
case 1:
page = TemplatesPage(templates: listTemplates);
break;
default: default:
page = const Center( page = const Center(
child: Text("Hello World"), child: Text("Hello World"),
@ -51,8 +57,72 @@ class _MyHomePageState extends State<MyHomePage> {
setState(() {}); setState(() {});
} }
void _fabOnPress() async {
switch (_selectedPage) {
case 0:
var item = await showDialog(
context: context,
builder: (context) {
GlobalKey<FormState> formKey = GlobalKey();
TextEditingController inputController = TextEditingController();
return AlertDialog(
title: const Text("New List"),
content: Form(
key: formKey,
child: TextFormField(
controller: inputController,
decoration: const InputDecoration(hintText: "Name"),
)),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(inputController.text);
},
child: const Text("Add"))
],
);
});
prepLists.add(Preplist(name: item, tasks: []));
break;
case 1:
var value = await showDialog(
context: context,
builder: (context) {
GlobalKey<FormState> formKey = GlobalKey();
TextEditingController inputController = TextEditingController();
return AlertDialog(
title: const Text("New Template"),
content: Form(
key: formKey,
child: TextFormField(
controller: inputController,
decoration: const InputDecoration(hintText: "Name"),
)),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(inputController.text);
},
child: const Text("Add"))
],
);
});
listTemplates.add(ListTemplate(name: value));
break;
default:
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text("This page should not have a FAB"),
));
}
_showPage(_selectedPage);
}
@override @override
void initState() { void initState() {
prepLists = Preplist.exampleData();
listTemplates = ListTemplate.exampleData();
page = PrepPage(prepLists: prepLists); page = PrepPage(prepLists: prepLists);
super.initState(); super.initState();
} }
@ -86,10 +156,13 @@ class _MyHomePageState extends State<MyHomePage> {
), ),
], ],
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: (_selectedPage == 0 || _selectedPage == 1)
? FloatingActionButton(
mini: true,
onPressed: _fabOnPress,
child: const Icon(Icons.add), child: const Icon(Icons.add),
onPressed: () {}, )
), : null,
floatingActionButtonLocation: floatingActionButtonLocation:
FloatingActionButtonLocation.miniCenterFloat, FloatingActionButtonLocation.miniCenterFloat,
); );

104
lib/template_edit_page.dart Normal file
View File

@ -0,0 +1,104 @@
import 'package:flutter/material.dart';
import 'package:happy_camper_proto/listtemplates.dart';
import 'package:happy_camper_proto/preplist.dart';
class TemplateEditPage extends StatefulWidget {
const TemplateEditPage({super.key, required this.template});
final ListTemplate template;
@override
State<StatefulWidget> createState() => _TemplateEditPageState();
}
class _TemplateEditPageState extends State<TemplateEditPage> {
late ListTemplate template;
@override
void initState() {
template = widget.template;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: ListView.separated(
itemCount: template.length,
separatorBuilder: (context, index) => const Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: Divider()),
itemBuilder: (context, index) =>
ListDisplay(list: template.lists[index])));
}
}
class ListDisplay extends StatefulWidget {
const ListDisplay({super.key, required this.list, this.hidden = false});
final Preplist list;
final bool hidden;
@override
State<StatefulWidget> createState() => _ListDisplayState();
}
class _ListDisplayState extends State<ListDisplay> {
late Preplist list;
late bool hidden;
bool editMode = false;
@override
void initState() {
list = widget.list;
hidden = widget.hidden;
super.initState();
}
void _toggleHidden() {
setState(() {
hidden = !hidden;
});
}
void _toggleEdit() {
setState(() {
editMode = !editMode;
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: _toggleHidden,
onLongPress: _toggleEdit,
child: Padding(
padding: const EdgeInsets.all(10),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
style: Theme.of(context).textTheme.titleLarge,
list.name,
),
const Spacer(),
Visibility(
visible: editMode, child: const Icon(Icons.edit)),
Icon(hidden ? Icons.arrow_left : Icons.arrow_drop_down),
],
),
Visibility(
visible: !hidden,
child: Column(
children: list.tasks
.map((task) => Text(task.text,
style: Theme.of(context).textTheme.bodyLarge))
.toList())),
],
)));
}
}

44
lib/templates_page.dart Normal file
View File

@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:happy_camper_proto/listtemplates.dart';
import 'package:happy_camper_proto/template_edit_page.dart';
class TemplatesPage extends StatefulWidget {
const TemplatesPage({super.key, required this.templates});
final List<ListTemplate> templates;
@override
State<StatefulWidget> createState() => _TemplatesPageState();
}
class _TemplatesPageState extends State<TemplatesPage> {
late List<ListTemplate> templates;
@override
void initState() {
templates = widget.templates;
super.initState();
}
@override
Widget build(BuildContext context) {
return ListView.separated(
itemCount: templates.length,
separatorBuilder: (context, index) => const Padding(
padding: EdgeInsets.symmetric(horizontal: 20),
child: Divider(
color: Colors.grey,
),
),
itemBuilder: (context, index) => ListTile(
title: Text(templates[index].name),
subtitle: Text("${templates[index].length} lists"),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => TemplateEditPage(
template: templates[index],
)));
},
),
);
}
}