feat(qt): Track info and Album info are selectable and copy basic or full text

Every field of both modals is a QbzSelectableText — artist, label and
musician names stay links. A copy button beside the close cross opens a
flyout: "Copy basic data" puts "{Track} - {Album} - {Artist}" (or
"{Album} - {Artist}") on the clipboard; "Copy full" formats the whole sheet
as plain text — the track's metadata, credits and copyright, or the album's
header plus the ACTIVE tab: credits per track with performers, or the
review. Album credit row heads stay plain because their click expands the
row. The two new strings ship in all eight catalogs.

cc
This commit is contained in:
vicrodh committed 2026-09-13 20:03:36 -06:00
1 parent 9ea290d58b
commit 3f3c4ad548
12 files changed
+331 -156

No files matched your search

+17 -28
View File
@@ -9,6 +9,7 @@
// { "role": "PRODUCER", "roleRaw": "Producer", "names": ["A", "B"] }
import QtQuick
import "../controls"
import "../theme"
Column {
@@ -33,46 +34,34 @@ Column {
width: colW
spacing: 6
Text {
QbzSelectableText {
width: cc.colW
text: cc.cell ? (cc.cell.role || "") : ""
color: cc.overAmbient ? "#b3ffffff" : theme.textMuted
style: cc.overAmbient ? Text.Raised : Text.Normal
styleColor: "#b0000000"
font.pixelSize: 11
font.weight: theme.weightSemibold
font.letterSpacing: 0.5
wrapMode: Text.WordWrap
raised: cc.overAmbient
pixelSize: 11
weight: theme.weightSemibold
letterSpacing: 0.5
}
Column {
spacing: 2
Repeater {
model: cc.cell ? (cc.cell.names || []) : []
delegate: Item {
// Selectable AND a link: a click lands on the musician, a drag
// selects the name (QbzSelectableText, rich-text anchor).
delegate: QbzSelectableText {
id: nameRow
required property string modelData
width: cc.colW
height: nameText.implicitHeight
Text {
id: nameText
width: cc.colW
text: nameRow.modelData
color: nameArea.containsMouse ? cc.accentColor
: (cc.overAmbient ? "#f2ffffff" : theme.textPrimary)
style: cc.overAmbient ? Text.Raised : Text.Normal
styleColor: "#b0000000"
font.pixelSize: 14
wrapMode: Text.WordWrap
}
MouseArea {
id: nameArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: cc.nameClicked(nameRow.modelData,
cc.cell ? (cc.cell.roleRaw || "") : "")
}
text: nameRow.modelData
color: cc.overAmbient ? "#f2ffffff" : theme.textPrimary
linkHref: "musician"
linkHoverColor: cc.accentColor
raised: cc.overAmbient
pixelSize: 14
onLinkActivated: cc.nameClicked(nameRow.modelData,
cc.cell ? (cc.cell.roleRaw || "") : "")
}
}
}