Merge pull request #542 from Sighthesia/MediaMiniImprovements

MediaMini: improvements on visual effect
This commit is contained in:
Lemmy
2025-10-21 09:52:55 -04:00
committed by GitHub
+50 -24
View File
@@ -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
}
}
}
}