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,69 @@ +/* + * 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 + +ColumnLayout { + default property alias mediaTrackDelegate: mediaTrackLoader.sourceComponent + property bool isAlternateColor + property bool visibleLabel: false + property int discNumber + + spacing: 0 + + Rectangle { + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.minimumHeight: elisaTheme.delegateHeight + Layout.maximumHeight: elisaTheme.delegateHeight + Layout.fillWidth: true + color: (isAlternateColor ? myPalette.alternateBase : myPalette.base) + + visible: visibleLabel + + 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 + anchors.leftMargin: elisaTheme.layoutHorizontalMargin + + elide: Text.ElideRight + } + } + + Loader { + id: mediaTrackLoader + Layout.preferredHeight: elisaTheme.delegateHeight + Layout.minimumHeight: elisaTheme.delegateHeight + Layout.maximumHeight: elisaTheme.delegateHeight + Layout.fillWidth: true + active: true + + } +} diff --git a/src/MediaAlbumView.qml b/src/MediaAlbumView.qml --- a/src/MediaAlbumView.qml +++ b/src/MediaAlbumView.qml @@ -149,60 +149,73 @@ DelegateModelGroup { name: "selected" } ] - delegate: AudioTrackDelegate { + delegate: MediaAlbumTrackDelegate { id: entry focus: true - isAlternateColor: DelegateModel.itemsIndex % 2 - height: ((model.isFirstTrackOfDisc && !isSingleDiscAlbum) ? elisaTheme.delegateWithHeaderHeight : elisaTheme.delegateHeight) + height: ((model.isFirstTrackOfDisc && !isSingleDiscAlbum) ? elisaTheme.delegateHeight*2 : 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 - else - '' - - albumArtist: topListing.artistName - - duration: if (model != undefined && model.duration !== undefined) - model.duration - else - '' - - trackNumber: if (model != undefined && model.trackNumber !== undefined) - model.trackNumber - else - '' - + isAlternateColor: DelegateModel.itemsIndex % 2 + visibleLabel: model.isFirstTrackOfDisc && !isSingleDiscAlbum discNumber: if (model != undefined && model.discNumber !== undefined) model.discNumber else '' - rating: if (model != undefined && model.rating !== undefined) - model.rating - else - 0 + mediaTrackDelegate: MediaTrackDelegate { + + isAlternateColor: entry.isAlternateColor - trackData: if (model != undefined && model.trackData !== undefined) - model.trackData + title: if (model != undefined && model.title !== undefined) + model.title else '' - - isFirstTrackOfDisc: model.isFirstTrackOfDisc - isSingleDiscAlbum: topListing.isSingleDiscAlbum - - onClicked: contentDirectoryView.currentIndex = index + artist: if (model != undefined && model.artist !== undefined) + model.artist + 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: entry.discNumber + + rating: if (model != undefined && model.rating !== undefined) + model.rating + else + 0 + trackData: if (model != undefined && model.trackData !== undefined) + model.trackData + else + '' + isFirstTrackOfDisc: if (model != undefined && model.isFirstTrackOfDisc !== undefined) + model.isFirstTrackOfDisc + else + false + isSingleDiscAlbum: if (model != undefined && model.isSingleDiscAlbum !== undefined) + model.isSingleDiscAlbum + else + true + detailedView: false + + onClearPlaylist: topListing.playListmodel.clearPlayList() + + onEnqueueToPlaylist: topListing.playListmodel.enqueue(track) + + onEnsurePlay: topListing.playerControl.ensurePlay() + + 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 detailedView: true + property bool isAlternateColor 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() } - 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 + when: hoverArea.containsMouse || mediaTrack.activeFocus PropertyChanges { target: clearAndEnqueueButton opacity: 1 @@ -257,7 +297,7 @@ opacity: 1 } PropertyChanges { - target: highlightMarker + target: rowRoot color: myPalette.mid } } @@ -268,11 +308,11 @@ NumberAnimation { properties: "height, 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