From 40db00d88d2d684c53b270a80234d72e3bcde2d5 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Mon, 6 Apr 2020 11:15:05 +0200 Subject: [PATCH] Bundle text widgets and refactor performances row --- lib/selectors/recording.dart | 27 ++----- lib/widgets/ensemble_text.dart | 26 ------- lib/widgets/performance_row.dart | 42 ----------- lib/widgets/person_text.dart | 26 ------- lib/widgets/texts.dart | 116 +++++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 116 deletions(-) delete mode 100644 lib/widgets/ensemble_text.dart delete mode 100644 lib/widgets/performance_row.dart delete mode 100644 lib/widgets/person_text.dart create mode 100644 lib/widgets/texts.dart diff --git a/lib/selectors/recording.dart b/lib/selectors/recording.dart index c6fd2d8..6479895 100644 --- a/lib/selectors/recording.dart +++ b/lib/selectors/recording.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:musicus/widgets/person_text.dart'; import '../backend.dart'; import '../database.dart'; import '../editors/recording.dart'; +import '../widgets/texts.dart'; import '../widgets/works_by_composer.dart'; import '../widgets/work_tile.dart'; -import '../widgets/performance_row.dart'; class PersonList extends StatelessWidget { final void Function(int personId) onSelect; @@ -121,24 +120,7 @@ class RecordingList extends StatelessWidget { itemBuilder: (context, index) { final recording = snapshot.data[index]; return ListTile( - title: StreamBuilder>( - stream: backend.db - .performancesByRecording(recording.id) - .watch(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (final performance in snapshot.data) - PerformanceRow(performance), - ], - ); - } else { - return Container(); - } - }, - ), + title: PerformancesText(recording.id), onTap: () => onSelect(recording), ); }, @@ -161,7 +143,7 @@ class RecordingsSelector extends StatefulWidget { class _RecordingsSelectorState extends State { final nestedNavigator = GlobalKey(); - + @override Widget build(BuildContext context) { // This exists to circumvent the nested navigator when selecting a @@ -193,7 +175,8 @@ class _RecordingsSelectorState extends State { MaterialPageRoute( builder: (context) => RecordingList( workId: workId, - onSelect: (recording) => popUpperNavigator(recording), + onSelect: (recording) => + popUpperNavigator(recording), ), ), ), diff --git a/lib/widgets/ensemble_text.dart b/lib/widgets/ensemble_text.dart deleted file mode 100644 index 3882f8f..0000000 --- a/lib/widgets/ensemble_text.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../backend.dart'; -import '../database.dart'; - -class EnsembleText extends StatelessWidget { - final int ensembleId; - - EnsembleText(this.ensembleId); - - @override - Widget build(BuildContext context) { - final backend = Backend.of(context); - - return StreamBuilder( - stream: backend.db.ensembleById(ensembleId).watchSingle(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Text(snapshot.data.name); - } else { - return Container(); - } - }, - ); - } -} diff --git a/lib/widgets/performance_row.dart b/lib/widgets/performance_row.dart deleted file mode 100644 index 40373dc..0000000 --- a/lib/widgets/performance_row.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../backend.dart'; -import '../database.dart'; - -import 'person_text.dart'; -import 'ensemble_text.dart'; - -class PerformanceRow extends StatelessWidget { - final Performance performance; - - PerformanceRow(this.performance); - - @override - Widget build(BuildContext context) { - final backend = Backend.of(context); - - return Row( - children: [ - if (performance.person != null) - PersonText(performance.person) - else if (performance.ensemble != null) - EnsembleText(performance.ensemble), - if (performance.role != null) ...[ - SizedBox( - width: 4.0, - ), - StreamBuilder( - stream: backend.db.instrumentById(performance.role).watchSingle(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Text('(${snapshot.data.name})'); - } else { - return Container(); - } - }, - ), - ], - ], - ); - } -} diff --git a/lib/widgets/person_text.dart b/lib/widgets/person_text.dart deleted file mode 100644 index fb14668..0000000 --- a/lib/widgets/person_text.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../backend.dart'; -import '../database.dart'; - -class PersonText extends StatelessWidget { - final int personId; - - PersonText(this.personId); - - @override - Widget build(BuildContext context) { - final backend = Backend.of(context); - - return StreamBuilder( - stream: backend.db.personById(personId).watchSingle(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Text('${snapshot.data.firstName} ${snapshot.data.lastName}'); - } else { - return Container(); - } - }, - ); - } -} diff --git a/lib/widgets/texts.dart b/lib/widgets/texts.dart new file mode 100644 index 0000000..4f0f4fb --- /dev/null +++ b/lib/widgets/texts.dart @@ -0,0 +1,116 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import '../backend.dart'; +import '../database.dart'; + +class EnsembleText extends StatelessWidget { + final int ensembleId; + + EnsembleText(this.ensembleId); + + @override + Widget build(BuildContext context) { + final backend = Backend.of(context); + + return StreamBuilder( + stream: backend.db.ensembleById(ensembleId).watchSingle(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Text(snapshot.data.name); + } else { + return Container(); + } + }, + ); + } +} + +class PersonText extends StatelessWidget { + final int personId; + + PersonText(this.personId); + + @override + Widget build(BuildContext context) { + final backend = Backend.of(context); + + return StreamBuilder( + stream: backend.db.personById(personId).watchSingle(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Text('${snapshot.data.firstName} ${snapshot.data.lastName}'); + } else { + return Container(); + } + }, + ); + } +} + +class PerformancesText extends StatefulWidget { + final int recordingId; + + PerformancesText(this.recordingId); + + @override + _PerformancesTextState createState() => _PerformancesTextState(); +} + +class _PerformancesTextState extends State { + BackendState backend; + StreamSubscription> performancesSubscription; + String text = '...'; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + performancesSubscription?.cancel(); + backend = Backend.of(context); + + performancesSubscription = backend.db + .performancesByRecording(widget.recordingId) + .watch() + .listen((performances) async { + final List texts = []; + + for (final performance in performances) { + final buffer = StringBuffer(); + + if (performance.person != null) { + final person = await backend.db.personById(performance.person).getSingle(); + buffer.write('${person.firstName} ${person.lastName}'); + } else if (performance.ensemble != null) { + final ensemble = await backend.db.ensembleById(performance.ensemble).getSingle(); + buffer.write(ensemble.name); + } else { + buffer.write('Unknown'); + } + + if (performance.role != null) { + final role = await backend.db.instrumentById(performance.role).getSingle(); + buffer.write(' (${role.name})'); + } + + texts.add(buffer.toString()); + } + + setState(() { + text = texts.join(', '); + }); + }); + } + + @override + Widget build(BuildContext context) { + return Text(text); + } + + @override + void dispose() { + super.dispose(); + performancesSubscription?.cancel(); + } +} \ No newline at end of file