Track editor: Automatically set work parts

This commit is contained in:
Elias Projahn 2020-04-24 20:10:48 +02:00
parent 27514ab11b
commit f7f109179f

View file

@ -8,6 +8,8 @@ import '../selectors/recording.dart';
import '../widgets/recording_tile.dart'; import '../widgets/recording_tile.dart';
class TrackModel { class TrackModel {
int workPartIndex;
String workPartTitle;
String fileName; String fileName;
TrackModel(this.fileName); TrackModel(this.fileName);
@ -19,13 +21,14 @@ class TracksEditor extends StatefulWidget {
} }
class _TracksEditorState extends State<TracksEditor> { class _TracksEditorState extends State<TracksEditor> {
BackendState backend;
int recordingId; int recordingId;
String parentId; String parentId;
List<TrackModel> trackModels = []; List<TrackModel> trackModels = [];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final backend = Backend.of(context); backend = Backend.of(context);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
@ -43,7 +46,7 @@ class _TracksEditorState extends State<TracksEditor> {
fileName: trackModel.fileName, fileName: trackModel.fileName,
recordingId: recordingId, recordingId: recordingId,
index: i, index: i,
partIds: [], partIds: [trackModel.workPartIndex],
)); ));
} }
@ -68,7 +71,7 @@ class _TracksEditorState extends State<TracksEditor> {
ListTile( ListTile(
title: Text('Files'), title: Text('Files'),
trailing: IconButton( trailing: IconButton(
icon: const Icon(Icons.add), icon: const Icon(Icons.edit),
onPressed: () async { onPressed: () async {
final FilesSelectorResult result = await Navigator.push( final FilesSelectorResult result = await Navigator.push(
context, context,
@ -78,12 +81,20 @@ class _TracksEditorState extends State<TracksEditor> {
); );
if (result != null) { if (result != null) {
final List<TrackModel> newTrackModels = [];
for (final document in result.selection) {
newTrackModels.add(TrackModel(document.name));
}
setState(() { setState(() {
parentId = result.parentId; parentId = result.parentId;
for (final document in result.selection) { trackModels = newTrackModels;
trackModels.add(TrackModel(document.name));
}
}); });
if (recordingId != null) {
updateAutoParts();
}
} }
}, },
), ),
@ -93,15 +104,9 @@ class _TracksEditorState extends State<TracksEditor> {
children: trackModels children: trackModels
.map((t) => ListTile( .map((t) => ListTile(
key: Key(t.hashCode.toString()), key: Key(t.hashCode.toString()),
title: Text(t.fileName), leading: const Icon(Icons.drag_handle),
trailing: IconButton( title: Text(t.workPartTitle ?? 'Set work part'),
icon: const Icon(Icons.delete), subtitle: Text(t.fileName),
onPressed: () {
setState(() {
trackModels.remove(t);
});
},
),
)) ))
.toList(), .toList(),
onReorder: (i1, i2) { onReorder: (i1, i2) {
@ -115,7 +120,7 @@ class _TracksEditorState extends State<TracksEditor> {
); );
} }
void selectRecording() async { Future<void> selectRecording() async {
final Recording recording = await Navigator.push( final Recording recording = await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
@ -127,6 +132,27 @@ class _TracksEditorState extends State<TracksEditor> {
setState(() { setState(() {
recordingId = recording.id; recordingId = recording.id;
}); });
updateAutoParts();
} }
} }
/// Automatically associate the tracks with work parts.
Future<void> 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;
}
}
});
}
} }