diff --git a/Modules/Bar/Widgets/MediaMini.qml b/Modules/Bar/Widgets/MediaMini.qml index 617b73d3..b1d6529f 100644 --- a/Modules/Bar/Widgets/MediaMini.qml +++ b/Modules/Bar/Widgets/MediaMini.qml @@ -60,12 +60,12 @@ Item { return title } - implicitHeight: visible ? (isVerticalBar ? calculatedVerticalDimension() : Style.barHeight) : 0 - implicitWidth: visible ? (isVerticalBar ? calculatedVerticalDimension() : dynamicWidth) : 0 + implicitHeight: visible ? (isVerticalBar ? (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : calculatedVerticalDimension()) : Style.capsuleHeight) : 0 + implicitWidth: visible ? (isVerticalBar ? (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : calculatedVerticalDimension()) : (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : dynamicWidth)) : 0 // "visible": Always Visible, "hidden": Hide When Empty, "transparent": Transparent When Empty - visible: hideMode !== "hidden" || hasActivePlayer - opacity: hideMode !== "transparent" || hasActivePlayer ? 1.0 : 0 + visible: hideMode !== "hidden" || opacity > 0 + opacity: ((hideMode !== "hidden" || hasActivePlayer) && (hideMode !== "transparent" || hasActivePlayer)) ? 1.0 : 0.0 Behavior on opacity { NumberAnimation { duration: Style.animationNormal @@ -73,6 +73,19 @@ Item { } } + Behavior on implicitWidth { + NumberAnimation { + duration: Style.animationNormal + easing.type: Easing.InOutCubic + } + } + Behavior on implicitHeight { + NumberAnimation { + duration: Style.animationNormal + easing.type: Easing.InOutCubic + } + } + function getTitle() { return MediaService.trackTitle + (MediaService.trackArtist !== "" ? ` - ${MediaService.trackArtist}` : "") } @@ -89,20 +102,22 @@ Item { // Icon or album art width if (!hasActivePlayer || !showAlbumArt) { // Icon width - contentWidth += Style.fontSizeL * scaling + contentWidth += Math.round(18 * scaling) } else if (showAlbumArt && hasActivePlayer) { // Album art width contentWidth += 21 * scaling } - // Spacing between icon/art and text - contentWidth += Style.marginS * scaling + // Spacing between icon/art and text; only if there is text + if (fullTitleMetrics.contentWidth > 0) { + contentWidth += Style.marginS * scaling - // Text width (use the measured width) - contentWidth += fullTitleMetrics.contentWidth + // Text width (use the measured width) + contentWidth += fullTitleMetrics.contentWidth - // Additional small margin for text - contentWidth += Style.marginXXS * 2 + // Additional small margin for text + contentWidth += Style.marginXXS * 2 + } // Add container margins contentWidth += margins @@ -118,7 +133,8 @@ Item { } // Otherwise, adapt to content if (!hasActivePlayer) { - return maxWidth + // Keep compact when no active player + return calculateContentWidth() } // Use content width but don't exceed user-set maximum width return Math.min(calculateContentWidth(), maxWidth) @@ -139,8 +155,8 @@ Item { visible: root.visible anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - width: isVerticalBar ? root.width : dynamicWidth - height: isVerticalBar ? width : Style.capsuleHeight + width: isVerticalBar ? (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : calculatedVerticalDimension()) : (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : dynamicWidth) + height: isVerticalBar ? (((!hasActivePlayer) && (hideMode === "hidden" || hideMode === "transparent")) ? 0 : calculatedVerticalDimension()) : Style.capsuleHeight radius: isVerticalBar ? width / 2 : Style.radiusM color: Settings.data.bar.showCapsule ? Color.mSurfaceVariant : Color.transparent @@ -152,11 +168,20 @@ Item { } } + // Smooth height transition for vertical bar + Behavior on height { + NumberAnimation { + duration: Style.animationNormal + easing.type: Easing.InOutCubic + } + } + Item { id: mainContainer anchors.fill: parent anchors.leftMargin: isVerticalBar ? 0 : Style.marginS * scaling anchors.rightMargin: isVerticalBar ? 0 : Style.marginS * scaling + clip: true Loader { anchors.verticalCenter: parent.verticalCenter @@ -247,8 +272,8 @@ Item { id: titleContainer Layout.preferredWidth: { // Calculate available width based on other elements in the row - var iconWidth = (windowIcon.visible ? (Style.fontSizeL + Style.marginS) : 0) - var albumArtWidth = (hasActivePlayer && showAlbumArt ? (18 + Style.marginS) : 0) + var iconWidth = (windowIcon.visible ? (18 * scaling + Style.marginS * scaling) : 0) + var albumArtWidth = (hasActivePlayer && showAlbumArt ? (21 * scaling + Style.marginS * scaling) : 0) var totalMargins = Style.marginXXS * 2 var availableWidth = mainContainer.width - iconWidth - albumArtWidth - totalMargins return Math.max(20, availableWidth) @@ -263,7 +288,7 @@ Item { property bool isResetting: false property real textWidth: fullTitleMetrics.contentWidth property real containerWidth: 0 - property bool needsScrolling: textWidth > containerWidth && MediaService.isPlaying + property bool needsScrolling: textWidth > containerWidth // Timer for "always" mode with delay Timer { @@ -347,6 +372,14 @@ Item { verticalAlignment: Text.AlignVCenter horizontalAlignment: hasActivePlayer ? Text.AlignLeft : Text.AlignHCenter color: hasActivePlayer ? Color.mOnSurface : Color.mOnSurfaceVariant + onTextChanged: { + titleContainer.isScrolling = false + titleContainer.isResetting = false + scrollContainer.scrollX = 0 + if (needsScrolling) { + scrollStartTimer.restart() + } + } } NText { @@ -383,13 +416,6 @@ Item { easing.type: Easing.Linear } } - - Behavior on Layout.preferredWidth { - NumberAnimation { - duration: Style.animationSlow - easing.type: Easing.InOutCubic - } - } } }