Skip to content

Commit

Permalink
Make playlist name change update UI (#399)
Browse files Browse the repository at this point in the history
  • Loading branch information
Feichtmeier authored Dec 28, 2023
1 parent 4f3781d commit 3d724ea
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 78 deletions.
33 changes: 7 additions & 26 deletions lib/src/app/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -144,30 +144,11 @@ class _AppState extends State<App> with WidgetsBindingObserver {

// Player
final play = context.read<PlayerModel>().play;

final isFullScreen = context.select((PlayerModel m) => m.fullScreen);

// Library
// Watching values
final libraryModel = context.read<LibraryModel>();
final index = context.select((LibraryModel m) => m.index);
final likedLocalAudios = context.select(
(LibraryModel m) => Set<Audio>.from(
m.likedAudios.where((e) => e.audioType == AudioType.local),
),
);

final subbedPodcasts = context.select((LibraryModel m) => m.podcasts);
final playlists = context.select((LibraryModel m) => m.playlists);
final starredStations =
context.select((LibraryModel m) => m.starredStations);
final pinnedAlbums = context.select((LibraryModel m) => m.pinnedAlbums);

context.select((LibraryModel m) => m.podcasts.length);
context.select((LibraryModel m) => m.pinnedAlbums.length);
context.select((LibraryModel m) => m.starredStations.length);
context.select((LibraryModel m) => m.playlists.length);
context.select((LibraryModel m) => m.playlists.keys);
context.watch<LibraryModel>();

void onTextTap({
required String text,
Expand Down Expand Up @@ -202,18 +183,18 @@ class _AppState extends State<App> with WidgetsBindingObserver {
final masterItems = createMasterItems(
isOnline: isOnline,
onTextTap: onTextTap,
likedLocalAudios: likedLocalAudios,
subbedPodcasts: subbedPodcasts,
likedLocalAudios: libraryModel.likedAudios,
subbedPodcasts: libraryModel.podcasts,
addPodcast: libraryModel.addPodcast,
removePodcast: libraryModel.removePodcast,
playlists: playlists,
playlists: libraryModel.playlists,
removePlaylist: libraryModel.removePlaylist,
updatePlaylistName: libraryModel.updatePlaylistName,
pinnedAlbums: pinnedAlbums,
pinnedAlbums: libraryModel.pinnedAlbums,
addPinnedAlbum: libraryModel.addPinnedAlbum,
isPinnedAlbum: libraryModel.isPinnedAlbum,
removePinnedAlbum: libraryModel.removePinnedAlbum,
starredStations: starredStations,
starredStations: libraryModel.starredStations,
unStarStation: libraryModel.unStarStation,
play: play,
countryCode: _countryCode,
Expand All @@ -222,7 +203,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
final yaruMasterDetailPage = MasterDetailPage(
setIndex: libraryModel.setIndex,
totalListAmount: libraryModel.totalListAmount,
index: index,
index: libraryModel.index,
masterItems: masterItems,
addPlaylist: libraryModel.addPlaylist,
);
Expand Down
51 changes: 27 additions & 24 deletions lib/src/library/library_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -181,16 +181,20 @@ class LibraryService {
final _playlistsController = StreamController<bool>.broadcast();
Stream<bool> get playlistsChanged => _playlistsController.stream;

void addPlaylist(String name, Set<Audio> audios) {
_playlists.putIfAbsent(name, () => audios);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
void addPlaylist(String id, Set<Audio> audios) {
if (!_playlists.containsKey(id)) {
_playlists.putIfAbsent(id, () => audios);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}
}

void removePlaylist(String name) {
_playlists.remove(name);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
void removePlaylist(String id) {
if (_playlists.containsKey(id)) {
_playlists.remove(id);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}
}

void updatePlaylistName(String oldName, String newName) {
Expand All @@ -199,33 +203,32 @@ class LibraryService {
if (oldList != null) {
_playlists.remove(oldName);
_playlists.putIfAbsent(newName, () => oldList);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}

writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}

void addAudioToPlaylist(String playlist, Audio audio) {
final p = _playlists[playlist];
if (p != null) {
for (var e in p) {
void addAudioToPlaylist(String id, Audio audio) {
final playlist = _playlists[id];
if (playlist != null) {
for (var e in playlist) {
if (e.path == audio.path) {
return;
}
}
p.add(audio);
playlist.add(audio);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}

void removeAudioFromPlaylist(String playlist, Audio audio) {
final p = _playlists[playlist];
if (p != null && p.contains(audio)) {
p.remove(audio);
void removeAudioFromPlaylist(String id, Audio audio) {
final playlist = _playlists[id];
if (playlist != null && playlist.contains(audio)) {
playlist.remove(audio);
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}
writeAudioMap(_playlists, kPlaylistsFileName)
.then((_) => _playlistsController.add(true));
}

// Podcasts
Expand Down
2 changes: 2 additions & 0 deletions lib/src/library/playlist_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class PlaylistPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return AudioPage(
showAudioTileHeader:
playlist.value.any((e) => e.audioType != AudioType.podcast),
onTextTap: onTextTap,
audioPageType: AudioPageType.playlist,
image: FallBackHeaderImage(
Expand Down
5 changes: 5 additions & 0 deletions lib/src/player/full_height_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ class FullHeightPlayer extends StatelessWidget {
children: [
if (!isMobile)
HeaderBar(
title: Text(
audio?.title ?? '',
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
foregroundColor: isVideo == true ? Colors.white : null,
backgroundColor:
isVideo == true ? Colors.black : Colors.transparent,
Expand Down
87 changes: 59 additions & 28 deletions lib/src/player/queue_popup.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:scroll_to_index/scroll_to_index.dart';

import '../../common.dart';
import '../../data.dart';
import '../../library.dart';
import '../../player.dart';
import '../l10n/l10n.dart';
import 'full_height_player_image.dart';
Expand All @@ -16,6 +17,7 @@ class QueuePopup extends StatelessWidget {
@override
Widget build(BuildContext context) {
final playerModel = context.read<PlayerModel>();
final libraryModel = context.read<LibraryModel>();

return IconButton(
padding: EdgeInsets.zero,
Expand All @@ -29,7 +31,9 @@ class QueuePopup extends StatelessWidget {
builder: (context) {
return ChangeNotifierProvider.value(
value: playerModel,
child: const QueueDialog(),
child: QueueDialog(
addPlaylist: libraryModel.addPlaylist,
),
);
},
);
Expand All @@ -41,8 +45,11 @@ class QueuePopup extends StatelessWidget {
class QueueDialog extends StatefulWidget {
const QueueDialog({
super.key,
required this.addPlaylist,
});

final void Function(String name, Set<Audio> audios) addPlaylist;

@override
State<QueueDialog> createState() => _QueueDialogState();
}
Expand Down Expand Up @@ -83,7 +90,7 @@ class _QueueDialogState extends State<QueueDialog> {

return AlertDialog(
titlePadding: const EdgeInsets.only(left: 25, right: 25, top: 50),
contentPadding: const EdgeInsets.only(bottom: 50, top: 35),
contentPadding: const EdgeInsets.only(bottom: 25, top: 5),
title: Column(
children: [
FullHeightPlayerImage(
Expand All @@ -107,34 +114,58 @@ class _QueueDialogState extends State<QueueDialog> {
content: SizedBox(
width: 400,
height: 500,
child: ReorderableListView.builder(
scrollController: _controller,
padding: const EdgeInsets.only(
left: 25,
right: 25,
),
shrinkWrap: true,
itemBuilder: (context, index) {
final audio = queue.elementAt(index);
final selected = audio == currentAudio;

return AutoScrollTag(
key: ValueKey(index),
controller: _controller,
index: index,
child: ListTile(
contentPadding: const EdgeInsets.only(right: 20, left: 20),
selected: selected,
key: ValueKey(index),
title: Padding(
padding: const EdgeInsets.only(right: 20),
child: Text(audio.title ?? ''),
child: Column(
children: [
Expanded(
child: ReorderableListView.builder(
scrollController: _controller,
padding: const EdgeInsets.only(
left: 25,
right: 25,
),
shrinkWrap: true,
itemBuilder: (context, index) {
final audio = queue.elementAt(index);
final selected = audio == currentAudio;

return AutoScrollTag(
key: ValueKey(index),
controller: _controller,
index: index,
child: ListTile(
contentPadding:
const EdgeInsets.only(right: 20, left: 20),
selected: selected,
key: ValueKey(index),
title: Padding(
padding: const EdgeInsets.only(right: 20),
child: Text(audio.title ?? ''),
),
),
);
},
itemCount: queue.length,
onReorder: playerModel.moveAudioInQueue,
),
);
},
itemCount: queue.length,
onReorder: playerModel.moveAudioInQueue,
),
Row(
children: [
Padding(
padding: const EdgeInsets.only(
left: 45,
top: 15,
),
child: OutlinedButton(
onPressed: () => widget.addPlaylist(
'${context.l10n.queue} ${DateTime.now()}',
Set.from(queue),
),
child: Text(context.l10n.createNewPlaylist),
),
),
],
),
],
),
),
);
Expand Down

0 comments on commit 3d724ea

Please sign in to comment.