From fa649394d16cba6c021da8daa96773fb359f40d2 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:44:13 -0600 Subject: [PATCH] fix(metadata): scope track row selection Bind nested editor controls to the delegate index so virtualized rows never resolve an undefined context property. cx --- crates/qbz-qt/qml/controls/TagEditorModal.qml | 19 +++++++++++++------ crates/qbz-qt/src/tag_editor_qt.rs | 3 +++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/crates/qbz-qt/qml/controls/TagEditorModal.qml b/crates/qbz-qt/qml/controls/TagEditorModal.qml index 569f31a91..be2ed9f90 100644 --- a/crates/qbz-qt/qml/controls/TagEditorModal.qml +++ b/crates/qbz-qt/qml/controls/TagEditorModal.qml @@ -892,10 +892,13 @@ Item { spacing: 0 model: root.tracks delegate: Rectangle { + id: trackDelegate required property var modelData + required property int index width: trackList.width height: 36 - color: index % 2 ? theme.surfaceElevated : "transparent" + color: trackDelegate.index % 2 + ? theme.surfaceElevated : "transparent" border.width: 1 border.color: theme.borderSubtle Row { @@ -915,7 +918,8 @@ Item { selectByMouse: true inputMethodHints: Qt.ImhDigitsOnly onTextEdited: modelData.discNumber = text - onActiveFocusChanged: if (activeFocus) root.selectedTrackIndex = index + onActiveFocusChanged: if (activeFocus) + root.selectedTrackIndex = trackDelegate.index } } Rectangle { width: 1; height: parent.height; color: theme.borderSubtle } @@ -934,7 +938,8 @@ Item { selectByMouse: true inputMethodHints: Qt.ImhDigitsOnly onTextEdited: modelData.trackNumber = text - onActiveFocusChanged: if (activeFocus) root.selectedTrackIndex = index + onActiveFocusChanged: if (activeFocus) + root.selectedTrackIndex = trackDelegate.index } } Rectangle { width: 1; height: parent.height; color: theme.borderSubtle } @@ -953,7 +958,8 @@ Item { selectByMouse: true clip: true onTextEdited: modelData.title = text - onActiveFocusChanged: if (activeFocus) root.selectedTrackIndex = index + onActiveFocusChanged: if (activeFocus) + root.selectedTrackIndex = trackDelegate.index } } Rectangle { width: 1; height: parent.height; color: theme.borderSubtle } @@ -972,7 +978,8 @@ Item { selectByMouse: true clip: true onTextEdited: modelData.artistCredit = text - onActiveFocusChanged: if (activeFocus) root.selectedTrackIndex = index + onActiveFocusChanged: if (activeFocus) + root.selectedTrackIndex = trackDelegate.index } } Rectangle { width: 1; height: parent.height; color: theme.borderSubtle } @@ -989,7 +996,7 @@ Item { elide: Text.ElideMiddle MouseArea { anchors.fill: parent - onClicked: root.selectedTrackIndex = index + onClicked: root.selectedTrackIndex = trackDelegate.index } } } diff --git a/crates/qbz-qt/src/tag_editor_qt.rs b/crates/qbz-qt/src/tag_editor_qt.rs index 0be8d4793..0929d4418 100644 --- a/crates/qbz-qt/src/tag_editor_qt.rs +++ b/crates/qbz-qt/src/tag_editor_qt.rs @@ -1838,5 +1838,8 @@ mod tests { assert!(qml.contains("!QbzTagEditor.editorLoading")); assert!(qml.contains("event.kind === \"artwork-selected\"")); assert!(qml.contains("QbzTagEditor.chooseArtwork()")); + assert!(qml.contains("id: trackDelegate")); + assert!(qml.contains("root.selectedTrackIndex = trackDelegate.index")); + assert!(!qml.contains("root.selectedTrackIndex = index")); } }