musicus_mobile/musicus/lib/editors/tracks.dart

133 lines
3.5 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import '../backend.dart';
import '../database.dart';
2020-04-18 23:41:08 +02:00
import '../music_library.dart';
import '../selectors/files.dart';
import '../selectors/recording.dart';
import '../widgets/recording_tile.dart';
class TrackModel {
2020-04-18 23:41:08 +02:00
String fileName;
2020-04-18 23:41:08 +02:00
TrackModel(this.fileName);
}
class TracksEditor extends StatefulWidget {
@override
_TracksEditorState createState() => _TracksEditorState();
}
class _TracksEditorState extends State<TracksEditor> {
int recordingId;
2020-04-18 23:41:08 +02:00
String parentId;
List<TrackModel> trackModels = [];
@override
Widget build(BuildContext context) {
final backend = Backend.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Tracks'),
actions: <Widget>[
FlatButton(
child: Text('DONE'),
onPressed: () async {
2020-04-18 23:41:08 +02:00
final List<Track> tracks = [];
for (var i = 0; i < trackModels.length; i++) {
final trackModel = trackModels[i];
tracks.add(Track(
fileName: trackModel.fileName,
recordingId: recordingId,
index: i,
partIds: [],
));
}
backend.ml.addTracks(parentId, tracks);
Navigator.pop(context);
},
),
],
),
2020-04-06 11:55:19 +02:00
body: ReorderableListView(
header: Column(
children: <Widget>[
2020-04-22 10:10:25 +02:00
ListTile(
title: recordingId != null
? RecordingTile(
recordingId: recordingId,
)
: Text('Select recording'),
onTap: selectRecording,
),
ListTile(
2020-04-06 11:55:19 +02:00
title: Text('Files'),
trailing: IconButton(
2020-04-06 11:55:19 +02:00
icon: const Icon(Icons.add),
onPressed: () async {
final FilesSelectorResult result = await Navigator.push(
2020-04-06 11:55:19 +02:00
context,
MaterialPageRoute(
builder: (context) => FilesSelector(),
2020-04-06 11:55:19 +02:00
),
);
if (result != null) {
2020-04-18 23:41:08 +02:00
setState(() {
parentId = result.parentId;
for (final document in result.selection) {
trackModels.add(TrackModel(document.name));
}
});
}
},
),
),
2020-04-06 11:55:19 +02:00
],
),
2020-04-18 23:41:08 +02:00
children: trackModels
2020-04-06 11:55:19 +02:00
.map((t) => ListTile(
key: Key(t.hashCode.toString()),
2020-04-18 23:41:08 +02:00
title: Text(t.fileName),
2020-04-06 11:55:19 +02:00
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
setState(() {
2020-04-18 23:41:08 +02:00
trackModels.remove(t);
2020-04-06 11:55:19 +02:00
});
},
),
))
.toList(),
onReorder: (i1, i2) {
setState(() {
2020-04-18 23:41:08 +02:00
final track = trackModels.removeAt(i1);
2020-04-06 11:55:19 +02:00
final newIndex = i2 > i1 ? i2 - 1 : i2;
2020-04-18 23:41:08 +02:00
trackModels.insert(newIndex, track);
2020-04-06 11:55:19 +02:00
});
},
),
);
}
void selectRecording() async {
final Recording recording = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => RecordingsSelector(),
),
);
if (recording != null) {
setState(() {
recordingId = recording.id;
});
}
}
}