Warning, /multimedia/audiotube/src/contents/ui/LibraryPage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2022 Jonah BrĂ¼chert <jbb@kaidan.im>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 import QtQuick 2.15
0006 import QtQuick.Window 2.15
0007 import QtQuick.Controls 2.12 as Controls
0008 import QtQuick.Layouts 1.3
0009 import org.kde.kirigami 2.19 as Kirigami
0010 import org.kde.kirigami.delegates as KirigamiDelegates
0011 import org.kde.kirigamiaddons.components 1.0 as Components
0012 
0013 import org.kde.ytmusic 1.0
0014 import "dialogs"
0015 
0016 Kirigami.ScrollablePage {
0017     objectName: "libraryPage"
0018     Kirigami.Theme.colorSet: Kirigami.Theme.View
0019     title: "AudioTube"
0020     readonly property bool isWidescreen: width >= Kirigami.Units.gridUnit * 30
0021 
0022     rightPadding: 0
0023     leftPadding: 0
0024 
0025     SongMenu {
0026         id: menu
0027     }
0028     ColumnLayout {
0029         RowLayout {
0030             Layout.fillWidth: true
0031             Kirigami.Heading {
0032                 text: i18n("Favourites")
0033                 Layout.alignment: Qt.AlignLeft
0034                 leftPadding: 15
0035             }
0036 
0037             Controls.ToolButton {
0038                 visible: isWidescreen
0039                 text: i18n("Play")
0040                 icon.name: "media-playback-start"
0041                 onClicked: UserPlaylistModel.playFavourites(Library.favourites, false)
0042             }
0043 
0044             Controls.ToolButton {
0045                 visible: isWidescreen
0046                 text: i18n("Shuffle")
0047                 icon.name: "shuffle"
0048                 onClicked: UserPlaylistModel.playFavourites(Library.favourites, true)
0049             }
0050 
0051             // Spacer
0052             Item {
0053                 visible: !isWidescreen
0054                 Layout.fillWidth: true
0055             }
0056 
0057             Controls.ToolButton {
0058                 Layout.fillHeight: true
0059                 icon.name: "view-more-symbolic"
0060                 onPressed: Kirigami.Settings.isMobile? favDrawer.open() : favMenu.popup()
0061                 Controls.Menu {
0062                     id: favMenu
0063                     Controls.MenuItem {
0064                         visible: !isWidescreen
0065                         text: i18n("Play")
0066                         icon.name: "media-playback-start"
0067                         onTriggered: UserPlaylistModel.playFavourites(Library.favourites, false)
0068                     }
0069                     Controls.MenuItem {
0070                         visible: !isWidescreen
0071                         text: i18n("Shuffle")
0072                         icon.name: "shuffle"
0073                         onTriggered: UserPlaylistModel.playFavourites(Library.favourites, true)
0074                     }
0075                     Controls.MenuItem {
0076                         text: i18n("Append to queue")
0077                         icon.name: "media-playlist-append"
0078                         onTriggered: UserPlaylistModel.appendFavourites(Library.favourites,false)
0079                     }
0080                 }
0081 
0082                 Components.BottomDrawer {
0083                     id: favDrawer
0084 
0085                     parent: applicationWindow().overlay
0086 
0087                     drawerContentItem: ColumnLayout {
0088                         KirigamiDelegates.SubtitleDelegate {
0089                             Layout.fillWidth: true
0090 
0091                             text: i18n("Play")
0092                             icon.name: "media-playback-start"
0093                             onClicked: {
0094                                 UserPlaylistModel.playFavourites(Library.favourites, false)
0095                                 favDrawer.close()
0096                             }
0097                         }
0098                         KirigamiDelegates.SubtitleDelegate {
0099                             Layout.fillWidth: true
0100 
0101                             text: i18n("Shuffle")
0102                             icon.name: "shuffle"
0103                             onClicked: {
0104                                 UserPlaylistModel.playFavourites(Library.favourites, true)
0105                                 favDrawer.close()
0106                             }
0107                         }
0108                         KirigamiDelegates.SubtitleDelegate {
0109                             Layout.fillWidth: true
0110 
0111                             text: i18n("Append to queue")
0112                             icon.name: "media-playlist-append"
0113                             onClicked: {
0114                                 UserPlaylistModel.appendFavourites(Library.favourites,false)
0115                                 favDrawer.close()
0116                             }
0117                         }
0118                         Item {
0119                             Layout.fillHeight: true
0120                         }
0121                     }
0122                 }
0123 
0124             }
0125             Item {
0126                 visible: isWidescreen
0127                 Layout.fillWidth: true
0128             }
0129             Controls.ToolButton {
0130                 text: i18n("Show All")
0131                 Layout.alignment: Qt.AlignRight
0132                 icon.name: "arrow-right"
0133                 onClicked: {
0134                     pageStack.push(pool.loadPageWithProperties("qrc:/PlaybackHistory.qml#favourites", {
0135                         "title": i18n("Favourites"),
0136                         "objectName": "favourites"
0137                     }))
0138                 }
0139             }
0140         }
0141 
0142         Kirigami.Icon {
0143             id: favouritesPlaceholder
0144 
0145             visible: favouriteRepeater.count === 0
0146             Layout.margins: 20
0147             isMask: true
0148             opacity:0.4
0149             color: Kirigami.Theme.hoverColor
0150             Layout.alignment: Qt.AlignHCenter
0151             Layout.fillWidth: true
0152             implicitWidth: 190
0153             implicitHeight: 190
0154 
0155             source: "qrc:/resources/favourites_placeholder.svg"
0156 
0157             Controls.Label {
0158                 visible: favouriteRepeater.count === 0
0159                 color: Kirigami.Theme.disabledTextColor
0160                 text: i18n("No Favourites Yet")
0161 
0162                 font {
0163                     bold: true
0164                     pointSize: 15
0165                 }
0166 
0167                 anchors.centerIn: favouritesPlaceholder
0168             }
0169         }
0170 
0171         HorizontalCoverView {
0172             id: favouriteRepeater
0173 
0174             Layout.fillWidth: true
0175 
0176             model: Library.favourites
0177             delegate: ColumnLayout {
0178                 id: delegateItem
0179                 required property string title
0180                 required property var artists
0181                 required property string artistsDisplayString
0182                 required property string videoId
0183                 required property int index
0184 
0185                 Layout.fillWidth: false
0186                 Layout.maximumWidth: 200
0187 
0188                 ThumbnailSource {
0189                     id: thumbnailSource
0190                     videoId: delegateItem.videoId
0191                 }
0192 
0193                 AlbumCoverItem {
0194                     Layout.fillWidth: true
0195                     Layout.fillHeight: true
0196 
0197                     onClicked: play(delegateItem.videoId)
0198                     onOptionsClicked: menu.openForSong(delegateItem.videoId,
0199                                                               delegateItem.title,
0200                                                               delegateItem.artists,
0201                                                               delegateItem.artistsDisplayString)
0202 
0203                     title: delegateItem.title
0204                     subtitle: delegateItem.artistsDisplayString
0205 
0206                     contentItem: RoundedImage {
0207                         source: thumbnailSource.cachedPath
0208                         anchors.fill: parent
0209                         radius: 10
0210                     }
0211                 }
0212 
0213                 Item {
0214                     height: 5
0215                 }
0216             }
0217         }
0218         Item {
0219             height: 20
0220         }
0221 
0222         RowLayout {
0223             Layout.fillWidth: true
0224 
0225             Kirigami.Heading {
0226                 text: i18n("Most played")
0227                 Layout.alignment: Qt.AlignLeft
0228                 leftPadding: 15
0229             }
0230 
0231             Controls.ToolButton {
0232                 visible: isWidescreen
0233                 text: i18n("Play")
0234                 icon.name: "media-playback-start"
0235                 onClicked: UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, false)
0236             }
0237 
0238             Controls.ToolButton {
0239                 visible: isWidescreen
0240                 text: i18n("Shuffle")
0241                 icon.name: "shuffle"
0242                 onClicked: UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, true)
0243             }
0244 
0245             // Spacer
0246             Item {
0247                 visible: !isWidescreen
0248                 Layout.fillWidth: true
0249             }
0250 
0251             Controls.ToolButton {
0252                 Layout.fillHeight: true
0253                 icon.name: "view-more-symbolic"
0254                 onPressed: Kirigami.Settings.isMobile? recDrawer.open() : recMenu.popup()
0255                 Controls.Menu {
0256                     id: recMenu
0257                     Controls.MenuItem {
0258                         visible: !isWidescreen
0259                         text: i18n("Play")
0260                         icon.name: "media-playback-start"
0261                         onTriggered: UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, false)
0262                     }
0263                     Controls.MenuItem {
0264                         visible: !isWidescreen
0265                         text: i18n("Shuffle")
0266                         icon.name: "shuffle"
0267                         onTriggered: UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, true)
0268                     }
0269                     Controls.MenuItem {
0270                         text: i18n("Append to queue")
0271                         icon.name: "media-playlist-append"
0272                         onTriggered: UserPlaylistModel.appendPlaybackHistory(Library.mostPlayed, false)
0273                     }
0274                 }
0275 
0276                 Components.BottomDrawer{
0277                     id: recDrawer
0278 
0279                     parent: applicationWindow().overlay
0280 
0281                     drawerContentItem: ColumnLayout {
0282                         KirigamiDelegates.SubtitleDelegate{
0283                             text: i18n("Play")
0284                             icon.name: "media-playback-start"
0285                             onClicked: {
0286                                 UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, false)
0287                                 recDrawer.close()
0288                             }
0289 
0290                         }
0291                         KirigamiDelegates.SubtitleDelegate{
0292                             text: i18n("Shuffle")
0293                             icon.name: "shuffle"
0294                             onClicked: {
0295                                 UserPlaylistModel.playPlaybackHistory(Library.mostPlayed, true)
0296                                 recDrawer.close()
0297                             }
0298                         }
0299                         KirigamiDelegates.SubtitleDelegate{
0300                             text: i18n("Append to queue")
0301                             icon.name: "media-playlist-append"
0302                             onClicked: {
0303                                 UserPlaylistModel.appendPlaybackHistory(Library.mostPlayed, false)
0304                                 recDrawer.close()
0305                             }
0306                         }
0307                         Item{
0308                             Layout.fillHeight: true
0309                         }
0310 
0311                     }
0312                 }
0313 
0314             }
0315             Item {
0316                 visible: isWidescreen
0317                 Layout.fillWidth: true
0318             }
0319             Controls.ToolButton {
0320                 text: i18n("Show All")
0321                 Layout.alignment: Qt.AlignRight
0322                 icon.name: "arrow-right"
0323                 onClicked: {
0324                     pageStack.push(pool.loadPageWithProperties("qrc:/PlaybackHistory.qml#history", {
0325                         "title": i18n("Played Songs"),
0326                         "objectName": "history"
0327                     }))
0328                 }
0329             }
0330         }
0331         Kirigami.Icon {
0332             visible: mostPlayedRepeater.count === 0
0333             Layout.margins: 20
0334             isMask: true
0335             opacity:0.4
0336             color: Kirigami.Theme.hoverColor
0337             id:playedPlaceholder
0338             Layout.alignment: Qt.AlignHCenter
0339             Layout.fillWidth: true
0340             implicitWidth: 190
0341             implicitHeight: 190
0342             source: "qrc:/resources/played_placeholder.svg"
0343 
0344             Controls.Label {
0345                 visible: mostPlayedRepeater.count === 0
0346                 color: Kirigami.Theme.disabledTextColor
0347                 anchors.centerIn:playedPlaceholder
0348                 font.bold: true
0349                 font.pointSize: 15
0350                 text: i18n("No Songs Played Yet")
0351             }
0352         }
0353 
0354         HorizontalCoverView {
0355             id: mostPlayedRepeater
0356 
0357             Layout.fillWidth: true
0358             model: Library.mostPlayed
0359             delegate: ColumnLayout {
0360                 id: mpdelegateItem
0361                 required property string title
0362                 required property var artists
0363                 required property string artistsDisplayString
0364                 required property string videoId
0365 
0366                 Layout.fillWidth: false
0367                 Layout.maximumWidth: 200
0368 
0369                 ThumbnailSource {
0370                     id: mpthumbnailSource
0371                     videoId: mpdelegateItem.videoId
0372                 }
0373 
0374                 AlbumCoverItem {
0375                     Layout.fillWidth: true
0376                     Layout.fillHeight: true
0377 
0378                     onClicked: play(mpdelegateItem.videoId)
0379                     onOptionsClicked: menu.openForSong(mpdelegateItem.videoId,
0380                                                               mpdelegateItem.title,
0381                                                               mpdelegateItem.artists,
0382                                                               mpdelegateItem.artistsDisplayString)
0383 
0384                     title: mpdelegateItem.title
0385                     subtitle: mpdelegateItem.artistsDisplayString
0386 
0387                     contentItem: RoundedImage {
0388                         source: mpthumbnailSource.cachedPath
0389                         anchors.fill: parent
0390                         radius: 10
0391                     }
0392                 }
0393 
0394                 Item {
0395                     height: 5
0396                 }
0397             }
0398         }
0399         Item {
0400             height: 20
0401         }
0402         RowLayout {
0403             Layout.fillWidth: true
0404             Kirigami.Heading {
0405                 text: i18n("Playlists")
0406                 Layout.alignment: Qt.AlignLeft
0407                 leftPadding: 15
0408             }
0409 
0410 
0411             // Spacer
0412             Item {
0413                 Layout.fillWidth: true
0414             }
0415 
0416             Controls.ToolButton {
0417                 text: i18n("Show All")
0418                 Layout.alignment: Qt.AlignRight
0419                 icon.name: "arrow-right"
0420                 onClicked: {pageStack.push("qrc:/LocalPlaylistsPage.qml", {
0421                       "objectName": "playlists"
0422                   })}
0423             }
0424         }
0425 
0426         Kirigami.Icon {
0427             id: playlistsPlaceholder
0428 
0429             visible: playlistsRepeater.count === 0
0430             Layout.margins: 20
0431             isMask: true
0432             opacity:0.4
0433             color: Kirigami.Theme.hoverColor
0434             Layout.alignment: Qt.AlignHCenter
0435             Layout.fillWidth: true
0436             implicitWidth: 190
0437             implicitHeight: 190
0438 
0439             source: "qrc:/resources/playlist_placeholder.svg"
0440 
0441             Controls.Label {
0442                 visible: favouriteRepeater.count === 0
0443                 color: Kirigami.Theme.disabledTextColor
0444                 text: i18n("No Playlists Yet")
0445 
0446                 font {
0447                     bold: true
0448                     pointSize: 15
0449                 }
0450 
0451                 anchors.centerIn: playlistsPlaceholder
0452             }
0453         }
0454 
0455         RenamePlaylistDialog{
0456             id: renamePlaylistDialog
0457             playlistsModel: localPlaylistsModel
0458         }
0459         Components.BottomDrawer{
0460             id: playlistDrawer
0461 
0462             parent: applicationWindow().overlay
0463 
0464             property var modelData
0465             drawerContentItem: ColumnLayout {
0466                 KirigamiDelegates.SubtitleDelegate{
0467                     text: i18n("Rename")
0468                     icon.name: "edit-entry"
0469                     onClicked: {
0470                         renamePlaylistDialog.modelData = playlistDrawer.modelData
0471                         renamePlaylistDialog.open()
0472                         playlistDrawer.close()
0473                     }
0474                 }
0475                 KirigamiDelegates.SubtitleDelegate{
0476                     text: i18n("Delete")
0477                     icon.name: "delete"
0478                     onClicked: {
0479                         localPlaylistsModel.deletePlaylist(playlistDrawer.modelData.playlistId)
0480                         playlistDrawer.close()
0481                     }
0482                 }
0483             }
0484         }
0485         Controls.Menu {
0486             id: playlistMenu
0487             property var modelData
0488             Controls.MenuItem {
0489                 text: i18n("Rename")
0490                 icon.name: "edit-entry"
0491                 onTriggered:{
0492                     renamePlaylistDialog.modelData = playlistMenu.modelData
0493                     renamePlaylistDialog.open()
0494                 }
0495             }
0496             Controls.MenuItem {
0497                 text: i18n("Delete")
0498                 icon.name: "delete"
0499                 onTriggered:{
0500                     localPlaylistsModel.deletePlaylist(playlistMenu.modelData.playlistId)
0501                 }
0502             }
0503         }
0504 
0505         HorizontalCoverView {
0506             id: playlistsRepeater
0507             Layout.fillWidth: true
0508             model: LocalPlaylistsModel {
0509                 id: localPlaylistsModel
0510             }
0511             delegate: ColumnLayout {
0512                 id: playlistDelegate
0513                 required property var model
0514                 required property string playlistId
0515                 required property string title
0516                 required property string description
0517                 required property date createdOn
0518                 required property var thumbnailIds
0519 
0520                 Layout.fillWidth: false
0521                 Layout.maximumWidth: 200
0522                 Layout.preferredWidth: 200
0523 
0524                 AlbumCoverItem {
0525                     Layout.fillWidth: true
0526                     Layout.fillHeight: true
0527 
0528                     title: playlistDelegate.title
0529                     subtitle: playlistDelegate.description
0530                     showIcon: false
0531 
0532                     LocalPlaylistsModel{id:localPlaylistModel}
0533 
0534                     ThumbnailSource {
0535                         id: thumbnailSource1
0536                         videoId: thumbnailIds[0] ?? ""
0537                     }
0538                     ThumbnailSource {
0539                         id: thumbnailSource2
0540                         videoId: thumbnailIds[1] ?? thumbnailIds[0] ?? ""
0541                     }
0542                     ThumbnailSource {
0543                         id: thumbnailSource3
0544                         videoId: thumbnailIds[2] ?? thumbnailIds[0] ?? ""
0545                     }
0546                     ThumbnailSource {
0547                         id: thumbnailSource4
0548                         videoId: thumbnailIds[3] ?? thumbnailIds[0] ?? ""
0549                     }
0550                     contentItem: PlaylistCover {
0551                         source1: thumbnailSource1.cachedPath
0552                         source2: thumbnailSource2.cachedPath
0553                         source3: thumbnailSource3.cachedPath
0554                         source4: thumbnailSource4.cachedPath
0555                         title: playlistDelegate.title
0556                         height: 200
0557                         width: height
0558                         radius: 10
0559                     }
0560 
0561                     onClicked: pageStack.push("qrc:/LocalPlaylistPage.qml", {
0562                         "playlistId": playlistDelegate.playlistId,
0563                         "title": playlistDelegate.title
0564                     })
0565 
0566                     onOptionsClicked:{
0567                         playlistMenu.modelData = playlistDelegate.model
0568                         playlistDrawer.modelData = playlistDelegate.model
0569                         Kirigami.Settings.isMobile? playlistDrawer.open() : playlistMenu.popup()
0570                     }
0571                 }
0572             }
0573         }
0574     }
0575 }