diff --git a/Modules/Bar/Widgets/MediaMini.qml b/Modules/Bar/Widgets/MediaMini.qml index 7d2ffb7..6ce7a59 100644 --- a/Modules/Bar/Widgets/MediaMini.qml +++ b/Modules/Bar/Widgets/MediaMini.qml @@ -7,7 +7,7 @@ import qs.Commons import qs.Services import qs.Widgets -Row { +RowLayout { id: root property ShellScreen screen @@ -15,7 +15,7 @@ Row { readonly property real minWidth: 160 readonly property real maxWidth: 400 - anchors.verticalCenter: parent.verticalCenter + Layout.alignment: Qt.AlignVCenter spacing: Style.marginS * scaling visible: MediaService.currentPlayer !== null && MediaService.canPlay width: MediaService.currentPlayer !== null && MediaService.canPlay ? implicitWidth : 0 @@ -24,7 +24,6 @@ Row { return MediaService.trackTitle + (MediaService.trackArtist !== "" ? ` - ${MediaService.trackArtist}` : "") } - // A hidden text element to safely measure the full title width NText { id: fullTitleMetrics visible: false @@ -34,169 +33,134 @@ Row { Rectangle { id: mediaMini - - // Let the Rectangle size itself based on its content (the Row) - width: row.width + Style.marginM * 2 * scaling - + width: contentLayout.implicitWidth + Style.marginS * 2 * scaling height: Math.round(Style.capsuleHeight * scaling) radius: Math.round(Style.radiusM * scaling) color: Color.mSurfaceVariant + Layout.alignment: Qt.AlignVCenter - anchors.verticalCenter: parent.verticalCenter - - // Used to anchor the tooltip, so the tooltip does not move when the content expands - Item { - id: anchor - height: parent.height - width: 200 * scaling + // --- Visualizer Loaders --- + Loader { + anchors.centerIn: parent + active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "linear" + && MediaService.isPlaying && MediaService.trackLength > 0 + z: 0 + sourceComponent: LinearSpectrum { + width: mediaMini.width - Style.marginS * scaling + height: 20 * scaling + values: CavaService.values + fillColor: Color.mOnSurfaceVariant + opacity: 0.4 + } } - Item { - id: mainContainer - anchors.fill: parent + Loader { + anchors.centerIn: parent + active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "mirrored" + && MediaService.isPlaying && MediaService.trackLength > 0 + z: 0 + sourceComponent: MirroredSpectrum { + width: mediaMini.width - Style.marginS * scaling + height: mediaMini.height - Style.marginS * scaling + values: CavaService.values + fillColor: Color.mOnSurfaceVariant + opacity: 0.4 + } + } + + Loader { + anchors.centerIn: parent + active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "wave" + && MediaService.isPlaying && MediaService.trackLength > 0 + z: 0 + sourceComponent: WaveSpectrum { + width: mediaMini.width - Style.marginS * scaling + height: mediaMini.height - Style.marginS * scaling + values: CavaService.values + fillColor: Color.mOnSurfaceVariant + opacity: 0.4 + } + } + + // --- Main Content Layout --- + RowLayout { + id: contentLayout + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: Style.marginS * scaling - anchors.rightMargin: Style.marginS * scaling + spacing: Style.marginS * scaling + z: 1 - Loader { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "linear" - && MediaService.isPlaying && MediaService.trackLength > 0 - z: 0 + NIcon { + id: windowIcon + text: MediaService.isPlaying ? "pause" : "play_arrow" + font.pointSize: Style.fontSizeL * scaling + Layout.alignment: Qt.AlignVCenter + visible: !Settings.data.audio.showMiniplayerAlbumArt && getTitle() !== "" && !trackArt.visible + } - sourceComponent: LinearSpectrum { - width: mainContainer.width - Style.marginS * scaling - height: 20 * scaling - values: CavaService.values - fillColor: Color.mOnSurfaceVariant - opacity: 0.4 - } + NImageCircled { + id: trackArt + imagePath: MediaService.trackArtUrl + fallbackIcon: MediaService.isPlaying ? "pause" : "play_arrow" + borderWidth: 0 + border.color: Color.transparent + Layout.preferredWidth: Math.round(18 * scaling) + Layout.preferredHeight: Math.round(18 * scaling) + Layout.alignment: Qt.AlignVCenter + visible: Settings.data.audio.showMiniplayerAlbumArt + } - Loader { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "mirrored" - && MediaService.isPlaying && MediaService.trackLength > 0 - z: 0 - - sourceComponent: MirroredSpectrum { - width: mainContainer.width - Style.marginS * scaling - height: mainContainer.height - Style.marginS * scaling - values: CavaService.values - fillColor: Color.mOnSurfaceVariant - opacity: 0.4 + NText { + id: titleText + Layout.preferredWidth: { + if (mouseArea.containsMouse) { + return Math.round(Math.min(fullTitleMetrics.contentWidth, root.maxWidth * scaling)) + } else { + return Math.round(Math.min(fullTitleMetrics.contentWidth, root.minWidth * scaling)) } } + text: getTitle() + font.pointSize: Style.fontSizeS * scaling + font.weight: Style.fontWeightMedium + elide: Text.ElideRight + color: Color.mTertiary + Layout.alignment: Qt.AlignVCenter - Loader { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - active: Settings.data.audio.showMiniplayerCava && Settings.data.audio.visualizerType == "wave" - && MediaService.isPlaying && MediaService.trackLength > 0 - z: 0 - - sourceComponent: WaveSpectrum { - width: mainContainer.width - Style.marginS * scaling - height: mainContainer.height - Style.marginS * scaling - values: CavaService.values - fillColor: Color.mOnSurfaceVariant - opacity: 0.4 + Behavior on Layout.preferredWidth { + NumberAnimation { + duration: Style.animationSlow + easing.type: Easing.InOutCubic } } } + } - Row { - id: row - anchors.verticalCenter: parent.verticalCenter - spacing: Style.marginS * scaling - z: 1 // Above the visualizer - - NIcon { - id: windowIcon - text: MediaService.isPlaying ? "pause" : "play_arrow" - font.pointSize: Style.fontSizeL * scaling - verticalAlignment: Text.AlignVCenter - anchors.verticalCenter: parent.verticalCenter - visible: !Settings.data.audio.showMiniplayerAlbumArt && getTitle() !== "" && !trackArt.visible - } - - Column { - anchors.verticalCenter: parent.verticalCenter - visible: Settings.data.audio.showMiniplayerAlbumArt - - Item { - width: Math.round(18 * scaling) - height: Math.round(18 * scaling) - - NImageCircled { - id: trackArt - anchors.fill: parent - imagePath: MediaService.trackArtUrl - fallbackIcon: MediaService.isPlaying ? "pause" : "play_arrow" - borderWidth: 0 - border.color: Color.transparent - } - } - } - - NText { - id: titleText - - // For short titles, show full. For long titles, truncate and expand on hover - width: { - if (mouseArea.containsMouse) { - return Math.round(Math.min(fullTitleMetrics.contentWidth, root.maxWidth * scaling)) - } else { - return Math.round(Math.min(fullTitleMetrics.contentWidth, root.minWidth * scaling)) - } - } - text: getTitle() - font.pointSize: Style.fontSizeS * scaling - font.weight: Style.fontWeightMedium - elide: Text.ElideRight - anchors.verticalCenter: parent.verticalCenter - verticalAlignment: Text.AlignVCenter - color: Color.mTertiary - - Behavior on width { - NumberAnimation { - duration: Style.animationSlow - easing.type: Easing.InOutCubic - } - } - } - } - - // Mouse area for hover detection - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton - onClicked: mouse => { - if (mouse.button === Qt.LeftButton) { - MediaService.playPause() - } else if (mouse.button == Qt.RightButton) { - MediaService.next() - // Need to hide the tooltip instantly - tooltip.visible = false - } else if (mouse.button == Qt.MiddleButton) { - MediaService.previous() - // Need to hide the tooltip instantly - tooltip.visible = false - } + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton + onClicked: mouse => { + if (mouse.button === Qt.LeftButton) { + MediaService.playPause() + } else if (mouse.button == Qt.RightButton) { + MediaService.next() + tooltip.visible = false + } else if (mouse.button == Qt.MiddleButton) { + MediaService.previous() + tooltip.visible = false } - - onEntered: { - if (tooltip.text !== "") { - tooltip.show() - } - } - onExited: { - tooltip.hide() + } + onEntered: { + if (tooltip.text !== "") { + tooltip.show() } } + onExited: { + tooltip.hide() + } } } @@ -212,7 +176,7 @@ Row { } return str } - target: anchor + target: mediaMini positionAbove: Settings.data.bar.position === "bottom" } }