Skip to content

Commit 203dbdd

Browse files
authored
Queue fixes (#376)
1 parent 49ea1ba commit 203dbdd

File tree

6 files changed

+45
-25
lines changed

6 files changed

+45
-25
lines changed

lib/src/app/master_detail_page.dart

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import 'package:provider/provider.dart';
33
import 'package:yaru_widgets/yaru_widgets.dart';
44

55
import '../../build_context_x.dart';
6+
import '../../common.dart';
67
import '../../data.dart';
78
import '../../library.dart';
89
import '../../player.dart';
910
import '../../radio.dart';
1011
import '../../settings.dart';
1112
import '../../theme.dart';
12-
import '../common/common_widgets.dart';
1313
import '../globals.dart';
1414
import '../l10n/l10n.dart';
1515
import 'master_item.dart';
@@ -32,7 +32,9 @@ class MasterDetailPage extends StatelessWidget {
3232

3333
@override
3434
Widget build(BuildContext context) {
35-
final startPlaylist = context.read<PlayerModel>().startPlaylist;
35+
final playerModel = context.read<PlayerModel>();
36+
final startPlaylist = playerModel.startPlaylist;
37+
final pause = playerModel.pause;
3638

3739
return YaruMasterDetailTheme(
3840
data: YaruMasterDetailTheme.of(context).copyWith(
@@ -64,19 +66,38 @@ class MasterDetailPage extends StatelessWidget {
6466
if (index == 3 || index == 5) {
6567
return item.titleBuilder(context);
6668
}
69+
70+
final isEnQueued = context.select(
71+
(PlayerModel m) =>
72+
m.queueName != null && m.queueName == item.content?.$1,
73+
);
74+
final isPlaying = context.select(
75+
(PlayerModel m) => m.isPlaying,
76+
);
77+
78+
final onPlay = item.content?.$1 == null || item.content?.$2 == null
79+
? null
80+
: () {
81+
if (isEnQueued) {
82+
isPlaying ? pause() : playerModel.resume();
83+
} else {
84+
startPlaylist(
85+
item.content!.$2,
86+
item.content!.$1,
87+
);
88+
}
89+
};
90+
6791
return Padding(
6892
padding:
6993
index == 0 ? const EdgeInsets.only(top: 5) : EdgeInsets.zero,
7094
child: MasterTile(
95+
iconData:
96+
isPlaying && isEnQueued ? Iconz().pause : Iconz().playFilled,
7197
selected: index == 4 ? false : selected,
7298
title: item.titleBuilder(context),
7399
subtitle: item.subtitleBuilder?.call(context),
74-
onPlay: item.content?.$1 == null || item.content?.$2 == null
75-
? null
76-
: () => startPlaylist(
77-
item.content!.$2,
78-
item.content!.$1,
79-
),
100+
onPlay: onPlay,
80101
leading: item.iconBuilder == null
81102
? null
82103
: Padding(

lib/src/app/master_items.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:collection/collection.dart';
22
import 'package:flutter/material.dart';
33

44
import '../../common.dart';
5+
import '../../constants.dart';
56
import '../../data.dart';
67
import '../../library.dart';
78
import '../../local_audio.dart';
@@ -88,6 +89,7 @@ List<MasterItem> createMasterItems({
8889
),
8990
MasterItem(
9091
titleBuilder: (context) => Text(context.l10n.likedSongs),
92+
content: (kLikedAudios, likedLocalAudios),
9193
pageBuilder: (context) => LikedAudioPage(
9294
onTextTap: onTextTap,
9395
likedLocalAudios: likedLocalAudios,
@@ -168,8 +170,12 @@ List<MasterItem> createMasterItems({
168170
for (final station in starredStations.entries)
169171
MasterItem(
170172
titleBuilder: (context) => Text(station.key),
171-
subtitleBuilder: (context) =>
172-
Text(station.value.firstOrNull?.artist ?? context.l10n.station),
173+
subtitleBuilder: (context) {
174+
final text = station.value.firstOrNull?.artist?.isNotEmpty == true
175+
? station.value.firstOrNull!.artist!
176+
: context.l10n.station;
177+
return Text(text);
178+
},
173179
content: (station.key, station.value),
174180
pageBuilder: (context) => isOnline
175181
? StationPage(

lib/src/common/audio_page_body.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ class _AudioPageBodyState extends State<AudioPageBody> {
9999
final playerModel = context.read<PlayerModel>();
100100
final startPlaylist = playerModel.startPlaylist;
101101

102-
final queueName = context.select((PlayerModel m) => m.queueName);
103102
final currentAudio = context.select((PlayerModel m) => m.audio);
104103
final play = playerModel.play;
105104
final pause = playerModel.pause;
@@ -231,9 +230,6 @@ class _AudioPageBodyState extends State<AudioPageBody> {
231230
selected: audioSelected,
232231
pause: pause,
233232
resume: resume,
234-
startPlaylist: widget.audios == null
235-
? null
236-
: () => play(newAudio: audio),
237233
play: play,
238234
lastPosition: libraryModel.getLastPosition.call(audio.url),
239235
safeLastPosition: playerModel.safeLastPosition,
@@ -274,10 +270,7 @@ class _AudioPageBodyState extends State<AudioPageBody> {
274270
? null
275271
: () => startPlaylist(
276272
widget.audios!.skip(index).toSet(),
277-
queueName ??
278-
audio.artist ??
279-
audio.album ??
280-
widget.audios.toString(),
273+
widget.pageId,
281274
),
282275
resume: resume,
283276
key: ValueKey(audio),

lib/src/common/master_tile.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
22
import 'package:yaru_widgets/yaru_widgets.dart';
33

44
import '../../build_context_x.dart';
5-
import '../../common.dart';
65
import '../../constants.dart';
76

87
class MasterTile extends StatefulWidget {
@@ -15,6 +14,7 @@ class MasterTile extends StatefulWidget {
1514
this.subtitle,
1615
this.trailing,
1716
this.onPlay,
17+
required this.iconData,
1818
});
1919

2020
final bool? selected;
@@ -24,6 +24,7 @@ class MasterTile extends StatefulWidget {
2424
final Widget? trailing;
2525
final void Function()? onTap;
2626
final void Function()? onPlay;
27+
final IconData iconData;
2728

2829
@override
2930
State<MasterTile> createState() => _MasterTileState();
@@ -62,7 +63,7 @@ class _MasterTileState extends State<MasterTile> {
6263
child: IconButton(
6364
onPressed: widget.onPlay,
6465
icon: Icon(
65-
Iconz().playFilled,
66+
widget.iconData,
6667
size: kTinyButtonIconSize,
6768
color: context.t.colorScheme.primary,
6869
),

lib/src/player/player_service.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,10 @@ class PlayerService {
270270
}
271271

272272
Future<void> insertIntoQueue(Audio audio) async {
273-
if (_queue.$2.isNotEmpty && !_queue.$2.contains(audio)) {
274-
_queue.$2.insert(1, audio);
275-
nextAudio = queue.$2[1];
273+
if (_queue.$2.isNotEmpty && !_queue.$2.contains(audio) && _audio != null) {
274+
final currentIndex = queue.$2.indexOf(_audio!);
275+
_queue.$2.insert(currentIndex + 1, audio);
276+
nextAudio = queue.$2[currentIndex + 1];
276277
}
277278
}
278279

lib/src/podcasts/podcast_audio_tile.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class PodcastAudioTile extends StatelessWidget {
2626
required this.selected,
2727
required this.pause,
2828
required this.resume,
29-
required this.startPlaylist,
3029
required this.play,
3130
required this.lastPosition,
3231
this.isExpanded = false,
@@ -41,7 +40,6 @@ class PodcastAudioTile extends StatelessWidget {
4140
final bool selected;
4241
final void Function() pause;
4342
final Future<void> Function() resume;
44-
final void Function()? startPlaylist;
4543
final Future<void> Function({Duration? newPosition, Audio? newAudio}) play;
4644
final void Function()? removeUpdate;
4745
final void Function() safeLastPosition;

0 commit comments

Comments
 (0)