Download naming changes

This commit is contained in:
exttex 2020-09-01 16:41:15 +02:00
parent 37f97f9992
commit 4e5e3a3059
8 changed files with 260 additions and 104 deletions

View file

@ -8,7 +8,8 @@ import '../api/download.dart';
class DownloadTile extends StatelessWidget {
final Download download;
DownloadTile(this.download);
Function onDelete;
DownloadTile(this.download, {this.onDelete});
String get subtitle {
switch (download.state) {
@ -53,6 +54,34 @@ class DownloadTile extends StatelessWidget {
url: download.track.albumArt.thumb,
),
trailing: trailing,
onTap: () {
//Delete if none
if (download.state == DownloadState.NONE) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Delete'),
content: Text('Are you sure, you want to delete this download?'),
actions: [
FlatButton(
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text('Delete'),
onPressed: () {
downloadManager.removeDownload(download);
if (this.onDelete != null) this.onDelete();
Navigator.of(context).pop();
},
)
],
);
}
);
}
},
),
progressBar
],
@ -60,54 +89,99 @@ class DownloadTile extends StatelessWidget {
}
}
class DownloadsScreen extends StatelessWidget {
class DownloadsScreen extends StatefulWidget {
@override
_DownloadsScreenState createState() => _DownloadsScreenState();
}
class _DownloadsScreenState extends State<DownloadsScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Downloads'),
),
body: ListView(
children: <Widget>[
StreamBuilder(
stream: Stream.periodic(Duration(milliseconds: 500)), //Periodic to get current download progress
builder: (BuildContext context, AsyncSnapshot snapshot) {
appBar: AppBar(
title: Text('Downloads'),
actions: [
IconButton(
icon: Icon(Icons.delete_sweep),
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Delete'),
content: Text('Are you sure, you want to delete all queued downloads?'),
actions: [
FlatButton(
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text('Delete'),
onPressed: () async {
await downloadManager.clearQueue();
Navigator.of(context).pop();
},
)
],
);
}
);
},
)
],
),
body: ListView(
children: <Widget>[
StreamBuilder(
stream: Stream.periodic(Duration(milliseconds: 500)).asBroadcastStream(), //Periodic to get current download progress
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (downloadManager.queue.length == 0)
return Container(width: 0, height: 0,);
if (downloadManager.queue.length == 0)
return Container(width: 0, height: 0,);
return Column(
children: List.generate(downloadManager.queue.length, (i) {
return DownloadTile(downloadManager.queue[i]);
})
);
},
),
FutureBuilder(
future: downloadManager.getFinishedDownloads(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.length == 0) return Container(height: 0, width: 0,);
return Column(
children: List.generate(downloadManager.queue.length, (i) {
return DownloadTile(downloadManager.queue[i], onDelete: () => setState(() => {}));
})
);
},
),
FutureBuilder(
future: downloadManager.getFinishedDownloads(),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.length == 0) return Container(height: 0, width: 0,);
return Column(
children: <Widget>[
Divider(),
Text(
'History',
style: TextStyle(
fontSize: 24.0,
fontWeight: FontWeight.bold
return Column(
children: <Widget>[
Divider(),
Text(
'History',
style: TextStyle(
fontSize: 24.0,
fontWeight: FontWeight.bold
),
),
),
...List.generate(snapshot.data.length, (i) {
Download d = snapshot.data[i];
return DownloadTile(d);
})
],
);
},
)
],
)
...List.generate(snapshot.data.length, (i) {
Download d = snapshot.data[i];
return DownloadTile(d);
}),
ListTile(
title: Text('Clear downloads history'),
leading: Icon(Icons.delete),
subtitle: Text('WARNING: This will only clear non-offline (external downloads)'),
onTap: () async {
await downloadManager.cleanDownloadHistory();
setState(() {});
},
),
],
);
},
)
],
)
);
}
}
}

View file

@ -123,8 +123,8 @@ class _HomePageScreenState extends State<HomePageScreen> {
@override
void initState() {
_load();
super.initState();
_load();
}
@override

View file

@ -474,31 +474,62 @@ class _GeneralSettingsState extends State<GeneralSettings> {
),
ListTile(
title: Text('Downloads naming'),
subtitle: Text('Currently: ${settings.downloadFilename}'),
leading: Icon(Icons.text_format),
onTap: () {
showDialog(
context: context,
builder: (context) {
return SimpleDialog(
children: <Widget>[
ListTile(
title: Text('Default naming'),
subtitle: Text('01. Title'),
onTap: () {
settings.downloadNaming = DownloadNaming.DEFAULT;
Navigator.of(context).pop();
settings.save();
TextEditingController _controller = TextEditingController();
String filename = settings.downloadFilename;
_controller.value = _controller.value.copyWith(text: filename);
//Dialog with filename format
return AlertDialog(
title: Text('Downloaded tracks filename'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: _controller,
),
Container(height: 8.0),
Text(
'Valid variables are: %artists%, %artist%, %title%, %album%, %trackNumber%, %0trackNumber%',
style: TextStyle(
fontSize: 12.0,
),
)
],
),
actions: [
FlatButton(
child: Text('Cancel'),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text('Reset'),
onPressed: () {
_controller.value = _controller.value.copyWith(
text: '%artists% - %title%'
);
},
),
ListTile(
title: Text('Standalone naming'),
subtitle: Text('Artist - Title'),
onTap: () {
settings.downloadNaming = DownloadNaming.STANDALONE;
Navigator.of(context).pop();
settings.save();
},
FlatButton(
child: Text('Clear'),
onPressed: () => _controller.clear(),
),
FlatButton(
child: Text('Save'),
onPressed: () {
setState(() {
settings.downloadFilename = _controller.text;
settings.save();
Navigator.of(context).pop();
});
},
)
],
);
}
@ -506,12 +537,31 @@ class _GeneralSettingsState extends State<GeneralSettings> {
},
),
ListTile(
title: Text('Create download folder structure'),
subtitle: Text('Artist/Album/Track'),
title: Text('Create folders for artist'),
leading: Switch(
value: settings.downloadFolderStructure,
value: settings.artistFolder,
onChanged: (v) {
setState(() => settings.downloadFolderStructure = v);
setState(() => settings.artistFolder = v);
settings.save();
},
),
),
ListTile(
title: Text('Create folders for albums'),
leading: Switch(
value: settings.albumFolder,
onChanged: (v) {
setState(() => settings.albumFolder = v);
settings.save();
},
),
),
ListTile(
title: Text('Separate albums by discs'),
leading: Switch(
value: settings.albumDiscFolder,
onChanged: (v) {
setState(() => settings.albumDiscFolder = v);
settings.save();
},
),