diff --git a/src/AudioTrackDelegate.qml b/src/AudioTrackDelegate.qml deleted file mode 100644 --- a/src/AudioTrackDelegate.qml +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2016-2017 Matthieu Gallien - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -import QtQuick 2.4 -import QtQuick.Controls 1.2 -import QtQuick.Controls.Styles 1.2 -import QtQuick.Window 2.2 -import QtQml.Models 2.1 -import QtQuick.Layouts 1.2 -import QtGraphicalEffects 1.0 - -import org.kde.elisa 1.0 - -FocusScope { - property string title - property string artist - property string albumArtist - property alias duration: durationLabel.text - property int trackNumber - property int discNumber - property alias rating: ratingWidget.starRating - property bool isFirstTrackOfDisc - property bool isSingleDiscAlbum - property var databaseId - property var playList - property var playerControl - property bool isAlternateColor - property var trackData - - signal clicked() - - id: mediaServerEntry - - Action { - id: clearAndEnqueue - text: i18nc("Clear play list and enqueue current track", "Play Now and Replace Play List") - iconName: "media-playback-start" - onTriggered: { - playList.clearAndEnqueue(trackData) - playerControl.ensurePlay() - } - } - - Action { - id: enqueue - text: i18nc("Enqueue current track", "Enqueue") - iconName: "media-track-add-amarok" - onTriggered: { - playList.enqueue(trackData) - } - } - - ColumnLayout { - anchors.fill: parent - spacing: 0 - - Rectangle { - Layout.preferredHeight: elisaTheme.delegateHeight + elisaTheme.layoutVerticalMargin * 2 - Layout.minimumHeight: elisaTheme.delegateHeight + elisaTheme.layoutVerticalMargin * 2 - Layout.maximumHeight: elisaTheme.delegateHeight + elisaTheme.layoutVerticalMargin * 2 - Layout.fillWidth: true - - color: (mediaServerEntry.isAlternateColor ? myPalette.alternateBase : myPalette.base) - - visible: isFirstTrackOfDisc && !isSingleDiscAlbum - - focus: true - - LabelWithToolTip { - id: discHeaderLabel - - text: 'CD ' + discNumber - - font.weight: Font.Bold - font.italic: true - color: myPalette.text - - anchors.fill: parent - anchors.topMargin: elisaTheme.layoutVerticalMargin * 2 - anchors.leftMargin: elisaTheme.layoutHorizontalMargin - - elide: Text.ElideRight - } - } - - Rectangle { - id: rowRoot - - Layout.fillHeight: true - Layout.fillWidth: true - - color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) - - MouseArea { - id: hoverHandle - - hoverEnabled: true - acceptedButtons: Qt.LeftButton - focus: true - - anchors.fill: parent - - onClicked: { - hoverHandle.forceActiveFocus() - mediaServerEntry.clicked() - } - - onDoubleClicked: playList.enqueue(trackData) - - RowLayout { - spacing: 0 - - anchors.fill: parent - - LabelWithToolTip { - id: mainLabel - - text: (artist !== albumArtist ? - "" + trackNumber + ' - ' + title + "" + ' - ' + artist + '' : - "" + trackNumber + ' - ' + title + "") - - horizontalAlignment: Text.AlignLeft - - color: myPalette.text - - 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 - - elide: Text.ElideRight - } - - Loader { - id: hoverLoader - active: false - - Layout.fillHeight: true - Layout.preferredWidth: elisaTheme.delegateHeight * 2 - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - - sourceComponent: RowLayout { - id: highlightMarker - - spacing: 0 - - anchors.fill: parent - - ToolButton { - id: enqueueButton - - opacity: 1 - visible: opacity > 0.1 - action: enqueue - - Layout.preferredHeight: elisaTheme.delegateHeight * 0.75 - Layout.preferredWidth: elisaTheme.delegateHeight * 0.75 - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - } - - ToolButton { - id: clearAndEnqueueButton - - opacity: 1 - visible: opacity > 0.1 - action: clearAndEnqueue - - Layout.preferredHeight: elisaTheme.delegateHeight * 0.75 - Layout.preferredWidth: elisaTheme.delegateHeight * 0.75 - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - Layout.rightMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.leftMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - } - } - } - - RatingStar { - id: ratingWidget - - starSize: elisaTheme.ratingStarSize - - Layout.leftMargin: elisaTheme.layoutHorizontalMargin - Layout.rightMargin: elisaTheme.layoutHorizontalMargin - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - } - - LabelWithToolTip { - id: durationLabel - - text: duration - - font.weight: Font.Light - color: myPalette.text - - elide: "ElideRight" - - Layout.rightMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.leftMargin: LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 - Layout.alignment: Qt.AlignVCenter | Qt.AlignRight - } - } - } - } - } - - states: [ - State { - name: 'default' - - PropertyChanges { - target: hoverLoader - active: false - } - PropertyChanges { - target: rowRoot - color: isAlternateColor ? myPalette.alternateBase : myPalette.base - } - }, - State { - name: 'active' - - when: hoverHandle.containsMouse || mediaServerEntry.activeFocus - - PropertyChanges { - target: hoverLoader - active: true - } - PropertyChanges { - target: rowRoot - color: myPalette.mid - } - } - - ] - transitions: Transition { - ParallelAnimation { - NumberAnimation { - properties: "height, opacity" - easing.type: Easing.InOutQuad - duration: 50 - } - ColorAnimation { - properties: "color" - duration: 200 - } - } - } -} - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,7 +38,6 @@ android/PlatformIntegration.qml RatingStar.qml - AudioTrackDelegate.qml PlayListEntry.qml MediaAlbumDelegate.qml MediaArtistDelegate.qml @@ -61,7 +60,8 @@ MediaAllAlbumView.qml MediaAllArtistView.qml MediaAllTracksView.qml - MediaTracksDelegate.qml + MediaTrackDelegate.qml + MediaAlbumTrackDelegate.qml ViewSelector.qml ) diff --git a/src/MediaAlbumTrackDelegate.qml b/src/MediaAlbumTrackDelegate.qml new file mode 100644 --- /dev/null +++ b/src/MediaAlbumTrackDelegate.qml @@ -0,0 +1,73 @@ +/* + * Copyright 2016-2017 Matthieu Gallien + * Copyright 2017 Alexander Stippich + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.7 +import QtQuick.Layouts 1.2 + +FocusScope { + id: albumTrack + + property alias mediaTrack: mediaTrack + + ColumnLayout { + anchors.fill: parent + + spacing: 0 + + Rectangle { + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.minimumHeight: elisaTheme.delegateHeight + Layout.maximumHeight: elisaTheme.delegateHeight + Layout.fillWidth: true + color: (mediaTrack.isAlternateColor ? myPalette.alternateBase : myPalette.base) + + visible: mediaTrack.isFirstTrackOfDisc && !mediaTrack.isSingleDiscAlbum + + LabelWithToolTip { + id: discHeaderLabel + + text: 'CD ' + mediaTrack.discNumber + + font.weight: Font.Bold + font.italic: true + color: myPalette.text + + anchors.fill: parent + anchors.topMargin: elisaTheme.layoutVerticalMargin + anchors.leftMargin: elisaTheme.layoutHorizontalMargin + + elide: Text.ElideRight + } + } + + MediaTrackDelegate { + id: mediaTrack + + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.minimumHeight: elisaTheme.delegateHeight + Layout.maximumHeight: elisaTheme.delegateHeight + Layout.fillWidth: true + + focus: true + + detailedView: false + } + } +} diff --git a/src/MediaAlbumView.qml b/src/MediaAlbumView.qml --- a/src/MediaAlbumView.qml +++ b/src/MediaAlbumView.qml @@ -142,68 +142,67 @@ focus: true - model: DelegateModel { - model: contentModel - - groups: [ - DelegateModelGroup { name: "selected" } - ] - - delegate: AudioTrackDelegate { - id: entry - - focus: true - - isAlternateColor: DelegateModel.itemsIndex % 2 - height: ((model.isFirstTrackOfDisc && !isSingleDiscAlbum) ? elisaTheme.delegateWithHeaderHeight : elisaTheme.delegateHeight) - width: contentDirectoryView.width - - databaseId: model.databaseId - playList: topListing.playListModel - playerControl: topListing.playerControl - - title: if (model != undefined && model.title !== undefined) - model.title - else - '' - - artist: if (model != undefined && model.artist !== undefined) - model.artist + model: contentModel + + delegate: MediaAlbumTrackDelegate { + id: entry + + height: ((model.isFirstTrackOfDisc && !isSingleDiscAlbum) ? elisaTheme.delegateHeight*2 : elisaTheme.delegateHeight) + width: contentDirectoryView.width + + focus: true + + mediaTrack.isAlternateColor: (index % 2) === 1 + + mediaTrack.title: if (model != undefined && model.title !== undefined) + model.title + else + '' + mediaTrack.artist: if (model != undefined && model.artist !== undefined) + model.artist + else + '' + mediaTrack.albumArtist: if (model != undefined && model.albumArtist !== undefined) + model.albumArtist + else + '' + mediaTrack.duration: if (model != undefined && model.duration !== undefined) + model.duration + else + '' + mediaTrack.trackNumber: if (model != undefined && model.trackNumber !== undefined) + model.trackNumber + else + '' + mediaTrack.discNumber: if (model != undefined && model.discNumber !== undefined) + model.discNumber else '' + mediaTrack.rating: if (model != undefined && model.rating !== undefined) + model.rating + else + 0 + mediaTrack.trackData: if (model != undefined && model.trackData !== undefined) + model.trackData + else + '' + mediaTrack.isFirstTrackOfDisc: if (model != undefined && model.isFirstTrackOfDisc !== undefined) + model.isFirstTrackOfDisc + else + false + mediaTrack.isSingleDiscAlbum: if (model != undefined && model.isSingleDiscAlbum !== undefined) + model.isSingleDiscAlbum + else + true - albumArtist: topListing.artistName - - duration: if (model != undefined && model.duration !== undefined) - model.duration - else - '' - - trackNumber: if (model != undefined && model.trackNumber !== undefined) - model.trackNumber - else - '' - - discNumber: if (model != undefined && model.discNumber !== undefined) - model.discNumber - else - '' - rating: if (model != undefined && model.rating !== undefined) - model.rating - else - 0 + mediaTrack.onClearPlaylist: topListing.playListModel.clearPlayList() - trackData: if (model != undefined && model.trackData !== undefined) - model.trackData - else - '' + mediaTrack.onEnqueueToPlaylist: topListing.playListModel.enqueue(track) - isFirstTrackOfDisc: model.isFirstTrackOfDisc - isSingleDiscAlbum: topListing.isSingleDiscAlbum + mediaTrack.onEnsurePlay: topListing.playerControl.ensurePlay() - onClicked: contentDirectoryView.currentIndex = index - } + mediaTrack.onClicked: contentDirectoryView.currentIndex = index } } } diff --git a/src/MediaAllTracksView.qml b/src/MediaAllTracksView.qml --- a/src/MediaAllTracksView.qml +++ b/src/MediaAllTracksView.qml @@ -28,14 +28,14 @@ import org.kde.elisa 1.0 FocusScope { + id: rootElement + property var playerControl property var playListModel property var tracksModel property var stackView property var musicListener - id: rootElement - SystemPalette { id: myPalette colorGroup: SystemPalette.Active @@ -88,7 +88,7 @@ filterRating: filterBar.filterRating } - delegate: MediaTracksDelegate { + delegate: MediaTrackDelegate { id: entry width: contentDirectoryView.width @@ -102,49 +102,60 @@ model.title else '' - artist: if (model != undefined && model.artist !== undefined) model.artist else '' - albumName: if (model != undefined && model.album !== undefined) model.album else '' - + albumArtist: if (model != undefined && model.albumArtist !== undefined) + model.albumArtist + else + '' duration: if (model != undefined && model.duration !== undefined) model.duration else '' - trackNumber: if (model != undefined && model.trackNumber !== undefined) model.trackNumber else '' - discNumber: if (model != undefined && model.discNumber !== undefined) model.discNumber else '' - rating: if (model != undefined && model.rating !== undefined) model.rating else 0 - trackData: if (model != undefined && model.trackData !== undefined) model.trackData else '' - coverImage: if (model != undefined && model.image !== undefined) model.image else '' - - playList: rootElement.playListModel - playerControl: rootElement.playerControl + trackResource: if (model != undefined && model.trackResource !== undefined) + model.trackResource + else + '' + isFirstTrackOfDisc: if (model != undefined && model.isFirstTrackOfDisc !== undefined) + model.isFirstTrackOfDisc + else + false + isSingleDiscAlbum: if (model != undefined && model.isSingleDiscAlbum !== undefined) + model.isSingleDiscAlbum + else + true + + onClearPlaylist: rootElement.playListModel.clearPlayList() + + onEnqueueToPlaylist: rootElement.playListModel.enqueue(track) + + onEnsurePlay: rootElement.playerControl.ensurePlay() onClicked: contentDirectoryView.currentIndex = index } diff --git a/src/MediaTracksDelegate.qml b/src/MediaTrackDelegate.qml rename from src/MediaTracksDelegate.qml rename to src/MediaTrackDelegate.qml --- a/src/MediaTracksDelegate.qml +++ b/src/MediaTrackDelegate.qml @@ -1,5 +1,6 @@ /* * Copyright 2016-2017 Matthieu Gallien + * Copyright 2017 Alexander Stippich * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -17,53 +18,57 @@ * Boston, MA 02110-1301, USA. */ -import QtQuick 2.4 +import QtQuick 2.7 import QtQuick.Layouts 1.2 import QtQuick.Controls 1.2 import QtQuick.Window 2.2 import QtGraphicalEffects 1.0 import org.kde.elisa 1.0 FocusScope { - id: viewTrackDelegate + id: mediaTrack property string title property var coverImage property string artist property string albumName - property alias duration: durationLabel.text + property string albumArtist + property string trackResource + property string duration property int trackNumber property int discNumber - property alias rating: ratingWidget.starRating - property var databaseId - property var playList - property var playerControl - property bool isAlternateColor + property int rating + property bool isFirstTrackOfDisc + property bool isSingleDiscAlbum property var trackData + property bool isAlternateColor + property bool detailedView: true signal clicked() + signal clearPlaylist() + signal enqueueToPlaylist(var track) + signal ensurePlay() Action { id: clearAndEnqueue text: i18nc("Clear play list and enqueue current track", "Play Now and Replace Play List") iconName: "media-playback-start" onTriggered: { - playList.clearAndEnqueue(trackData) - playerControl.ensurePlay() + clearPlaylist() + enqueueToPlaylist(trackData) + ensurePlay() } } Action { id: enqueue text: i18nc("Enqueue current track", "Enqueue") iconName: "media-track-add-amarok" - onTriggered: { - playList.enqueue(trackData) - } + onTriggered: enqueueToPlaylist(trackData) } Rectangle { - id: highlightMarker + id: rowRoot anchors.fill: parent @@ -75,33 +80,66 @@ anchors.fill: parent hoverEnabled: true - + focus: true acceptedButtons: Qt.LeftButton onClicked: { hoverArea.forceActiveFocus() - viewTrackDelegate.clicked() + mediaTrack.clicked() } - onDoubleClicked: playList.enqueue(trackData) + onDoubleClicked: enqueueToPlaylist(trackData) RowLayout { anchors.fill: parent spacing: 0 + LabelWithToolTip { + id: mainLabel + + visible: !detailedView + + text: (artist !== albumArtist ? + "" + trackNumber + ' - ' + title + "" + ' - ' + artist + '' : + "" + trackNumber + ' - ' + title + "") + + horizontalAlignment: Text.AlignLeft + + color: myPalette.text + + 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 + + elide: Text.ElideRight + } + Item { - Layout.preferredHeight: viewTrackDelegate.height * 0.9 - Layout.preferredWidth: viewTrackDelegate.height * 0.9 + Layout.preferredHeight: mediaTrack.height * 0.9 + Layout.preferredWidth: mediaTrack.height * 0.9 Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + visible: detailedView + Image { id: coverImageElement anchors.fill: parent - sourceSize.width: viewTrackDelegate.height * 0.9 - sourceSize.height: viewTrackDelegate.height * 0.9 + sourceSize.width: mediaTrack.height * 0.9 + sourceSize.height: mediaTrack.height * 0.9 fillMode: Image.PreserveAspectFit smooth: true @@ -111,8 +149,8 @@ layer.enabled: true layer.effect: DropShadow { - horizontalOffset: viewTrackDelegate.height * 0.02 - verticalOffset: viewTrackDelegate.height * 0.02 + horizontalOffset: mediaTrack.height * 0.02 + verticalOffset: mediaTrack.height * 0.02 source: coverImageElement @@ -125,14 +163,16 @@ } ColumnLayout { + visible: detailedView + Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignLeft spacing: 0 LabelWithToolTip { - id: mainLabel + id: mainLabelDetailed text: trackNumber + ' - ' + title horizontalAlignment: Text.AlignLeft @@ -146,7 +186,7 @@ Layout.fillWidth: true Layout.topMargin: elisaTheme.layoutVerticalMargin / 2 - elide: "ElideRight" + elide: Text.ElideRight } Item { @@ -156,7 +196,7 @@ LabelWithToolTip { id: artistLabel - text: artist + ' - ' + albumName + text: (isSingleDiscAlbum ? artist + ' - ' + albumName : artist + ' - ' + albumName + ' - CD ' + discNumber) horizontalAlignment: Text.AlignLeft font.weight: Font.Light @@ -169,15 +209,15 @@ Layout.fillWidth: true Layout.bottomMargin: elisaTheme.layoutVerticalMargin / 2 - elide: "ElideRight" + elide: Text.ElideRight } } ToolButton { id: enqueueButton - Layout.preferredHeight: elisaTheme.trackDelegateHeight * 0.75 - Layout.preferredWidth: elisaTheme.trackDelegateHeight * 0.75 + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.preferredWidth: elisaTheme.delegateHeight opacity: 0 visible: opacity > 0.1 @@ -188,8 +228,8 @@ ToolButton { id: clearAndEnqueueButton - Layout.preferredHeight: elisaTheme.trackDelegateHeight * 0.75 - Layout.preferredWidth: elisaTheme.trackDelegateHeight * 0.75 + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.preferredWidth: elisaTheme.delegateHeight opacity: 0 visible: opacity > 0.1 @@ -218,7 +258,7 @@ font.weight: Font.Light color: myPalette.text - elide: "ElideRight" + elide: Text.ElideRight Layout.alignment: Qt.AlignVCenter | Qt.AlignRight Layout.rightMargin: !LayoutMirroring.enabled ? elisaTheme.layoutHorizontalMargin : 0 @@ -231,7 +271,7 @@ states: [ State { name: 'notSelected' - when: !hoverArea.containsMouse && !viewTrackDelegate.activeFocus + when: !hoverArea.containsMouse && !mediaTrack.activeFocus PropertyChanges { target: clearAndEnqueueButton opacity: 0 @@ -241,13 +281,13 @@ opacity: 0 } PropertyChanges { - target: highlightMarker + target: rowRoot color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) } }, State { - name: 'hoveredAndNotSelected' - when: hoverArea.containsMouse || viewTrackDelegate.activeFocus + name: 'hoveredOrSelected' + when: hoverArea.containsMouse || mediaTrack.activeFocus PropertyChanges { target: clearAndEnqueueButton opacity: 1 @@ -257,22 +297,22 @@ opacity: 1 } PropertyChanges { - target: highlightMarker + target: rowRoot color: myPalette.mid } } ] transitions: Transition { ParallelAnimation { NumberAnimation { - properties: "height, opacity" + properties: "opacity" easing.type: Easing.InOutQuad - duration: 50 + duration: 250 } ColorAnimation { properties: "color" - duration: 200 + duration: 250 } } } diff --git a/src/albummodel.h b/src/albummodel.h --- a/src/albummodel.h +++ b/src/albummodel.h @@ -79,7 +79,8 @@ IdRole = ResourceRole + 1, DatabaseIdRole = IdRole + 1, DiscFirstTrackRole = DatabaseIdRole + 1, - TrackDataRole = DiscFirstTrackRole + 1, + IsSingleDiscAlbumRole = DiscFirstTrackRole + 1, + TrackDataRole = IsSingleDiscAlbumRole + 1, }; Q_ENUM(ColumnsRoles) diff --git a/src/albummodel.cpp b/src/albummodel.cpp --- a/src/albummodel.cpp +++ b/src/albummodel.cpp @@ -73,7 +73,9 @@ roles[static_cast(ColumnsRoles::ImageRole)] = "image"; roles[static_cast(ColumnsRoles::DatabaseIdRole)] = "databaseId"; roles[static_cast(ColumnsRoles::DiscFirstTrackRole)] = "isFirstTrackOfDisc"; + roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; roles[static_cast(ColumnsRoles::TrackDataRole)] = "trackData"; + roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; return roles; } @@ -174,6 +176,9 @@ result = (previousTrack.discNumber() != track.discNumber()); } break; + case ColumnsRoles::IsSingleDiscAlbumRole: + result = track.isSingleDiscAlbum(); + break; case ColumnsRoles::RatingRole: result = track.rating(); break; diff --git a/src/alltracksmodel.h b/src/alltracksmodel.h --- a/src/alltracksmodel.h +++ b/src/alltracksmodel.h @@ -41,14 +41,16 @@ CreatorRole = MilliSecondsDurationRole + 1, ArtistRole = CreatorRole + 1, AlbumRole = ArtistRole + 1, - TrackNumberRole = AlbumRole + 1, + AlbumArtistRole = AlbumRole + 1, + TrackNumberRole = AlbumArtistRole + 1, DiscNumberRole = TrackNumberRole + 1, RatingRole = DiscNumberRole + 1, ImageRole = RatingRole + 1, ResourceRole = ImageRole + 1, IdRole = ResourceRole + 1, DatabaseIdRole = IdRole + 1, - TrackDataRole = DatabaseIdRole + 1, + IsSingleDiscAlbumRole = DatabaseIdRole + 1, + TrackDataRole = IsSingleDiscAlbumRole + 1, }; Q_ENUM(ColumnsRoles) diff --git a/src/alltracksmodel.cpp b/src/alltracksmodel.cpp --- a/src/alltracksmodel.cpp +++ b/src/alltracksmodel.cpp @@ -61,12 +61,15 @@ roles[static_cast(ColumnsRoles::DurationRole)] = "duration"; roles[static_cast(ColumnsRoles::ArtistRole)] = "artist"; roles[static_cast(ColumnsRoles::AlbumRole)] = "album"; + roles[static_cast(ColumnsRoles::AlbumArtistRole)] = "albumArtist"; roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; roles[static_cast(ColumnsRoles::ImageRole)] = "image"; roles[static_cast(ColumnsRoles::DatabaseIdRole)] = "databaseId"; + roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; roles[static_cast(ColumnsRoles::TrackDataRole)] = "trackData"; + roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; return roles; } @@ -142,6 +145,9 @@ case ColumnsRoles::AlbumRole: result = d->mAllTracks[d->mIds[index.row()]].albumName(); break; + case ColumnsRoles::AlbumArtistRole: + result = d->mAllTracks[d->mIds[index.row()]].albumArtist(); + break; case ColumnsRoles::TrackNumberRole: result = d->mAllTracks[d->mIds[index.row()]].trackNumber(); break; @@ -153,6 +159,9 @@ } break; } + case ColumnsRoles::IsSingleDiscAlbumRole: + result = d->mAllTracks[d->mIds[index.row()]].isSingleDiscAlbum(); + break; case ColumnsRoles::RatingRole: result = d->mAllTracks[d->mIds[index.row()]].rating(); break; diff --git a/src/upnpControl.qrc b/src/upnpControl.qrc --- a/src/upnpControl.qrc +++ b/src/upnpControl.qrc @@ -1,6 +1,5 @@ - AudioTrackDelegate.qml MediaPlayerControl.qml RatingStar.qml MediaPlayListView.qml @@ -37,12 +36,13 @@ PlatformIntegration.qml LabelWithToolTip.qml MediaAllTracksView.qml - MediaTracksDelegate.qml TopNotification.qml TrackImportNotification.qml TopNotificationItem.qml ViewSelector.qml FilterBar.qml + MediaTrackDelegate.qml + MediaAlbumTrackDelegate.qml windows/WindowsTheme.qml