feat(queue): Play later everywhere — every context menu and bulk bar (#442)
Extends Play later (end of the manual block) from track rows to every surface that already offered Play next / Add to queue: - playback.rs: enqueue_album_later, enqueue_playlist_later (mixed sidecar interleave), enqueue_artist_top_later, enqueue_tracks_later, enqueue_local_tracks_later — all NATURAL order (each add_track_later appends, no reverse), QConnect controller routing via play_later_batch_on_peer_if_active, and post-add queue sync. - local_playlist::enqueue_later_by_id (source-aware rows, offline-only stamp preserved), myqbz_play RowMode::PlayLater + BulkEnqueueMode. - 19 dispatch arms in main.rs (album/playlist/artist/label/mix/ favorites/local-library/album-page/disc/myqbz dialects). - 12 context menus + 10 bulk bars in .slint: list-plus icon between Play next and Add to queue, popup heights bumped. The immersive tap-action dropdown is deliberately untouched (it is a configurable single-tap behavior setting, not a context menu). km
This commit is contained in:
22 files changed
+785
-92
No files matched your search
@@ -1029,12 +1029,12 @@ export global AlbumActions {
|
||||
// Toggle multi-select (track selection) mode on the album track list.
|
||||
callback toggle-multi-select();
|
||||
// Bulk-bar action over the selected rows (id = "select-all" | "play-next"
|
||||
// | "queue" | "add-to-playlist" | "add-to-favorites" | "make-offline" |
|
||||
// "clear").
|
||||
// | "play-later" | "queue" | "add-to-playlist" | "add-to-favorites" |
|
||||
// "make-offline" | "clear").
|
||||
callback bulk-action(string);
|
||||
// Per-disc context-menu action on a multi-disc album's "Disc N" header —
|
||||
// scoped to that disc's tracks only (action = "play" | "shuffle" | "queue"
|
||||
// | "play-next"). The whole-album header buttons are unaffected.
|
||||
// | "play-later" | "play-next"). The whole-album header buttons are unaffected.
|
||||
callback disc-action(int /* disc number */, string /* action */);
|
||||
// Open an external link (Last.fm / Discogs / MusicBrainz) in the system
|
||||
// browser. The url is prebuilt by the controller (AlbumState.*-url).
|
||||
@@ -1365,13 +1365,13 @@ export global LocalLibraryActions {
|
||||
callback open-album(string /* album id */);
|
||||
// Open an artist (lands with the Artists slice).
|
||||
callback open-artist(string /* artist id */);
|
||||
// Per-card action (play / queue / play-next / toggle-select). The Albums
|
||||
// grid honors the shared AlbumCollectionView contract.
|
||||
// Per-card action (play / queue / play-next / play-later / toggle-select).
|
||||
// The Albums grid honors the shared AlbumCollectionView contract.
|
||||
callback album-action(string /* album id */, string /* action */);
|
||||
// Toggle the Albums-grid multi-select mode.
|
||||
callback albums-toggle-multi-select();
|
||||
// Albums bulk bar action: select-all | clear | queue | play-next |
|
||||
// add-to-playlist | add-to-mixtape.
|
||||
// play-later | add-to-playlist | add-to-mixtape.
|
||||
callback albums-bulk-action(string /* action */);
|
||||
// Windowed grid: the visible row band changed (item indices into
|
||||
// albums-visible, prefetch margin included) — dispatch artwork for it.
|
||||
@@ -1381,7 +1381,7 @@ export global LocalLibraryActions {
|
||||
callback tracks-search(string /* query */);
|
||||
callback tracks-load-more();
|
||||
callback tracks-retry();
|
||||
// Per-row play/queue/toggle-select (action: play|play-next|queue|toggle-select).
|
||||
// Per-row play/queue/toggle-select (action: play|play-next|play-later|queue|toggle-select).
|
||||
callback track-action(string /* track id */, string /* action */);
|
||||
// Group-by mode (off|album|artist|name), persisted.
|
||||
callback tracks-set-group(string /* mode */);
|
||||
@@ -1389,7 +1389,7 @@ export global LocalLibraryActions {
|
||||
callback tracks-set-sort(string /* key */);
|
||||
// Toggle the multi-select checkbox column.
|
||||
callback tracks-toggle-multi-select();
|
||||
// Bulk bar action: select-all | clear | queue | play-next | add-to-playlist.
|
||||
// Bulk bar action: select-all | clear | queue | play-next | play-later | add-to-playlist.
|
||||
callback tracks-bulk-action(string /* action */);
|
||||
|
||||
// --- Folders tab ---
|
||||
@@ -1416,7 +1416,7 @@ export global LocalLibraryActions {
|
||||
callback folders-toggle-select-mode();
|
||||
callback folders-toggle-folder-select(string /* folder path */);
|
||||
callback folders-toggle-track-select(string /* track path */);
|
||||
callback folders-bulk-action(string /* select-all|clear|queue|play-next|add-to-playlist */);
|
||||
callback folders-bulk-action(string /* select-all|clear|queue|play-next|play-later|add-to-playlist */);
|
||||
|
||||
// --- Ephemeral folder (ad-hoc play) ---
|
||||
// Open the native folder picker → scan → show the ephemeral pane.
|
||||
@@ -1501,8 +1501,8 @@ export global LocalAlbumActions {
|
||||
callback add-to-playlist();
|
||||
callback add-to-mixtape();
|
||||
callback play-track(string /* track id */);
|
||||
// Per-row context-menu actions beyond "play" (play-next / queue /
|
||||
// add-to-playlist) — resolved against the open version's track cache.
|
||||
// Per-row context-menu actions beyond "play" (play-next / play-later /
|
||||
// queue / add-to-playlist) — resolved against the open version's track cache.
|
||||
callback track-menu-action(string /* track id */, string /* action */);
|
||||
callback select-version(int);
|
||||
// Client-side track filter (mirrors AlbumActions.search), applied over the
|
||||
@@ -1510,7 +1510,8 @@ export global LocalAlbumActions {
|
||||
callback search(string /* query */);
|
||||
// Per-disc context-menu action on a multi-disc local album's "Disc N"
|
||||
// header — scoped to that disc's tracks only (action = "play" | "shuffle" |
|
||||
// "queue" | "play-next"). The whole-album header buttons are unaffected.
|
||||
// "queue" | "play-later" | "play-next"). The whole-album header buttons are
|
||||
// unaffected.
|
||||
callback disc-action(int /* disc number */, string /* action */);
|
||||
}
|
||||
|
||||
@@ -3659,8 +3660,8 @@ export global ArtistActions {
|
||||
// Toggle Popular Tracks multi-select mode.
|
||||
callback toggle-top-tracks-select();
|
||||
// Bulk-bar action over the selected Popular Tracks (id = "select-all" |
|
||||
// "play-next" | "queue" | "add-to-playlist" | "add-to-favorites" |
|
||||
// "clear").
|
||||
// "play-next" | "play-later" | "queue" | "add-to-playlist" |
|
||||
// "add-to-favorites" | "clear").
|
||||
callback top-tracks-bulk-action(string);
|
||||
// Popular Tracks section "more" menu (id = "next-all" | "queue-all" |
|
||||
// "shuffle-all" | "playlist-all").
|
||||
@@ -5147,8 +5148,8 @@ export global FavoritesState {
|
||||
in property <[DiscoverSection]> albums-grouped: []; // group-by sections
|
||||
in-out property <string> albums-view-mode: "grid"; // "grid" | "list"
|
||||
// Albums LIST-mode multi-select (owner 2026-07-24): checkbox column on
|
||||
// the rows + the bulk bar (un-favorite / play-next / queue). List only —
|
||||
// switching to grid forces it off.
|
||||
// the rows + the bulk bar (un-favorite / play-next / play-later / queue).
|
||||
// List only — switching to grid forces it off.
|
||||
in-out property <bool> albums-multi-select: false;
|
||||
in property <int> albums-selected-count: 0;
|
||||
in-out property <string> albums-search: "";
|
||||
@@ -5212,7 +5213,7 @@ export global FavoritesActions {
|
||||
callback toggle-multi-select();
|
||||
callback bulk-action(string /* select-all | remove-selected | clear */);
|
||||
// Albums list-mode multi-select: toggle the edit mode + the bulk bar
|
||||
// actions (select-all | play-next | queue | remove-selected | clear).
|
||||
// actions (select-all | play-next | play-later | queue | remove-selected | clear).
|
||||
callback albums-toggle-multi-select();
|
||||
callback albums-bulk-action(string);
|
||||
callback album-action(string /* album id */, string /* action */);
|
||||
@@ -5227,7 +5228,7 @@ export global FavoritesActions {
|
||||
callback labels-random();
|
||||
callback search-playlists(string /* query */);
|
||||
callback playlists-set-view(string /* grid | list */);
|
||||
callback playlist-action(string /* playlist id */, string /* play | play-next | queue | share | favorite | follow | unfollow | copy */);
|
||||
callback playlist-action(string /* playlist id */, string /* play | play-next | play-later | queue | share | favorite | follow | unfollow | copy */);
|
||||
callback search-artists(string /* query */);
|
||||
callback artists-set-view(string /* grid | sidepanel */);
|
||||
callback artists-set-group(string /* off | alpha */);
|
||||
|
||||
Reference in new issue
Block a user