diff --git a/src/audiowrapper_libvlc.cpp b/src/audiowrapper_libvlc.cpp --- a/src/audiowrapper_libvlc.cpp +++ b/src/audiowrapper_libvlc.cpp @@ -517,7 +517,7 @@ return; } - if (abs(mPreviousVolume - newVolume) > 0.01) { + if (abs(int(mPreviousVolume - newVolume)) > 0.01) { mPreviousVolume = newVolume; mParent->playerVolumeSignalChanges(); diff --git a/src/qml/ContentView.qml b/src/qml/ContentView.qml --- a/src/qml/ContentView.qml +++ b/src/qml/ContentView.qml @@ -260,11 +260,6 @@ } Rectangle { - border { - color: (mainContentView.activeFocus ? myPalette.highlight : myPalette.base) - width: 1 - } - radius: 3 color: myPalette.base diff --git a/src/qml/GridBrowserDelegate.qml b/src/qml/GridBrowserDelegate.qml --- a/src/qml/GridBrowserDelegate.qml +++ b/src/qml/GridBrowserDelegate.qml @@ -42,8 +42,24 @@ Keys.onReturnPressed: open() Keys.onEnterPressed: open() + Rectangle { + anchors.fill: parent + z: 1 + + border.color: gridEntry.activeFocus ? myPalette.highlight : "transparent" + + Behavior on border.color { + ColorAnimation { + duration: 300 + } + } + + radius: 3 + } + ColumnLayout { anchors.fill: parent + z: 2 spacing: 0 @@ -231,6 +247,7 @@ Layout.maximumWidth: gridEntry.width * 0.9 Layout.minimumWidth: Layout.maximumWidth Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom + Layout.bottomMargin: delegateDisplaySecondaryText ? 0 : elisaTheme.layoutVerticalMargin elide: Text.ElideRight } @@ -246,6 +263,7 @@ // See https://bugreports.qt.io/browse/QTBUG-49646 horizontalAlignment: Text.AlignHCenter + Layout.bottomMargin: elisaTheme.layoutVerticalMargin Layout.maximumWidth: gridEntry.width * 0.9 Layout.minimumWidth: Layout.maximumWidth Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom @@ -299,7 +317,7 @@ NumberAnimation { properties: "opacity" easing.type: Easing.InOutQuad - duration: 100 + duration: 300 } } }, @@ -309,7 +327,7 @@ NumberAnimation { properties: "opacity" easing.type: Easing.InOutQuad - duration: 100 + duration: 300 } PropertyAction { properties: "active" diff --git a/src/qml/ListBrowserView.qml b/src/qml/ListBrowserView.qml --- a/src/qml/ListBrowserView.qml +++ b/src/qml/ListBrowserView.qml @@ -98,6 +98,7 @@ Layout.fillHeight: true Layout.fillWidth: true + Layout.margins: 2 ListView { id: contentDirectoryView diff --git a/src/qml/MediaTrackDelegate.qml b/src/qml/MediaTrackDelegate.qml --- a/src/qml/MediaTrackDelegate.qml +++ b/src/qml/MediaTrackDelegate.qml @@ -93,256 +93,258 @@ id: rowRoot anchors.fill: parent + z: 1 color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) + } - MouseArea { - id: hoverArea + MouseArea { + id: hoverArea - anchors.fill: parent + anchors.fill: parent + z: 2 - hoverEnabled: true - focus: true - acceptedButtons: Qt.LeftButton + hoverEnabled: true + focus: true + acceptedButtons: Qt.LeftButton - onClicked: { - hoverArea.forceActiveFocus() - mediaTrack.clicked() - } + onClicked: { + hoverArea.forceActiveFocus() + mediaTrack.clicked() + } - onDoubleClicked: enqueue(databaseId, title) + onDoubleClicked: enqueue(databaseId, title) - RowLayout { - anchors.fill: parent - spacing: 0 + RowLayout { + anchors.fill: parent + spacing: 0 - LabelWithToolTip { - id: mainLabel + LabelWithToolTip { + id: mainLabel - visible: !detailedView + visible: !detailedView - text: { - if (trackNumber !== 0) { - if (artist !== albumArtist) - return i18nc("%1: track number. %2: track title. %3: artist name", - "%1 - %2 - %3", - trackNumber.toLocaleString(Qt.locale(), 'f', 0), - title, artist); - else - return i18nc("%1: track number. %2: track title.", - "%1 - %2", - trackNumber.toLocaleString(Qt.locale(), 'f', 0), - title); - } else { - if (artist !== albumArtist) - return i18nc("%1: track title. %2: artist name", - "%1 - %2", - title, artist); - else - return i18nc("%1: track title", - "%1", - title); - } + text: { + if (trackNumber !== 0) { + if (artist !== albumArtist) + return i18nc("%1: track number. %2: track title. %3: artist name", + "%1 - %2 - %3", + trackNumber.toLocaleString(Qt.locale(), 'f', 0), + title, artist); + else + return i18nc("%1: track number. %2: track title.", + "%1 - %2", + trackNumber.toLocaleString(Qt.locale(), 'f', 0), + title); + } else { + if (artist !== albumArtist) + return i18nc("%1: track title. %2: artist name", + "%1 - %2", + title, artist); + else + return i18nc("%1: track title", + "%1", + title); } + } - elide: Text.ElideRight - horizontalAlignment: Text.AlignLeft + elide: Text.ElideRight + horizontalAlignment: Text.AlignLeft - color: myPalette.text + color: myPalette.text - Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter - Layout.fillWidth: true - Layout.leftMargin: { - if (!LayoutMirroring.enabled) - return (!isSingleDiscAlbum ? elisaTheme.layoutHorizontalMargin * 4 : elisaTheme.layoutHorizontalMargin) - else - return 0 - } - Layout.rightMargin: { - if (LayoutMirroring.enabled) - return (!isSingleDiscAlbum ? elisaTheme.layoutHorizontalMargin * 4 : elisaTheme.layoutHorizontalMargin) - else - return 0 - } + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + Layout.fillWidth: true + Layout.leftMargin: { + if (!LayoutMirroring.enabled) + return (!isSingleDiscAlbum ? elisaTheme.layoutHorizontalMargin * 4 : elisaTheme.layoutHorizontalMargin) + else + return 0 } + Layout.rightMargin: { + if (LayoutMirroring.enabled) + return (!isSingleDiscAlbum ? elisaTheme.layoutHorizontalMargin * 4 : elisaTheme.layoutHorizontalMargin) + else + return 0 + } + } - Item { - Layout.preferredHeight: mediaTrack.height * 0.9 - Layout.preferredWidth: mediaTrack.height * 0.9 + Item { + Layout.preferredHeight: mediaTrack.height * 0.9 + Layout.preferredWidth: mediaTrack.height * 0.9 - Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter - visible: detailedView + visible: detailedView - Image { - id: coverImageElement + Image { + id: coverImageElement - anchors.fill: parent + anchors.fill: parent - sourceSize.width: mediaTrack.height * 0.9 - sourceSize.height: mediaTrack.height * 0.9 - fillMode: Image.PreserveAspectFit - smooth: true + sourceSize.width: mediaTrack.height * 0.9 + sourceSize.height: mediaTrack.height * 0.9 + fillMode: Image.PreserveAspectFit + smooth: true - source: (imageUrl != '' ? imageUrl : Qt.resolvedUrl(elisaTheme.defaultAlbumImage)) + source: (imageUrl != '' ? imageUrl : Qt.resolvedUrl(elisaTheme.defaultAlbumImage)) - asynchronous: true + asynchronous: true - layer.enabled: imageUrl != '' + layer.enabled: imageUrl != '' - layer.effect: DropShadow { - source: coverImageElement + layer.effect: DropShadow { + source: coverImageElement - radius: 10 - spread: 0.1 - samples: 21 + radius: 10 + spread: 0.1 + samples: 21 - color: myPalette.shadow - } + color: myPalette.shadow } } + } - ColumnLayout { - visible: detailedView + ColumnLayout { + visible: detailedView - Layout.fillWidth: true - Layout.fillHeight: true - Layout.alignment: Qt.AlignLeft + Layout.fillWidth: true + Layout.fillHeight: true + Layout.alignment: Qt.AlignLeft - spacing: 0 + spacing: 0 - LabelWithToolTip { - id: mainLabelDetailed + LabelWithToolTip { + id: mainLabelDetailed - text: { - if (trackNumber !== 0) { - return i18nc("%1: track number. %2: track title", "%1 - %2", - trackNumber.toLocaleString(Qt.locale(), 'f', 0), title); - } else { - return title; - } + text: { + if (trackNumber !== 0) { + return i18nc("%1: track number. %2: track title", "%1 - %2", + trackNumber.toLocaleString(Qt.locale(), 'f', 0), title); + } else { + return title; } + } - horizontalAlignment: Text.AlignLeft + horizontalAlignment: Text.AlignLeft - font.weight: Font.Bold - color: myPalette.text + font.weight: Font.Bold + color: myPalette.text - Layout.alignment: Qt.AlignLeft | Qt.AlignTop - Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.fillWidth: true - Layout.topMargin: elisaTheme.layoutVerticalMargin / 2 + Layout.alignment: Qt.AlignLeft | Qt.AlignTop + Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.fillWidth: true + Layout.topMargin: elisaTheme.layoutVerticalMargin / 2 - elide: Text.ElideRight - } + elide: Text.ElideRight + } - Item { - Layout.fillHeight: true - } + Item { + Layout.fillHeight: true + } - LabelWithToolTip { - id: artistLabel + LabelWithToolTip { + id: artistLabel - text: { - var labelText = "" - if (artist) { - labelText += artist - } - if (album !== '') { - labelText += ' - ' + album - if (!isSingleDiscAlbum) { - labelText += ' - CD ' + discNumber - } + text: { + var labelText = "" + if (artist) { + labelText += artist + } + if (album !== '') { + labelText += ' - ' + album + if (!isSingleDiscAlbum) { + labelText += ' - CD ' + discNumber } - return labelText; } - horizontalAlignment: Text.AlignLeft + return labelText; + } + horizontalAlignment: Text.AlignLeft - font.weight: Font.Light - font.italic: true - color: myPalette.text + font.weight: Font.Light + font.italic: true + color: myPalette.text - Layout.alignment: Qt.AlignLeft | Qt.AlignBottom - Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.fillWidth: true - Layout.bottomMargin: elisaTheme.layoutVerticalMargin / 2 + Layout.alignment: Qt.AlignLeft | Qt.AlignBottom + Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.fillWidth: true + Layout.bottomMargin: elisaTheme.layoutVerticalMargin / 2 - elide: Text.ElideRight - } + elide: Text.ElideRight } + } - Loader { - id: hoverLoader - active: false + Loader { + id: hoverLoader + active: false - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.rightMargin: 10 + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.rightMargin: 10 - z: 1 - opacity: 0 + z: 1 + opacity: 0 - sourceComponent: Row { - anchors.centerIn: parent + sourceComponent: Row { + anchors.centerIn: parent - Controls1.ToolButton { - id: detailsButton + Controls1.ToolButton { + id: detailsButton - height: elisaTheme.delegateHeight - width: elisaTheme.delegateHeight + height: elisaTheme.delegateHeight + width: elisaTheme.delegateHeight - action: viewDetailsAction - } + action: viewDetailsAction + } - Controls1.ToolButton { - id: enqueueButton + Controls1.ToolButton { + id: enqueueButton - height: elisaTheme.delegateHeight - width: elisaTheme.delegateHeight + height: elisaTheme.delegateHeight + width: elisaTheme.delegateHeight - action: enqueueAction - } + action: enqueueAction + } - Controls1.ToolButton { - id: clearAndEnqueueButton + Controls1.ToolButton { + id: clearAndEnqueueButton - scale: LayoutMirroring.enabled ? -1 : 1 + scale: LayoutMirroring.enabled ? -1 : 1 - height: elisaTheme.delegateHeight - width: elisaTheme.delegateHeight + height: elisaTheme.delegateHeight + width: elisaTheme.delegateHeight - action: replaceAndPlayAction - } + action: replaceAndPlayAction } } + } - RatingStar { - id: ratingWidget + RatingStar { + id: ratingWidget - starSize: elisaTheme.ratingStarSize + starSize: elisaTheme.ratingStarSize - starRating: rating + starRating: rating - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.leftMargin: elisaTheme.layoutHorizontalMargin - Layout.rightMargin: elisaTheme.layoutHorizontalMargin - } + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.leftMargin: elisaTheme.layoutHorizontalMargin + Layout.rightMargin: elisaTheme.layoutHorizontalMargin + } - LabelWithToolTip { - id: durationLabel + LabelWithToolTip { + id: durationLabel - text: duration + text: duration - font.weight: Font.Light - color: myPalette.text + font.weight: Font.Light + color: myPalette.text - horizontalAlignment: Text.AlignRight + horizontalAlignment: Text.AlignRight - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.rightMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.leftMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - } + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.rightMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 + Layout.leftMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 } } } @@ -367,6 +369,10 @@ target: rowRoot color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) } + PropertyChanges { + target: rowRoot + opacity: 1 + } }, State { name: 'hoveredOrSelected' @@ -385,7 +391,11 @@ } PropertyChanges { target: rowRoot - color: myPalette.mid + color: myPalette.highlight + } + PropertyChanges { + target: rowRoot + opacity: 0.2 } } ] @@ -401,11 +411,11 @@ NumberAnimation { properties: "opacity, hoverWidgetOpacity" easing.type: Easing.InOutQuad - duration: 250 + duration: 200 } ColorAnimation { properties: "color" - duration: 250 + duration: 350 } } } diff --git a/src/qml/PlayListEntry.qml b/src/qml/PlayListEntry.qml --- a/src/qml/PlayListEntry.qml +++ b/src/qml/PlayListEntry.qml @@ -118,288 +118,300 @@ anchors.fill: parent anchors.rightMargin: LayoutMirroring.enabled ? scrollBarWidth : 0 + z: 1 - color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) + border { + color: playListEntry.activeFocus ? myPalette.highlight : 'transparent' + width: 1 + } + + color: myPalette.base height: elisaTheme.playListDelegateHeight - focus: true + Behavior on border.color { + ColorAnimation { + duration: 300 + } + } + } - ColumnLayout { - spacing: 0 + ColumnLayout { + spacing: 0 - anchors.fill: parent + anchors.fill: parent + anchors.rightMargin: LayoutMirroring.enabled ? scrollBarWidth : 0 + z: 2 - Item { - Layout.fillWidth: true - Layout.fillHeight: true + Item { + Layout.fillWidth: true + Layout.fillHeight: true - RowLayout { - id: trackRow + RowLayout { + id: trackRow - anchors.fill: parent + anchors.fill: parent - spacing: elisaTheme.layoutHorizontalMargin / 4 + spacing: elisaTheme.layoutHorizontalMargin / 4 - Item { - id: playIconItem + Item { + id: playIconItem - implicitHeight: elisaTheme.smallDelegateToolButtonSize - implicitWidth: elisaTheme.smallDelegateToolButtonSize - Layout.maximumWidth: elisaTheme.smallDelegateToolButtonSize - Layout.maximumHeight: elisaTheme.smallDelegateToolButtonSize - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin / 2 : 0 - Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin / 2 : 0 + implicitHeight: elisaTheme.smallDelegateToolButtonSize + implicitWidth: elisaTheme.smallDelegateToolButtonSize + Layout.maximumWidth: elisaTheme.smallDelegateToolButtonSize + Layout.maximumHeight: elisaTheme.smallDelegateToolButtonSize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + Layout.leftMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin / 2 : 0 + Layout.rightMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin / 2 : 0 - Image { - id: playIcon + Image { + id: playIcon - anchors.fill: parent + anchors.fill: parent - opacity: 0 + opacity: 0 - source: (isPlaying === MediaPlayList.IsPlaying ? - Qt.resolvedUrl(elisaTheme.playingIndicatorIcon) : Qt.resolvedUrl(elisaTheme.pausedIndicatorIcon)) + source: (isPlaying === MediaPlayList.IsPlaying ? + Qt.resolvedUrl(elisaTheme.playingIndicatorIcon) : Qt.resolvedUrl(elisaTheme.pausedIndicatorIcon)) - width: parent.height * 1. - height: parent.height * 1. + width: parent.height * 1. + height: parent.height * 1. - sourceSize.width: parent.height * 1. - sourceSize.height: parent.height * 1. - fillMode: Image.PreserveAspectFit - mirror: LayoutMirroring.enabled - visible: opacity > 0.0 - } + sourceSize.width: parent.height * 1. + sourceSize.height: parent.height * 1. + fillMode: Image.PreserveAspectFit + mirror: LayoutMirroring.enabled + visible: opacity > 0.0 } + } - Item { - id: fakeDiscNumberItem + Item { + id: fakeDiscNumberItem - visible: isValid && (!hasValidDiscNumber || isSingleDiscAlbum) + visible: isValid && (!hasValidDiscNumber || isSingleDiscAlbum) - Layout.preferredWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) - Layout.minimumWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) - Layout.maximumWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) + Layout.preferredWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) + Layout.minimumWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) + Layout.maximumWidth: (fakeDiscNumberSize.boundingRect.width - fakeDiscNumberSize.boundingRect.x) + (elisaTheme.layoutHorizontalMargin / 4) - TextMetrics { - id: fakeDiscNumberSize + TextMetrics { + id: fakeDiscNumberSize - text: '/9' - } + text: '/9' } + } - Label { - id: trackNumberLabel + Label { + id: trackNumberLabel - horizontalAlignment: Text.AlignRight + horizontalAlignment: Text.AlignRight - text: trackNumber !== 0 && trackNumber !== -1 ? Number(trackNumber).toLocaleString(Qt.locale(), 'f', 0) : '' + text: trackNumber !== 0 && trackNumber !== -1 ? Number(trackNumber).toLocaleString(Qt.locale(), 'f', 0) : '' - font.weight: (isPlaying ? Font.Bold : Font.Light) - color: myPalette.text + font.weight: (isPlaying ? Font.Bold : Font.Light) + color: myPalette.text - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - visible: isValid + visible: isValid - Layout.preferredWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) - Layout.minimumWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) - Layout.maximumWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) + Layout.preferredWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) + Layout.minimumWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) + Layout.maximumWidth: ((trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) > (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x) ? (trackNumberSize.boundingRect.width - trackNumberSize.boundingRect.x) : (realTrackNumberSize.boundingRect.width - realTrackNumberSize.boundingRect.x)) - Layout.rightMargin: !LayoutMirroring.enabled ? (discNumber !== 0 && !isSingleDiscAlbum ? - 0 : elisaTheme.layoutHorizontalMargin / 2) : 0 - Layout.leftMargin: LayoutMirroring.enabled ? (discNumber !== 0 && !isSingleDiscAlbum ? - 0 : elisaTheme.layoutHorizontalMargin / 2) : 0 + Layout.rightMargin: !LayoutMirroring.enabled ? (discNumber !== 0 && !isSingleDiscAlbum ? + 0 : elisaTheme.layoutHorizontalMargin / 2) : 0 + Layout.leftMargin: LayoutMirroring.enabled ? (discNumber !== 0 && !isSingleDiscAlbum ? + 0 : elisaTheme.layoutHorizontalMargin / 2) : 0 - TextMetrics { - id: trackNumberSize + TextMetrics { + id: trackNumberSize - text: (99).toLocaleString(Qt.locale(), 'f', 0) - } + text: (99).toLocaleString(Qt.locale(), 'f', 0) + } - TextMetrics { - id: realTrackNumberSize + TextMetrics { + id: realTrackNumberSize - text: Number(trackNumber).toLocaleString(Qt.locale(), 'f', 0) - } + text: Number(trackNumber).toLocaleString(Qt.locale(), 'f', 0) } + } - Label { - horizontalAlignment: Text.AlignCenter + Label { + horizontalAlignment: Text.AlignCenter - text: '/' + text: '/' - visible: isValid && discNumber !== 0 && !isSingleDiscAlbum + visible: isValid && discNumber !== 0 && !isSingleDiscAlbum - font.weight: (isPlaying ? Font.Bold : Font.Light) - color: myPalette.text + font.weight: (isPlaying ? Font.Bold : Font.Light) + color: myPalette.text - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - Layout.preferredWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) - Layout.minimumWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) - Layout.maximumWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) + Layout.preferredWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) + Layout.minimumWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) + Layout.maximumWidth: (numberSeparatorSize.boundingRect.width - numberSeparatorSize.boundingRect.x) - TextMetrics { - id: numberSeparatorSize + TextMetrics { + id: numberSeparatorSize - text: '/' - } + text: '/' } + } - Label { - horizontalAlignment: Text.AlignRight + Label { + horizontalAlignment: Text.AlignRight - font.weight: (isPlaying ? Font.Bold : Font.Light) - color: myPalette.text + font.weight: (isPlaying ? Font.Bold : Font.Light) + color: myPalette.text - text: Number(discNumber).toLocaleString(Qt.locale(), 'f', 0) + text: Number(discNumber).toLocaleString(Qt.locale(), 'f', 0) - visible: isValid && discNumber !== 0 && !isSingleDiscAlbum + visible: isValid && discNumber !== 0 && !isSingleDiscAlbum - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.preferredWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? - (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : - (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) - Layout.minimumWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? - (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : - (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) - Layout.maximumWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? - (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : - (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) + Layout.preferredWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? + (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : + (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) + Layout.minimumWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? + (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : + (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) + Layout.maximumWidth: ((discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) > (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x) ? + (discNumberSize.boundingRect.width - discNumberSize.boundingRect.x) : + (realDiscNumberSize.boundingRect.width - realDiscNumberSize.boundingRect.x)) - Layout.rightMargin: !LayoutMirroring.enabled ? (elisaTheme.layoutHorizontalMargin / 2) : 0 - Layout.leftMargin: LayoutMirroring.enabled ? (elisaTheme.layoutHorizontalMargin / 2) : 0 + Layout.rightMargin: !LayoutMirroring.enabled ? (elisaTheme.layoutHorizontalMargin / 2) : 0 + Layout.leftMargin: LayoutMirroring.enabled ? (elisaTheme.layoutHorizontalMargin / 2) : 0 - TextMetrics { - id: discNumberSize + TextMetrics { + id: discNumberSize - text: '9' - } + text: '9' + } - TextMetrics { - id: realDiscNumberSize + TextMetrics { + id: realDiscNumberSize - text: Number(discNumber).toLocaleString(Qt.locale(), 'f', 0) - } + text: Number(discNumber).toLocaleString(Qt.locale(), 'f', 0) } + } - LabelWithToolTip { - id: mainCompactLabel + LabelWithToolTip { + id: mainCompactLabel - text: title + text: title - font.weight: (isPlaying ? Font.Bold : Font.Normal) - color: myPalette.text + font.weight: (isPlaying ? Font.Bold : Font.Normal) + color: myPalette.text - Layout.maximumWidth: mainCompactLabel.implicitWidth + 1 - Layout.fillWidth: true - Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.maximumWidth: mainCompactLabel.implicitWidth + 1 + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft - visible: isValid + visible: isValid - elide: Text.ElideRight - horizontalAlignment: Text.AlignLeft - } + elide: Text.ElideRight + horizontalAlignment: Text.AlignLeft + } - LabelWithToolTip { - id: mainInvalidCompactLabel + LabelWithToolTip { + id: mainInvalidCompactLabel - text: title + text: title - font.weight: Font.Normal - color: myPalette.text + font.weight: Font.Normal + color: myPalette.text - Layout.fillWidth: true - Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft - visible: !isValid + visible: !isValid - elide: Text.ElideRight - } + elide: Text.ElideRight + } - Item { - Layout.fillWidth: true - Layout.preferredWidth: 0 - } + Item { + Layout.fillWidth: true + Layout.preferredWidth: 0 + } - Controls1.ToolButton { - id: infoButton - objectName: 'infoButton' + Controls1.ToolButton { + id: infoButton + objectName: 'infoButton' - implicitHeight: elisaTheme.smallDelegateToolButtonSize - implicitWidth: elisaTheme.smallDelegateToolButtonSize + implicitHeight: elisaTheme.smallDelegateToolButtonSize + implicitWidth: elisaTheme.smallDelegateToolButtonSize - opacity: 0 + opacity: 0 - visible: opacity > 0.1 + visible: opacity > 0.1 - action: showInfo - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - } + action: showInfo + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + } - Controls1.ToolButton { - id: playPauseButton - objectName: 'playPauseButton' + Controls1.ToolButton { + id: playPauseButton + objectName: 'playPauseButton' - implicitHeight: elisaTheme.smallDelegateToolButtonSize - implicitWidth: elisaTheme.smallDelegateToolButtonSize + implicitHeight: elisaTheme.smallDelegateToolButtonSize + implicitWidth: elisaTheme.smallDelegateToolButtonSize - opacity: 0 + opacity: 0 - scale: LayoutMirroring.enabled ? -1 : 1 // We can mirror the symmetrical pause icon + scale: LayoutMirroring.enabled ? -1 : 1 // We can mirror the symmetrical pause icon - visible: opacity > 0.1 - action: !(isPlaying === MediaPlayList.IsPlaying) ? playNow : pauseNow - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - } + visible: opacity > 0.1 + action: !(isPlaying === MediaPlayList.IsPlaying) ? playNow : pauseNow + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + } - Item { - implicitHeight: elisaTheme.smallDelegateToolButtonSize - implicitWidth: elisaTheme.smallDelegateToolButtonSize - Layout.maximumWidth: elisaTheme.smallDelegateToolButtonSize - Layout.maximumHeight: elisaTheme.smallDelegateToolButtonSize - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + Item { + implicitHeight: elisaTheme.smallDelegateToolButtonSize + implicitWidth: elisaTheme.smallDelegateToolButtonSize + Layout.maximumWidth: elisaTheme.smallDelegateToolButtonSize + Layout.maximumHeight: elisaTheme.smallDelegateToolButtonSize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - Controls1.ToolButton { - id: removeButton - objectName: 'removeButton' + Controls1.ToolButton { + id: removeButton + objectName: 'removeButton' - anchors.fill: parent + anchors.fill: parent - opacity: 0 + opacity: 0 - visible: opacity > 0.1 - action: removeFromPlayList - } + visible: opacity > 0.1 + action: removeFromPlayList } + } - RatingStar { - id: ratingWidget + RatingStar { + id: ratingWidget - starRating: rating + starRating: rating - starSize: elisaTheme.ratingStarSize + starSize: elisaTheme.ratingStarSize - visible: rating > 0 - } + visible: rating > 0 + } - LabelWithToolTip { - id: durationLabel + LabelWithToolTip { + id: durationLabel - text: duration + text: duration - font.weight: (isPlaying ? Font.Bold : Font.Normal) - color: myPalette.text + font.weight: (isPlaying ? Font.Bold : Font.Normal) + color: myPalette.text - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.leftMargin: elisaTheme.layoutHorizontalMargin / 2 - Layout.rightMargin: elisaTheme.layoutHorizontalMargin / 2 + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + Layout.leftMargin: elisaTheme.layoutHorizontalMargin / 2 + Layout.rightMargin: elisaTheme.layoutHorizontalMargin / 2 - horizontalAlignment: Text.AlignRight - } + horizontalAlignment: Text.AlignRight } } } diff --git a/src/qml/ViewSelector.qml b/src/qml/ViewSelector.qml --- a/src/qml/ViewSelector.qml +++ b/src/qml/ViewSelector.qml @@ -42,48 +42,69 @@ Rectangle { anchors.fill: parent + z: 1 - color: myPalette.base - border { - color: (rootFocusScope.activeFocus ? myPalette.highlight : "transparent") - width: 1 + border.color: myPalette.base + + Behavior on border.color { + ColorAnimation { + duration: 300 + } } + } + + ScrollView { + focus: true + + anchors.fill: parent + z: 2 + + clip: true + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + ListView { + id: viewModeView - ScrollView { focus: true + activeFocusOnTab: true + keyNavigationEnabled: true - anchors.fill: parent + property bool ignoreCurrentItemChanges: false - clip: true - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + z: 2 + anchors.topMargin: elisaTheme.layoutHorizontalMargin * 2 - ListView { - id: viewModeView + model: DelegateModel { + id: pageDelegateModel - focus: true - activeFocusOnTab: true - keyNavigationEnabled: true + delegate: MouseArea { + id: itemMouseArea - property bool ignoreCurrentItemChanges: false + property var viewType: model.type - z: 2 + height: Math.round(elisaTheme.viewSelectorDelegateHeight * 1.4) + width: viewModeView.width - anchors.topMargin: elisaTheme.layoutHorizontalMargin * 2 + hoverEnabled: true + acceptedButtons: Qt.LeftButton - model: DelegateModel { - id: pageDelegateModel + Rectangle { - delegate: MouseArea { - id: itemMouseArea + border { + color: ((viewModeView.currentIndex === index && rootFocusScope.activeFocus) ? myPalette.highlight : "transparent") + width: 1 + } - property var viewType: model.type + Behavior on border.color { + ColorAnimation { + duration: 300 + } + } - height: elisaTheme.viewSelectorDelegateHeight * 1.4 - width: viewModeView.width + radius: 3 - hoverEnabled: true - acceptedButtons: Qt.LeftButton + anchors.fill: parent Loader { anchors.fill: parent @@ -185,31 +206,28 @@ } } } + } - onClicked: viewModeView.currentIndex = index + onClicked: { + rootFocusScope.focus = true + viewModeView.currentIndex = index } } + } - footer: MouseArea { - width: viewModeView.width - height: viewModeView.height - y + footer: MouseArea { + width: viewModeView.width + height: viewModeView.height - y - acceptedButtons: Qt.LeftButton + acceptedButtons: Qt.LeftButton - onClicked: - { - rootFocusScope.focus = true - } + onClicked: + { + rootFocusScope.focus = true } - - onCurrentItemChanged: if (!ignoreCurrentItemChanges) switchView(currentItem.viewType) } - } - Behavior on border.color { - ColorAnimation { - duration: 300 - } + onCurrentItemChanged: if (!ignoreCurrentItemChanges) switchView(currentItem.viewType) } }