diff --git a/modules/HoverPanel.qml b/modules/HoverPanel.qml index d511214..fb84511 100644 --- a/modules/HoverPanel.qml +++ b/modules/HoverPanel.qml @@ -31,6 +31,7 @@ PanelWindow { // Shared required property color accentColor + property string panelTitle: "" property string panelNamespace: "nova-panel" property real contentWidth: 220 @@ -49,7 +50,7 @@ PanelWindow { x: panelContainer.x + panelContainer.width - 28 y: 0 width: 28 - height: 28 + height: 24 } WlrLayershell.layer: WlrLayer.Overlay @@ -192,7 +193,7 @@ PanelWindow { x: 0 y: -height width: root.contentWidth - height: panelContent.height + height: _panelColumn.height opacity: 0 // Popup mode: eat clicks on panel background so outer dismiss doesn't fire @@ -209,52 +210,75 @@ PanelWindow { } Column { - id: panelContent + id: _panelColumn width: root.contentWidth - } - // Pin button — top-right corner, hover mode only - Item { - visible: !root.popupMode && (root.panelHovered || root._pinned) - x: parent.width - width - 4 - y: 4 - width: 20 - height: 20 - z: 2 - opacity: pinHover.hovered || root._pinned ? 1 : 0.35 + // Header row: title (optional) + pin button — hover mode only + Item { + visible: !root.popupMode + width: parent.width + height: 24 - Behavior on opacity { - NumberAnimation { - duration: 100 + Text { + visible: root.panelTitle !== "" + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.verticalCenter: parent.verticalCenter + text: root.panelTitle + color: root.accentColor + font.pixelSize: M.Theme.fontSize - 1 + font.bold: true + font.family: M.Theme.fontFamily } - } - HoverHandler { - id: pinHover - } + Item { + visible: root.panelHovered || root._pinned + anchors.right: parent.right + anchors.rightMargin: 4 + anchors.verticalCenter: parent.verticalCenter + width: 20 + height: 20 + opacity: pinHover.hovered || root._pinned ? 1 : 0.35 - TapHandler { - cursorShape: Qt.PointingHandCursor - onTapped: { - root._pinned = !root._pinned; - if (!root._pinned && !root.showPanel) - root.dismiss(); - } - } + Behavior on opacity { + NumberAnimation { + duration: 100 + } + } - Text { - anchors.centerIn: parent - text: root._pinned ? "\uDB81\uDC03" : "\uDB82\uDD31" - color: root._pinned ? root.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 1 - font.family: M.Theme.iconFontFamily + HoverHandler { + id: pinHover + } - Behavior on color { - ColorAnimation { - duration: 100 + TapHandler { + cursorShape: Qt.PointingHandCursor + onTapped: { + root._pinned = !root._pinned; + if (!root._pinned && !root.showPanel) + root.dismiss(); + } + } + + Text { + anchors.centerIn: parent + text: root._pinned ? "\uDB81\uDC03" : "\uDB82\uDD31" + color: root._pinned ? root.accentColor : M.Theme.base04 + font.pixelSize: M.Theme.fontSize - 1 + font.family: M.Theme.iconFontFamily + + Behavior on color { + ColorAnimation { + duration: 100 + } + } } } } + + Column { + id: panelContent + width: parent.width + } } } diff --git a/modules/Mpris.qml b/modules/Mpris.qml index d24c39e..9d92b91 100644 --- a/modules/Mpris.qml +++ b/modules/Mpris.qml @@ -75,7 +75,13 @@ M.BarSection { required property var bar property bool _pinned: false - readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered + property bool _switching: false + Timer { + id: _sessionSwitchTimer + interval: 400 + onTriggered: root._switching = false + } + readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered || _switching readonly property bool _showPanel: _anyHover || _pinned on_AnyHoverChanged: { @@ -355,45 +361,64 @@ M.BarSection { } // Player switcher - Row { - anchors.horizontalCenter: parent.horizontalCenter - height: 22 - spacing: 6 + Item { + width: parent.width + height: _players.length > 1 ? 28 : 0 + visible: _players.length > 1 - Repeater { - model: root._players + Flickable { + id: _switcher + anchors.centerIn: parent + width: Math.min(_playerRow.implicitWidth, parent.width - 16) + height: 22 + contentWidth: _playerRow.implicitWidth + clip: true - delegate: Rectangle { - required property var modelData - required property int index + Row { + id: _playerRow + height: 22 + spacing: 6 - readonly property bool _active: index === root._playerIdx + Repeater { + model: root._players - width: _pLabel.implicitWidth + 12 - height: 18 - radius: 9 - color: _active ? M.Theme.base02 : (pHover.hovered ? M.Theme.base02 : "transparent") - border.color: _active ? root.accentColor : M.Theme.base03 - border.width: _active ? 1 : 0 - anchors.verticalCenter: parent.verticalCenter + delegate: Rectangle { + required property var modelData + required property int index - Text { - id: _pLabel - anchors.centerIn: parent - text: modelData.identity ?? "Player" - color: _active ? root.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - font.bold: _active - } + readonly property bool _active: index === root._playerIdx - HoverHandler { - id: pHover - cursorShape: Qt.PointingHandCursor - } + width: _pLabel.implicitWidth + 12 + height: 18 + radius: 9 + color: _active ? M.Theme.base02 : (pHover.hovered ? M.Theme.base02 : "transparent") + border.color: _active ? root.accentColor : M.Theme.base03 + border.width: _active ? 1 : 0 + anchors.verticalCenter: parent.verticalCenter - TapHandler { - onTapped: root._playerIdx = index + Text { + id: _pLabel + anchors.centerIn: parent + text: modelData.identity ?? "Player" + color: _active ? root.accentColor : M.Theme.base04 + font.pixelSize: M.Theme.fontSize - 2 + font.family: M.Theme.fontFamily + font.bold: _active + } + + HoverHandler { + id: pHover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: { + root._playerIdx = index; + root._switching = true; + _sessionSwitchTimer.restart(); + } + } + } } } } diff --git a/modules/Network.qml b/modules/Network.qml index f0d3865..ad84331 100644 --- a/modules/Network.qml +++ b/modules/Network.qml @@ -103,7 +103,7 @@ M.BarSection { M.NetworkMenu { id: networkMenu showPanel: root._anyHover - screen: root.bar.screen + screen: QsWindow.window?.screen ?? null anchorItem: root accentColor: root.accentColor } diff --git a/modules/Volume.qml b/modules/Volume.qml index 3283ed7..7166207 100644 --- a/modules/Volume.qml +++ b/modules/Volume.qml @@ -213,7 +213,7 @@ M.BarSection { verticalAlignment: Text.AlignVCenter leftPadding: 12 text: "Output Devices" - color: M.Theme.base04 + color: root.accentColor font.pixelSize: M.Theme.fontSize - 1 font.family: M.Theme.fontFamily } @@ -279,7 +279,7 @@ M.BarSection { verticalAlignment: Text.AlignVCenter leftPadding: 12 text: "Applications" - color: M.Theme.base04 + color: root.accentColor font.pixelSize: M.Theme.fontSize - 1 font.family: M.Theme.fontFamily }