fix(qt): a pulled track's menu offers nothing that leads nowhere
Smoke found the row rendering correctly and the menu still offering four entries that cannot work on it. Add to mixtape and Add to playlist are refused, in both row implementations. The precedent was already there -- `hasPlaylistAddSeam` excluded a broken local ref for the same reason -- this is the same idea with a different cause. Gated on `pulled` rather than `pulledDead`, so a downloaded copy is refused too: what a playlist or mixtape stores is the Qobuz catalog id, which is dead on every other device, every other surface and for anyone the list is shared with. The local copy playing here does not make the row safe to seed elsewhere. Both share links go too. Qobuz's page for a withdrawn track is gone and Song.link resolves through it, so each one rendered and led nowhere. Track info as well: it needs the catalog record the pull took away. That empties the menu on a surface that does not offer the repair -- an album page, search results -- so the row menu no longer opens when its model comes back empty. An empty popup reads as a broken control rather than as "there is nothing to do with this row". The ArtistView fork keeps its go-to entries and can never reach that state. cc
This commit is contained in:
2 files changed
+50
-11
No files matched your search
@@ -1478,8 +1478,8 @@ Rectangle {
|
||||
// "Play next" here would render and no-op — the
|
||||
// rendered-and-inert defect this menu's own header refuses
|
||||
// ("ABSENT, not dead"). The row keeps its menu because the
|
||||
// rest of it (add to playlist / mixtape, go-to) still works and
|
||||
// because a right-clickable dead row is what §5.2 asks for.
|
||||
// rest of it (go-to) still works and because a right-clickable
|
||||
// dead row is what §5.2 asks for.
|
||||
if (!popRow.pulledDead) {
|
||||
m.push({ "label": t("Play now", r), "icon": "play-fill", "action": "play" })
|
||||
m.push({ "label": t("Play next", r), "icon": "list-start", "action": "next" })
|
||||
@@ -1488,8 +1488,16 @@ Rectangle {
|
||||
m.push({ "label": fav ? t("Remove from Library", r) : t("Add to Library", r),
|
||||
"icon": fav ? "heart-filled" : "heart", "action": "favorite" })
|
||||
}
|
||||
m.push({ "label": t("Add to mixtape", r), "icon": "cassette-tape", "action": "mixtape" })
|
||||
m.push({ "label": t("Add to playlist", r), "icon": "list-music", "action": "add-to-playlist" })
|
||||
// A pulled track is refused BOTH containers, and on `pulled`
|
||||
// rather than `pulledDead`: a downloaded copy plays for this
|
||||
// user on this machine, but what a playlist or a mixtape stores
|
||||
// is the Qobuz catalog id, which resolves to nothing everywhere
|
||||
// else. Seeding a dead row into a collection is the one thing
|
||||
// worth refusing outright.
|
||||
if (!popRow.pulled) {
|
||||
m.push({ "label": t("Add to mixtape", r), "icon": "cassette-tape", "action": "mixtape" })
|
||||
m.push({ "label": t("Add to playlist", r), "icon": "list-music", "action": "add-to-playlist" })
|
||||
}
|
||||
// The offline block goes with the transport, and for the same
|
||||
// reason: a pulled track has no stream url left, so the
|
||||
// download arm would fail and a REFRESH would destroy the only
|
||||
|
||||
Reference in new issue
Block a user