import 'package:boxchecker/check_list_item.dart'; import 'package:flutter/material.dart'; import 'data_util.dart' as data; import 'db_helper.dart'; class CheckList extends StatefulWidget { const CheckList({Key? key, required this.id}) : super(key: key); final int id; @override State createState() => _CheckList(); } class _CheckList extends State { late bool _editable; data.List? listData; List list = []; void _loadList() async { var rows = await DBHelper.dbHelper.getList(widget.id); list.clear(); setState(() { for (var row in rows) { list.add(data.Check.fromMap(row)); } }); } void _loadListData() async { var rows = await DBHelper.dbHelper.getListData(widget.id); listData = (rows.isNotEmpty) ? data.List.fromMap(rows[0]) : null; _editable = (listData != null && !listData!.isTemplate!); } void _addItem() async { var item = data.Check("", false, listID: listData!.id!); int id = await DBHelper.dbHelper.insertItem(item); item.id = id; setState(() { list.add(item); }); } void _toggleEditable() { setState(() { _editable = !_editable; }); } @override void initState() { _loadListData(); _loadList(); super.initState(); } Widget iconButton() { return IconButton( onPressed: () => _toggleEditable(), icon: Icon(_editable ? Icons.lock_open : Icons.lock), ); } @override Widget build(BuildContext context) { return GestureDetector( onTap: () => FocusScope.of(context).unfocus(), child: Scaffold( appBar: AppBar( title: Text( (listData != null) ? listData!.name : 'Check List: ${widget.id}'), actions: (listData != null && listData!.isTemplate!) ? [iconButton()] : [], ), body: RefreshIndicator( onRefresh: () async { _loadListData(); _loadList(); }, child: ListView.builder( itemCount: list.length, itemBuilder: (context, index) { return CheckListItem( confirmDismiss: (direction) async { if (!_editable) return false; if (direction == DismissDirection.endToStart) { setState(() { DBHelper.dbHelper.deleteItem(list[index]); list.removeAt(index); }); return true; } DBHelper.dbHelper.updateItem(list[index]); setState(() { list[index].value = !list[index].value; }); return false; }, item: list[index], locked: !_editable, ); }, ), ), floatingActionButton: FloatingActionButton( onPressed: () { if (listData!.isTemplate! && !_editable) { ScaffoldMessenger.of(context) ..clearSnackBars() ..showSnackBar( const SnackBar(content: Text("Template is locked"))); return; } _addItem(); // TODO switch focus to new card }, child: const Icon(Icons.check_box_outlined), tooltip: "Add Item", ), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, ), ); } }