92 lines
3.1 KiB
QML
92 lines
3.1 KiB
QML
// One chip per channel the selected output actually has.
|
|
//
|
|
// "Test" used to play a single front-centre sample, which answers "is this the
|
|
// right device" and nothing else. A surround receiver wired to the wrong socket
|
|
// passes that test. Each chip plays its own channel's sample, so the answer to
|
|
// "is the rear left speaker actually rear left" is one click rather than a
|
|
// guess -- and the chip lights while its sample is playing, so a silent speaker
|
|
// is visibly a silent speaker rather than a click that did nothing.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
import qs.widgets
|
|
|
|
Flow {
|
|
id: root
|
|
|
|
property var node: null
|
|
|
|
// [{ name, label }], ordered, from the node's own channel map.
|
|
readonly property var channels: root.node ? SoundTest.channelsFor(root.node) : []
|
|
|
|
width: parent ? parent.width : 620
|
|
spacing: 10
|
|
|
|
// Chips share the width evenly while they fit and wrap when they do not, so
|
|
// stereo gets two wide chips and 7.1 gets rows of whatever fits.
|
|
readonly property int columns: Math.max(1,
|
|
Math.min(root.channels.length, Math.floor(root.width / 150)))
|
|
readonly property real chipWidth: root.columns > 0
|
|
? (root.width - root.spacing * (root.columns - 1)) / root.columns
|
|
: root.width
|
|
|
|
Repeater {
|
|
model: root.channels
|
|
|
|
Rectangle {
|
|
id: chip
|
|
|
|
required property var modelData
|
|
|
|
readonly property string channelName: String(chip.modelData.name ?? "")
|
|
readonly property bool playing: SoundTest.playingChannel === chip.channelName
|
|
|
|
width: root.chipWidth
|
|
implicitHeight: 44
|
|
radius: Theme.cardRadius
|
|
color: chip.playing
|
|
? Theme.alpha(Theme.accent, 0.20)
|
|
: Theme.alpha(Theme.fg, chipHover.hovered ? 0.08 : 0.04)
|
|
border.width: 1
|
|
border.color: chip.playing
|
|
? Theme.alpha(Theme.accent, 0.60)
|
|
: Theme.alpha(Theme.fg, 0.09)
|
|
|
|
Accessible.role: Accessible.Button
|
|
Accessible.name: "Play " + String(chip.modelData.label ?? "")
|
|
|
|
Row {
|
|
anchors.centerIn: parent
|
|
spacing: 8
|
|
|
|
ThemedIcon {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
size: 16
|
|
icon: "audio-volume-high-symbolic"
|
|
iconFallback: "audio-speakers-symbolic"
|
|
tint: chip.playing ? Theme.fg : Theme.fgDim
|
|
}
|
|
|
|
Text {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
text: String(chip.modelData.label ?? "")
|
|
color: chip.playing ? Theme.fg : Theme.fgDim
|
|
font.family: Theme.fontFamily
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
font.weight: Font.DemiBold
|
|
}
|
|
}
|
|
|
|
HoverHandler {
|
|
id: chipHover
|
|
cursorShape: Qt.PointingHandCursor
|
|
}
|
|
|
|
TapHandler {
|
|
onTapped: SoundTest.playChannel(root.node, chip.channelName)
|
|
}
|
|
}
|
|
}
|
|
}
|