From f7f109179f312ae8b8fa7cd547c3baf8a9649d33 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Fri, 24 Apr 2020 20:10:48 +0200 Subject: [PATCH] Track editor: Automatically set work parts --- musicus/lib/editors/tracks.dart | 58 ++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/musicus/lib/editors/tracks.dart b/musicus/lib/editors/tracks.dart index 2d45146..b41f013 100644 --- a/musicus/lib/editors/tracks.dart +++ b/musicus/lib/editors/tracks.dart @@ -8,6 +8,8 @@ import '../selectors/recording.dart'; import '../widgets/recording_tile.dart'; class TrackModel { + int workPartIndex; + String workPartTitle; String fileName; TrackModel(this.fileName); @@ -19,13 +21,14 @@ class TracksEditor extends StatefulWidget { } class _TracksEditorState extends State { + BackendState backend; int recordingId; String parentId; List trackModels = []; @override Widget build(BuildContext context) { - final backend = Backend.of(context); + backend = Backend.of(context); return Scaffold( appBar: AppBar( @@ -43,7 +46,7 @@ class _TracksEditorState extends State { fileName: trackModel.fileName, recordingId: recordingId, index: i, - partIds: [], + partIds: [trackModel.workPartIndex], )); } @@ -68,7 +71,7 @@ class _TracksEditorState extends State { ListTile( title: Text('Files'), trailing: IconButton( - icon: const Icon(Icons.add), + icon: const Icon(Icons.edit), onPressed: () async { final FilesSelectorResult result = await Navigator.push( context, @@ -78,12 +81,20 @@ class _TracksEditorState extends State { ); if (result != null) { + final List newTrackModels = []; + + for (final document in result.selection) { + newTrackModels.add(TrackModel(document.name)); + } + setState(() { parentId = result.parentId; - for (final document in result.selection) { - trackModels.add(TrackModel(document.name)); - } + trackModels = newTrackModels; }); + + if (recordingId != null) { + updateAutoParts(); + } } }, ), @@ -93,15 +104,9 @@ class _TracksEditorState extends State { children: trackModels .map((t) => ListTile( key: Key(t.hashCode.toString()), - title: Text(t.fileName), - trailing: IconButton( - icon: const Icon(Icons.delete), - onPressed: () { - setState(() { - trackModels.remove(t); - }); - }, - ), + leading: const Icon(Icons.drag_handle), + title: Text(t.workPartTitle ?? 'Set work part'), + subtitle: Text(t.fileName), )) .toList(), onReorder: (i1, i2) { @@ -115,7 +120,7 @@ class _TracksEditorState extends State { ); } - void selectRecording() async { + Future selectRecording() async { final Recording recording = await Navigator.push( context, MaterialPageRoute( @@ -127,6 +132,27 @@ class _TracksEditorState extends State { setState(() { recordingId = recording.id; }); + + updateAutoParts(); } } + + /// Automatically associate the tracks with work parts. + Future updateAutoParts() async { + final recording = await backend.db.recordingById(recordingId).getSingle(); + final workId = recording.work; + final workParts = await backend.db.workParts(workId).get(); + + setState(() { + for (var i = 0; i < trackModels.length; i++) { + if (i >= workParts.length) { + trackModels[i].workPartIndex = null; + trackModels[i].workPartTitle = null; + } else { + trackModels[i].workPartIndex = workParts[i].partIndex; + trackModels[i].workPartTitle = workParts[i].title; + } + } + }); + } }