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

0001 // SPDX-FileCopyrightText: 2023 Mathis BrĂ¼chert <mbb@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.Controls as Controls
0007 import org.kde.ytmusic 1.0
0008 import org.kde.kirigami 2.19 as Kirigami
0009 import org.kde.kirigami.delegates as KirigamiDelegates
0010 import org.kde.kirigamiaddons.components 1.0 as Components
0011 
0012 import QtQuick.Layouts 1.15
0013 
0014 import "dialogs"
0015 
0016 Item {
0017     id:root
0018     property string videoId
0019     property list<Kirigami.Action> pageSpecificActions
0020 
0021     PlaylistDialog{
0022         id: playlistDialog
0023     }
0024     function openForSong(videoId, songTitle, artists, artistsDisplayString) {
0025         menu.videoId = videoId
0026         drawer.videoId = videoId
0027         playlistDialog.videoId = videoId
0028         root.videoId = videoId
0029 
0030         menu.songTitle = songTitle
0031         drawer.songTitle = songTitle
0032         playlistDialog.songTitle = songTitle
0033 
0034         menu.artists = artists
0035         drawer.artists = artists
0036 
0037         menu.artistsDisplayString = artistsDisplayString
0038         drawer.artistsDisplayString = artistsDisplayString
0039         playlistDialog.artists = artistsDisplayString
0040 
0041 
0042         if (Kirigami.Settings.isMobile) {
0043             drawer.interactive = true
0044             drawer.open()
0045          } else {
0046             menu.popup()
0047         }
0048     }
0049 
0050     Components.BottomDrawer {
0051         id: drawer
0052 
0053         parent: applicationWindow().overlay
0054 
0055         property string videoId
0056         property string songTitle
0057         property var artists
0058         property string artistsDisplayString
0059 
0060         headerContentItem: RowLayout {
0061             spacing: 10
0062             Layout.topMargin: 0
0063             Kirigami.ShadowedRectangle {
0064                 Layout.rightMargin: 5
0065                 Layout.topMargin: 0
0066                 color: Kirigami.Theme.backgroundColor
0067                 width: 60
0068                 height: width
0069                 radius: 5
0070                 shadow.size: 15
0071                 shadow.xOffset: 5
0072                 shadow.yOffset: 5
0073                 shadow.color: Qt.rgba(0, 0, 0, 0.2)
0074                 RoundedImage {
0075                     source: thumbnailSource.cachedPath
0076                     height: width
0077                     width: parent.width
0078                     radius: parent.radius
0079                 }
0080             }
0081             ColumnLayout {
0082                 Layout.margins: 0
0083                 Layout.topMargin: 0
0084                 Controls.Label{
0085                     text: drawer.songTitle
0086                     elide: Text.ElideRight
0087                     Layout.fillWidth: true
0088                 }
0089                 Controls.Label {
0090                     text: drawer.artistsDisplayString
0091                     color: Kirigami.Theme.disabledTextColor
0092                     elide: Text.ElideRight
0093                     Layout.fillWidth: true
0094                 }
0095             }
0096         }
0097 
0098         drawerContentItem: ColumnLayout {
0099             ThumbnailSource {
0100                 id: thumbnailSource
0101                 videoId: drawer.videoId
0102             }
0103 
0104             KirigamiDelegates.SubtitleDelegate {
0105                 Layout.topMargin: 10
0106                 Layout.fillWidth: true
0107 
0108                 text: i18n("Play Next")
0109                 icon.name: "go-next"
0110                 onClicked: {
0111                     UserPlaylistModel.playNext(drawer.videoId, drawer.songTitle, drawer.artists)
0112                     drawer.close()
0113                 }
0114             }
0115             KirigamiDelegates.SubtitleDelegate {
0116                 Layout.fillWidth: true
0117 
0118                 text: i18n("Add to queue")
0119                 icon.name: "media-playlist-append"
0120                 onClicked: {
0121                     UserPlaylistModel.append(drawer.videoId, drawer.songTitle, drawer.artists)
0122                     drawer.close()
0123                 }
0124             }
0125             KirigamiDelegates.SubtitleDelegate {
0126                 Layout.fillWidth: true
0127 
0128                 readonly property QtObject favouriteWatcher: Library.favouriteWatcher(drawer.videoId)
0129 
0130                 text: favouriteWatcher ? (favouriteWatcher.isFavourite ? i18n("Remove Favourite"): i18n("Add Favourite")): ""
0131                 icon.name: favouriteWatcher ? (favouriteWatcher.isFavourite ? "starred-symbolic" : "non-starred-symbolic") : ""
0132                 onClicked: {
0133                     if (favouriteWatcher) {
0134                         if (favouriteWatcher.isFavourite) {
0135                             Library.removeFavourite(drawer.videoId)
0136                         } else {
0137                             Library.addFavourite(drawer.videoId, drawer.songTitle, drawer.artistsDisplayString, "")
0138                         }
0139                     }
0140                     drawer.close()
0141                 }
0142             }
0143 
0144             KirigamiDelegates.SubtitleDelegate {
0145                 Layout.fillWidth: true
0146 
0147                 readonly property QtObject wasPlayedWatcher: Library.wasPlayedWatcher(drawer.videoId)
0148 
0149                 text: i18n("Remove from History")
0150                 icon.name: "list-remove"
0151                 onClicked: {
0152                     Library.removePlaybackHistoryItem(drawer.videoId)
0153                     drawer.close()
0154                 }
0155                 visible: wasPlayedWatcher ? wasPlayedWatcher.wasPlayed : false
0156                 enabled: wasPlayedWatcher ? wasPlayedWatcher.wasPlayed : false
0157             }
0158 
0159             KirigamiDelegates.SubtitleDelegate {
0160                 Layout.fillWidth: true
0161 
0162                 readonly property QtObject wasPlayedWatcher: Library.wasPlayedWatcher(drawer.videoId)
0163 
0164                 text: i18n("Add to playlist")
0165                 icon.name: "media-playlist-append"
0166                 onClicked: {
0167                     playlistDialog.open()
0168                     drawer.close()
0169                 }
0170             }
0171 
0172             // Page specific actions //
0173 
0174             Repeater {
0175                 model: root.pageSpecificActions
0176                 delegate: KirigamiDelegates.SubtitleDelegate {
0177                     Layout.fillWidth: true
0178 
0179                     required property var modelData
0180                     text: modelData.text
0181                     icon: modelData.icon.name
0182                     onClicked: {
0183                         modelData.triggered()
0184                         drawer.close()
0185                     }
0186                 }
0187             }
0188 
0189 
0190             KirigamiDelegates.SubtitleDelegate {
0191                 Layout.fillWidth: true
0192 
0193                 readonly property QtObject wasPlayedWatcher: Library.wasPlayedWatcher(drawer.videoId)
0194 
0195                 text: i18n("Share Song")
0196                 icon.name: "emblem-shared-symbolic"
0197                 onClicked: {
0198                     openShareMenu(drawer.songTitle, "https://music.youtube.com/watch?v=" + drawer.videoId)
0199                     drawer.close()
0200                 }
0201             }
0202             Item {
0203                 Layout.fillHeight: true
0204             }
0205 
0206         }
0207     }
0208 
0209     Controls.Menu {
0210         property string videoId
0211         property string songTitle
0212         property var artists
0213         property string artistsDisplayString
0214         id: menu
0215 
0216         Controls.MenuItem {
0217             text: i18n("Play Next")
0218             icon.name: "go-next"
0219             onTriggered: UserPlaylistModel.playNext(menu.videoId, menu.songTitle, menu.artists)
0220         }
0221 
0222         Controls.MenuItem {
0223             text: i18n("Add to queue")
0224             icon.name: "media-playlist-append"
0225             onTriggered: UserPlaylistModel.append(menu.videoId, menu.songTitle, menu.artists)
0226         }
0227 
0228 
0229         Controls.MenuSeparator{}
0230 
0231         Controls.MenuItem {
0232             readonly property QtObject favouriteWatcher: Library.favouriteWatcher(menu.videoId)
0233             text: favouriteWatcher ? (favouriteWatcher.isFavourite ? i18n("Remove Favourite"): i18n("Add Favourite")): ""
0234             icon.name: favouriteWatcher ? (favouriteWatcher.isFavourite ? "starred-symbolic" : "non-starred-symbolic") : ""
0235             onTriggered: {
0236                 if (favouriteWatcher) {
0237                     if (favouriteWatcher.isFavourite) {
0238                         Library.removeFavourite(menu.videoId)
0239                     } else {
0240                         Library.addFavourite(menu.videoId, menu.songTitle, menu.artistsDisplayString, "")
0241                     }
0242                 }
0243             }
0244         }
0245         Controls.MenuItem{
0246             readonly property QtObject wasPlayedWatcher: Library.wasPlayedWatcher(menu.videoId)
0247             text: i18n("Remove from History")
0248             icon.name: "list-remove"
0249             onTriggered: {
0250                 Library.removePlaybackHistoryItem(menu.videoId)
0251             }
0252             enabled: wasPlayedWatcher ? wasPlayedWatcher.wasPlayed : false
0253             visible: wasPlayedWatcher ? wasPlayedWatcher.wasPlayed : false
0254         }
0255         Controls.MenuItem {
0256             text: i18n("Add to playlist")
0257             icon.name: "media-playlist-append"
0258             onTriggered: playlistDialog.open()
0259         }
0260         // Page specific actions //
0261 
0262         Controls.MenuSeparator{ visible: instantiator.count !== 0 }
0263 
0264         Instantiator {
0265             id: instantiator
0266             model: root.pageSpecificActions
0267             onObjectAdded: menu.insertItem(index+8, object)
0268             onObjectRemoved: menu.removeItem(object)
0269             delegate: Controls.MenuItem {
0270                 required property var modelData
0271                 icon.name: modelData.icon.name
0272                 text:modelData.text
0273                 onTriggered: modelData.triggered()
0274             }
0275         }
0276 
0277 
0278         Controls.MenuSeparator{}
0279 
0280         Controls.MenuItem {
0281             text: i18n("Share Song")
0282             icon.name: "emblem-shared-symbolic"
0283             onTriggered: openShareMenu(menu.songTitle, "https://music.youtube.com/watch?v=" + menu.videoId)
0284         }
0285     }
0286 }