// One line in a detail list (a wifi network, a bluetooth device, an output // device). Icon, two lines of text, and an optional trailing slot. import QtQuick import Quickshell import qs.config import qs.widgets Rectangle { id: root property string icon: "" // Used when `icon` is not in the active icon theme — several of the names // GNOME uses only exist in Adwaita, and iconPath() returns "" otherwise. property string iconFallback: "dialog-information-symbolic" property string label: "" property string sublabel: "" property bool selected: false property bool dimmed: false default property alias trailing: trailingRow.data signal clicked implicitHeight: 44 radius: Theme.cardRadius - 2 border.width: 0 color: { if (root.selected) return Theme.alpha(Theme.accent, Theme.activeAlpha); if (mouse.pressed) return Theme.alpha(Theme.fg, Theme.activeAlpha); if (mouse.containsMouse) return Theme.alpha(Theme.fg, Theme.hoverAlpha); return "transparent"; } Behavior on color { ColorAnimation { duration: Theme.durFast } } opacity: root.dimmed ? 0.5 : 1.0 // Declared first so anything in the trailing slot stacks above it and can // take its own clicks (a per-row disconnect button, say). MouseArea { id: mouse anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: root.clicked() } ThemedIcon { id: leading anchors.left: parent.left anchors.leftMargin: 10 anchors.verticalCenter: parent.verticalCenter size: 20 icon: root.icon iconFallback: root.iconFallback tint: root.selected ? Theme.accent : Theme.fg visible: root.icon !== "" } Column { anchors.left: leading.visible ? leading.right : parent.left anchors.leftMargin: leading.visible ? 10 : 12 anchors.right: trailingRow.left anchors.rightMargin: 8 anchors.verticalCenter: parent.verticalCenter spacing: 1 Text { width: parent.width text: root.label color: Theme.fg elide: Text.ElideRight font.family: Theme.fontFamily font.pixelSize: Theme.fontSize font.weight: root.selected ? Font.DemiBold : Font.Normal } Text { width: parent.width visible: root.sublabel !== "" text: root.sublabel color: Theme.fgDim elide: Text.ElideRight font.family: Theme.fontFamily font.pixelSize: Theme.fontSizeSmall } } // Full-height rather than vertically centered so slot contents can anchor // their own verticalCenter to it without a size loop. Row { id: trailingRow anchors.right: parent.right anchors.rightMargin: 10 anchors.top: parent.top anchors.bottom: parent.bottom spacing: 6 } }