From 813fa2e47a18a1a896a1f4acbfb03825a57cdf57 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Wed, 13 May 2020 19:27:57 +0200 Subject: [PATCH] common, mobile: Adapt to new work part API --- common/lib/src/editors/tracks.dart | 4 +- common/lib/src/editors/work.dart | 4 +- common/lib/src/widgets/texts.dart | 35 --------- mobile/lib/screens/program.dart | 2 +- mobile/lib/widgets/player_bar.dart | 114 ++++++++++++++++++++--------- 5 files changed, 83 insertions(+), 76 deletions(-) diff --git a/common/lib/src/editors/tracks.dart b/common/lib/src/editors/tracks.dart index 7b4c92e..5d084b9 100644 --- a/common/lib/src/editors/tracks.dart +++ b/common/lib/src/editors/tracks.dart @@ -156,8 +156,8 @@ class _TracksEditorState extends State { trackModels[i].workPartIndex = null; trackModels[i].workPartTitle = null; } else { - trackModels[i].workPartIndex = workInfo.parts[i].work.partIndex; - trackModels[i].workPartTitle = workInfo.parts[i].work.title; + trackModels[i].workPartIndex = workInfo.parts[i].part.partIndex; + trackModels[i].workPartTitle = workInfo.parts[i].part.title; } } }); diff --git a/common/lib/src/editors/work.dart b/common/lib/src/editors/work.dart index 74f443f..9094816 100644 --- a/common/lib/src/editors/work.dart +++ b/common/lib/src/editors/work.dart @@ -190,7 +190,7 @@ class _WorkEditorState extends State { for (final partInfo in widget.workInfo.parts) { parts.add(PartData( - title: partInfo.work.title, + title: partInfo.part.title, composer: partInfo.composer, instruments: List.from(partInfo.instruments), )); @@ -276,7 +276,7 @@ class _WorkEditorState extends State { for (var i = 0; i < parts.length; i++) { final part = parts[i]; partInfos.add(PartInfo( - work: Work( + part: WorkPart( id: generateId(), title: part.titleController.text, composer: part.composer?.id, diff --git a/common/lib/src/widgets/texts.dart b/common/lib/src/widgets/texts.dart index 4289c7f..176a99a 100644 --- a/common/lib/src/widgets/texts.dart +++ b/common/lib/src/widgets/texts.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:musicus_database/musicus_database.dart'; -import '../backend.dart'; - /// A widget showing information on a list of performances. class PerformancesText extends StatelessWidget { /// The information to show. @@ -38,36 +36,3 @@ class PerformancesText extends StatelessWidget { } } -class WorkText extends StatelessWidget { - final int workId; - - WorkText(this.workId); - - @override - Widget build(BuildContext context) { - final backend = MusicusBackend.of(context); - - return StreamBuilder( - stream: backend.db.workById(workId).watchSingle(), - builder: (context, snapshot) => Text(snapshot.data?.title ?? '...'), - ); - } -} - -class ComposersText extends StatelessWidget { - final int workId; - - ComposersText(this.workId); - - @override - Widget build(BuildContext context) { - final backend = MusicusBackend.of(context); - - return StreamBuilder>( - stream: backend.db.composersByWork(workId).watch(), - builder: (context, snapshot) => Text(snapshot.hasData - ? snapshot.data.map((p) => '${p.firstName} ${p.lastName}').join(', ') - : '...'), - ); - } -} diff --git a/mobile/lib/screens/program.dart b/mobile/lib/screens/program.dart index 18ef2e3..c65ea75 100644 --- a/mobile/lib/screens/program.dart +++ b/mobile/lib/screens/program.dart @@ -118,7 +118,7 @@ class _ProgramScreenState extends State { left: 8.0, ), child: Text( - partInfo.work.title, + partInfo.part.title, style: TextStyle( fontStyle: FontStyle.italic, ), diff --git a/mobile/lib/widgets/player_bar.dart b/mobile/lib/widgets/player_bar.dart index bc9fb49..82e00ec 100644 --- a/mobile/lib/widgets/player_bar.dart +++ b/mobile/lib/widgets/player_bar.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:musicus_common/musicus_common.dart'; import 'package:musicus_database/musicus_database.dart'; @@ -6,10 +8,68 @@ import '../screens/program.dart'; import 'play_pause_button.dart'; -class PlayerBar extends StatelessWidget { +class PlayerBar extends StatefulWidget { + @override + _PlayerBarState createState() => _PlayerBarState(); +} + +class _PlayerBarState extends State { + MusicusBackendState _backend; + StreamSubscription _currentTrackSubscribtion; + WorkInfo _workInfo; + List _partIds; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + _backend = MusicusBackend.of(context); + + _currentTrackSubscribtion?.cancel(); + _currentTrackSubscribtion = _backend.playback.currentTrack.listen((track) { + if (track != null) { + _setTrack(track.track); + } + }); + } + + Future _setTrack(Track track) async { + final recording = + await _backend.db.recordingById(track.recordingId).getSingle(); + final workInfo = await _backend.db.getWork(recording.work); + final partIds = track.partIds; + + if (mounted) { + setState(() { + _workInfo = workInfo; + _partIds = partIds; + }); + } + } + @override Widget build(BuildContext context) { - final backend = MusicusBackend.of(context); + String title; + String subtitle; + + if (_workInfo != null) { + title = _workInfo.composers + .map((p) => '${p.firstName} ${p.lastName}') + .join(', '); + + final subtitleBuffer = StringBuffer(_workInfo.work.title); + + if (_partIds.isNotEmpty) { + subtitleBuffer.write(': '); + subtitleBuffer.write( + _partIds.map((i) => _workInfo.parts[i].part.title).join(', ')); + } + + subtitle = subtitleBuffer.toString(); + } else { + title = '...'; + subtitle = '...'; + } return BottomAppBar( child: InkWell( @@ -17,7 +77,7 @@ class PlayerBar extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ StreamBuilder( - stream: backend.playback.normalizedPosition, + stream: _backend.playback.normalizedPosition, builder: (context, snapshot) => LinearProgressIndicator( value: snapshot.data, ), @@ -29,39 +89,15 @@ class PlayerBar extends StatelessWidget { child: Icon(Icons.keyboard_arrow_up), ), Expanded( - child: StreamBuilder( - stream: backend.playback.currentTrack, - builder: (context, snapshot) { - if (snapshot.data != null) { - final recordingId = snapshot.data.track.recordingId; - - return FutureBuilder( - future: - backend.db.recordingById(recordingId).getSingle(), - builder: (context, snapshot) { - if (snapshot.hasData) { - final workId = snapshot.data.work; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - DefaultTextStyle.merge( - style: - TextStyle(fontWeight: FontWeight.bold), - child: ComposersText(workId), - ), - WorkText(workId), - ], - ); - } else { - return Container(); - } - }, - ); - } else { - return Container(); - } - }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + DefaultTextStyle.merge( + style: TextStyle(fontWeight: FontWeight.bold), + child: Text(title), + ), + Text(subtitle), + ], ), ), PlayPauseButton(), @@ -78,4 +114,10 @@ class PlayerBar extends StatelessWidget { ), ); } + + @override + void dispose() { + super.dispose(); + _currentTrackSubscribtion?.cancel(); + } }