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 }