Warning, /multimedia/audiotube/src/contents/ui/ArtistPage.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2021 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 org.kde.kirigami 2.14 as Kirigami
0007 import QtQuick.Controls 2.14 as Controls
0008 import QtQuick.Layouts 1.3
0009
0010 import "components"
0011
0012 import org.kde.ytmusic 1.0
0013
0014 Kirigami.ScrollablePage {
0015 id: root
0016 property string channelId
0017 property string radioId
0018 property string shuffleId
0019 title: artistModel.title
0020
0021 SongMenu {
0022 id: menu
0023 }
0024
0025 DoubleActionButton {
0026 id: action
0027 visible: false
0028 property bool shown
0029 shown: !root.flickable.atYBeginning
0030 onShownChanged:
0031 if(shown){
0032 visible = true
0033 appear.running = true
0034 } else {
0035 disappear.running = true
0036 }
0037
0038 parent: overlay
0039 x: root.width - width - margin
0040 y: root.height - height - margin
0041 NumberAnimation on y {
0042 id: appear
0043 easing.type: Easing.InCubic
0044 running: false
0045 from: root.height
0046 to: root.height - action.height - action.margin
0047 duration: 100
0048 }
0049 NumberAnimation on y {
0050 id: disappear
0051 easing.type: Easing.OutCubic
0052 running: false
0053 from: root.height - action.height - action.margin
0054 to: root.height
0055 duration: 100
0056 onFinished: action.visible = false
0057 }
0058 rightAction: Kirigami.Action {
0059 icon.name: "media-playlist-shuffle"
0060 onTriggered: playPlaylist(shuffleId)
0061 text: "Shuffle"
0062 }
0063 leftAction: Kirigami.Action {
0064 icon.name: "radio"
0065 onTriggered: playPlaylist(radioId)
0066 text: "Radio"
0067 }
0068
0069 }
0070
0071 ListView {
0072 id: songList
0073 footer: Item { height: 60 }
0074 header: ListHeader {
0075 visibleActions: [
0076 Kirigami.Action {
0077 text: i18n("Radio")
0078 icon.name: "radio"
0079 onTriggered: playPlaylist(radioId)
0080 visible: radioId
0081 },
0082 Kirigami.Action {
0083 text: i18n("Shuffle")
0084 icon.name: "media-playlist-shuffle"
0085 onTriggered: playPlaylist(shuffleId)
0086 visible: shuffleId
0087 }
0088 ]
0089 overflowActions: [
0090 Kirigami.Action {
0091 text: i18n("Open in Browser")
0092 icon.name: "internet-services"
0093 onTriggered: Qt.openUrlExternally(artistModel.webUrl)
0094 },
0095 Kirigami.Action {
0096 text: i18n("Share")
0097 icon.name: "emblem-shared-symbolic"
0098 onTriggered: {
0099 openShareMenu(artistModel.title, artistModel.webUrl)
0100 }
0101 }
0102 ]
0103 title: artistModel.title
0104 imageSourceURL: artistModel.thumbnailUrl
0105 subtitle: i18n("Artist")
0106 rounded: true
0107 width: songList.width
0108
0109 }
0110
0111 reuseItems: true
0112
0113 model: ArtistModel {
0114 id: artistModel
0115
0116 channelId: root.channelId
0117
0118 onOpenAlbum: (browseId) => {
0119 pageStack.push("qrc:/AlbumPage.qml", {
0120 "browseId": browseId
0121 })
0122 }
0123
0124 onOpenSong: (videoId) => {
0125 play(videoId)
0126 }
0127
0128 onOpenVideo: (videoId, title) => {
0129 videoPlayMessage.text = i18n("Video playback is not supported yet. Do you want to play only the audio of \"%1\"?", title)
0130 videoPlayMessage.visible = true
0131 videoPlayMessage.okAction = () => {
0132 play(videoId)
0133 videoPlayMessage.visible = false
0134 }
0135 videoPlayMessage.cancelAction = () => {
0136 videoPlayMessage.visible = false
0137 }
0138 }
0139 }
0140
0141 section.property: "type"
0142 section.delegate: Kirigami.ListSectionHeader {
0143 width: parent.width
0144
0145 text: {
0146 switch(parseInt(section)) {
0147 case ArtistModel.Album:
0148 return i18n("Albums")
0149 case ArtistModel.Single:
0150 return i18n("Singles")
0151 case ArtistModel.Song:
0152 return i18n("Songs")
0153 case ArtistModel.Video:
0154 return i18n("Videos")
0155 }
0156 }
0157 }
0158
0159 delegate: Controls.ItemDelegate {
0160 id: delegateItem
0161
0162 required property string title
0163 required property int type
0164 required property int index
0165 required property var artists
0166 required property string videoId
0167 required property string thumbnailUrl
0168
0169 width: parent.width
0170
0171 contentItem: MouseArea {
0172 implicitHeight: content.implicitHeight
0173 acceptedButtons: Qt.LeftButton | Qt.RightButton
0174 onClicked: (mouse) => {
0175 if (mouse.button === Qt.RightButton) {
0176 if (type === ArtistModel.Song) {
0177 menu.openForSong(delegateItem.videoId, delegateItem.title, delegateItem.artists, artistModel.title)
0178 }
0179 } else if (mouse.button === Qt.LeftButton) {
0180 artistModel.triggerItem(index)
0181 }
0182 }
0183 RowLayout {
0184 id: content
0185 anchors.fill: parent
0186 RoundedImage {
0187 source: delegateItem.thumbnailUrl
0188 height: 35
0189 width: height
0190 radius: 5
0191 }
0192
0193 Controls.Label {
0194 Layout.fillWidth: true
0195 text: delegateItem.title
0196 elide: Qt.ElideRight
0197 }
0198
0199 Controls.ToolButton {
0200 icon.name: "overflow-menu"
0201 text: i18n("More")
0202 display: Controls.AbstractButton.IconOnly
0203 visible: type === ArtistModel.Song
0204 onClicked: menu.openForSong(delegateItem.videoId, delegateItem.title, delegateItem.artists, artistModel.title)
0205 }
0206 }
0207 }
0208 }
0209
0210 Controls.BusyIndicator {
0211 anchors.centerIn: parent
0212 visible: artistModel.loading
0213 }
0214 }
0215
0216 footer: ConfirmationMessage {
0217 id: videoPlayMessage
0218 }
0219 }