Work editor: Initialize from WorkInfo

This commit is contained in:
Elias Projahn 2020-04-26 17:26:19 +02:00
parent 97c4359ad9
commit ea0f7f86aa
3 changed files with 36 additions and 77 deletions

View file

@ -157,10 +157,13 @@ class _PartTileState extends State<PartTile> {
/// If the user is finished editing, the result will be returned as a [WorkInfo] /// If the user is finished editing, the result will be returned as a [WorkInfo]
/// object. /// object.
class WorkEditor extends StatefulWidget { class WorkEditor extends StatefulWidget {
final Work work; /// The work to edit.
///
/// If this is null, a new work will be created.
final WorkInfo workInfo;
WorkEditor({ WorkEditor({
this.work, this.workInfo,
}); });
@override @override
@ -170,9 +173,6 @@ class WorkEditor extends StatefulWidget {
class _WorkEditorState extends State<WorkEditor> { class _WorkEditorState extends State<WorkEditor> {
final titleController = TextEditingController(); final titleController = TextEditingController();
BackendState backend;
String title = '';
Person composer; Person composer;
List<Instrument> instruments = []; List<Instrument> instruments = [];
List<PartData> parts = []; List<PartData> parts = [];
@ -181,71 +181,26 @@ class _WorkEditorState extends State<WorkEditor> {
void initState() { void initState() {
super.initState(); super.initState();
if (widget.work != null) { if (widget.workInfo != null) {
titleController.text = widget.work.title; titleController.text = widget.workInfo.work.title;
} // TODO: Theoretically this includes the composers of all parts.
} composer = widget.workInfo.composers.first;
instruments = List.from(widget.workInfo.instruments);
@override for (final partInfo in widget.workInfo.parts) {
void didChangeDependencies() { parts.add(PartData(
super.didChangeDependencies(); title: partInfo.work.title,
composer: partInfo.composer,
backend = Backend.of(context); instruments: List.from(partInfo.instruments),
));
if (widget.work != null) {
if (widget.work.composer != null) {
() async {
final person =
await backend.db.personById(widget.work.composer).getSingle();
// We don't want to override a newly selected composer.
if (composer == null) {
setState(() {
composer = person;
});
}
}();
} }
() async {
final selection =
await backend.db.instrumentsByWork(widget.work.id).get();
// We don't want to override already selected instruments.
if (instruments.isEmpty) {
setState(() {
instruments = selection;
});
}
}();
() async {
final dbParts = await backend.db.workParts(widget.work.id).get();
for (final dbPart in dbParts) {
final partInstruments =
await backend.db.instrumentsByWork(dbPart.id).get();
Person partComposer;
if (dbPart.composer != null) {
partComposer =
await backend.db.personById(dbPart.composer).getSingle();
}
setState(() {
parts.add(PartData(
title: dbPart.title,
composer: partComposer,
instruments: partInstruments,
));
});
}
}();
} }
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final backend = Backend.of(context);
final List<Widget> partTiles = []; final List<Widget> partTiles = [];
for (var i = 0; i < parts.length; i++) { for (var i = 0; i < parts.length; i++) {
final part = parts[i]; final part = parts[i];
@ -297,7 +252,7 @@ class _WorkEditorState extends State<WorkEditor> {
FlatButton( FlatButton(
child: Text('DONE'), child: Text('DONE'),
onPressed: () async { onPressed: () async {
final workId = widget.work?.id ?? generateId(); final workId = widget?.workInfo?.work?.id ?? generateId();
List<PartInfo> partInfos = []; List<PartInfo> partInfos = [];
for (var i = 0; i < parts.length; i++) { for (var i = 0; i < parts.length; i++) {

View file

@ -47,14 +47,18 @@ class PersonScreen extends StatelessWidget {
final work = snapshot.data[index]; final work = snapshot.data[index];
return ListTile( return ListTile(
title: Text(work.title), title: Text(work.title),
onTap: () => Navigator.push( onTap: () async {
context, final workInfo = await backend.db.getWorkInfo(work);
MaterialPageRoute(
builder: (context) => WorkScreen( Navigator.push(
work: work, context,
MaterialPageRoute(
builder: (context) => WorkScreen(
workInfo: workInfo,
),
), ),
), );
), },
); );
}, },
); );

View file

@ -6,10 +6,10 @@ import '../editors/work.dart';
import '../widgets/texts.dart'; import '../widgets/texts.dart';
class WorkScreen extends StatelessWidget { class WorkScreen extends StatelessWidget {
final Work work; final WorkInfo workInfo;
WorkScreen({ WorkScreen({
this.work, this.workInfo,
}); });
@override @override
@ -18,7 +18,7 @@ class WorkScreen extends StatelessWidget {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(work.title), title: Text(workInfo.work.title),
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
icon: const Icon(Icons.edit), icon: const Icon(Icons.edit),
@ -27,7 +27,7 @@ class WorkScreen extends StatelessWidget {
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => WorkEditor( builder: (context) => WorkEditor(
work: work, workInfo: workInfo,
), ),
fullscreenDialog: true, fullscreenDialog: true,
), ),
@ -37,7 +37,7 @@ class WorkScreen extends StatelessWidget {
], ],
), ),
body: StreamBuilder<List<Recording>>( body: StreamBuilder<List<Recording>>(
stream: backend.db.recordingsByWork(work.id).watch(), stream: backend.db.recordingsByWork(workInfo.work.id).watch(),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
return ListView.builder( return ListView.builder(