From ff48ee376b99f544b5b3e29e6ad07119de685fa0 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 22 Mar 2020 15:35:56 +0100 Subject: [PATCH] Add basic performer selector --- lib/selectors/performer.dart | 112 +++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 lib/selectors/performer.dart diff --git a/lib/selectors/performer.dart b/lib/selectors/performer.dart new file mode 100644 index 0000000..8c8a872 --- /dev/null +++ b/lib/selectors/performer.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +import '../backend.dart'; +import '../database.dart'; +import '../editors/person.dart'; +import '../selectors/role.dart'; + +class PerformanceModel { + final Person person; + final Role role; + + PerformanceModel({ + this.person, + this.role, + }); +} + +// TODO: Allow selecting and adding ensembles. +// TODO: Allow selecting instruments as roles. +class PerformerSelector extends StatefulWidget { + @override + _PerformerSelectorState createState() => _PerformerSelectorState(); +} + +class _PerformerSelectorState extends State { + Role role; + + @override + Widget build(BuildContext context) { + final backend = Backend.of(context); + + return Scaffold( + appBar: AppBar( + title: Text('Select performer'), + ), + body: Column( + children: [ + Material( + elevation: 2.0, + child: ListTile( + title: Text('Role'), + subtitle: + Text(role != null ? role.name : 'Select role or instrument'), + trailing: IconButton( + icon: const Icon(Icons.delete), + onPressed: () { + setState(() { + role = null; + }); + }, + ), + onTap: () async { + final Role newRole = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RoleSelector(), + fullscreenDialog: true, + )); + + if (newRole != null) { + setState(() { + role = newRole; + }); + } + }, + ), + ), + Expanded( + child: StreamBuilder( + stream: backend.db.allPersons().watch(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return ListView.builder( + itemCount: snapshot.data.length, + itemBuilder: (context, index) { + final person = snapshot.data[index]; + + return ListTile( + title: Text('${person.lastName}, ${person.firstName}'), + onTap: () => Navigator.pop(context, PerformanceModel( + person: person, + role: role, + )), + ); + }, + ); + } else { + return Container(); + } + }, + ), + ), + ], + ), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () async { + final Person person = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PersonEditor(), + fullscreenDialog: true, + )); + + if (person != null) { + Navigator.pop(context, person); + } + }, + ), + ); + } +}