feat(qt): playlist manager, folders, importer and the Library parity round
Ports the whole playlist-organisation domain, which had no counterpart in this frontend, plus the Library work the owner asked not to defer. Playlist Manager. New controller (playlist_manager_qt, _rows, _ops) over the already-ported folders_qt repository, which until now had zero consumers. Grid, list and folder-tree modes; sort, filter and search; folder cards and chips; drag reorder and up/down arrows. Reached from the sidebar's "..." menu, whose New folder / Manage playlists / Import rows had been rendering dimmed and inert behind a comment saying the seam did not exist. Folders. QbzFolderEdit plus the create/edit modals and PmFolderIcon: preset or custom-image icons, colour, hidden flag, delete. Deleting a folder nulls its LOCAL members' folder_id explicitly, because the app keeps the foreign_keys pragma off, so the schema's ON DELETE SET NULL never fires for them. QbzPlaylistEdit. One shared rename/description/delete editor replacing the inline popup in PlaylistView. Three corrections the old path had wrong: the description is carried through a rename instead of being written as NULL, a FOLLOWED playlist routes to unsubscribe (playlist/delete returns 200 and silently no-ops on a playlist you do not own), and the post-delete back navigation is conditional on actually being on that playlist's page, so deleting from the manager no longer navigates you off it. Importer. Spotify / Apple Music / Tidal / Deezer, over the shared qbz-playlist-import crate. Picker local mode. The reference's four-case matrix — target local or Qobuz, payload local refs or Qobuz ids. Local playlists list unconditionally and Qobuz ones only when online. Local refs onto a Qobuz playlist write the library.db sidecar at next_playlist_sidecar_position(pid, qobuz_count); the 0-based enumerate the reference used before collided slots and lost rows. The carried payload can no longer be parsed as a catalog id when it is a library row id. Unblocks the local bulk add-to-playlist. Library. A-Z jump strip, Albums list mode, Artists side panel, per-tab persistence and multi-select. Preferences land in the same <data-dir>/qbz/favorites_ui.json the shipping build writes, so switching between the two frontends keeps them. LibraryView is split into views/library/ on the way past 1800 lines. Local library. Group-by now persists; playback queues the order on screen rather than the SQL page order; switching album-identity mode invalidates the Artists tab; artist matching folds diacritics and compares normalized credit parts, so "Air" stops listing "Airbourne" and "Beyonce" stops being two artists. Offline. activate_offline never persisted a last-user marker, so every per-user path resolved to None and all local reads came back empty; a session that started offline saw no local playlists at all. The sidebar's load-once latch was function-local and therefore unreachable from the logout reset, so a second login never rebuilt the tree. Both are session-scoped now, and the sidebar Refresh row runs the local-safe verb instead of being dimmed with no way to recover. Also fixes, found while verifying rather than reported: artwork derivatives were written straight to their final path, so a QML Image resolving one mid-encode opened a truncated png and Qt cached that failure against the URL for the rest of the session; Library's track group separators referenced a Component declared in another delegate's scope and could never render; the genre filter was drawn on Tracks and Albums but applied only on All; an All-feed row called a player method that does not exist; and the sidebar's drop-hot highlight used Slint's #RRGGBBAA literals in Qt's #AARRGGBB slot. 17 new msgids across all 8 locales. cc
This commit is contained in:
115 files changed
+20778
-1637
No files matched your search
@@ -28,13 +28,16 @@
|
||||
// rows/TrackCols.qml for both.
|
||||
//
|
||||
// POC-NOTEs, each deliberate and each with a precedent in this port:
|
||||
// - NO multi-select bar. qml/rows/TrackRow.qml has no multi-select arm, and
|
||||
// one of the .slint bar's seven actions (add-to-playlist) still has no
|
||||
// bridge seam at all — LabelView.qml made the same call. (add-to-mixtape
|
||||
// IS live now: the per-row menu reaches QbzMyQbzAdd.open; it is only the
|
||||
// BULK form that is missing, for want of a selection.) The .slint header's
|
||||
// select disc renders DIMMED and inert here (the ArtistView / LabelView
|
||||
// precedent).
|
||||
// - NO multi-select bar — and the ORIGINAL reason is now STALE on both
|
||||
// halves: rows/TrackRow.qml:116 DOES have the `selectMode` arm, and
|
||||
// add-to-playlist DOES have a bridge seam (QbzPlaylistPicker.openForTracks,
|
||||
// src/playlist_picker_bridge.rs). What is still missing here is only the
|
||||
// selection STATE and the bar itself — LibraryView.qml's `tracksSelected`
|
||||
// map + qml/controls/MultiSelectBar-style host is the pattern to copy.
|
||||
// Until then the .slint header's select disc renders DIMMED and inert here
|
||||
// (the ArtistView / LabelView precedent). Per-ROW add-to-playlist and
|
||||
// add-to-mixtape are both LIVE on this page already (the shared TrackRow
|
||||
// menu).
|
||||
// - The "Add to playlist" disc (list-plus) is inert in the .slint too — it
|
||||
// carries no `clicked` there (MixView.slint:182-188) — so it is inert
|
||||
// here, dimmed the same way, rather than silently absent.
|
||||
|
||||
Reference in new issue
Block a user