Warning, /multimedia/audiotube/src/contents/ui/SearchPage.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 QtQuick.Layouts 1.3 0007 import QtQuick.Controls 2.14 as Controls 0008 import org.kde.kirigami 2.14 as Kirigami 0009 0010 import org.kde.ytmusic 1.0 0011 0012 Kirigami.ScrollablePage { 0013 id: searchPage 0014 property alias searchQuery: searchModel.searchQuery 0015 objectName: "searchPage" 0016 title: listView.count === 0 && !searchModel.loading? i18n("Previous Searches:") : searchQuery 0017 0018 ListView { 0019 reuseItems: true 0020 0021 section.delegate: Kirigami.ListSectionHeader { 0022 width: parent.width 0023 0024 required property string section 0025 text: { 0026 switch (parseInt(section)) { 0027 case SearchModel.Album: 0028 return i18n("Albums") 0029 case SearchModel.Artist: 0030 return i18n("Artists") 0031 case SearchModel.Playlist: 0032 return i18n("Playlists") 0033 case SearchModel.Song: 0034 return i18n("Songs") 0035 case SearchModel.Video: 0036 return i18n("Videos") 0037 case SearchModel.TopResult: 0038 return i18n("Top Results") 0039 } 0040 0041 return i18n("Unknown") 0042 } 0043 } 0044 section.property: "type" 0045 id: listView 0046 model: SearchModel { 0047 id: searchModel 0048 0049 onOpenAlbum: (browseId) => { 0050 pageStack.push("qrc:/AlbumPage.qml", { 0051 "browseId": browseId 0052 }) 0053 } 0054 0055 onOpenArtist: (channelId, radioId, shuffleId) => { 0056 pageStack.push("qrc:/ArtistPage.qml", { 0057 "channelId": channelId, 0058 "radioId": radioId, 0059 "shuffleId": shuffleId 0060 }) 0061 } 0062 0063 onOpenPlaylist: (browseId) => { 0064 pageStack.push("qrc:/PlaylistPage.qml", { 0065 "playlistId": browseId 0066 }) 0067 } 0068 0069 onOpenSong: (videoId) => { 0070 play(videoId) 0071 } 0072 0073 onOpenVideo: (videoId, title) => { 0074 videoPlayMessage.text = i18n("Video playback is not supported yet. Do you want to play only the audio of \"%1\"?", title) 0075 videoPlayMessage.visible = true 0076 videoPlayMessage.okAction = function() { 0077 play(videoId) 0078 videoPlayMessage.visible = false 0079 } 0080 videoPlayMessage.cancelAction = function() { 0081 videoPlayMessage.visible = false 0082 } 0083 } 0084 } 0085 0086 SongMenu { 0087 id: menu 0088 } 0089 0090 delegate: Controls.ItemDelegate { 0091 id: delegateItem 0092 0093 required property int index 0094 required property string title 0095 required property int type 0096 required property string videoId 0097 required property var artists 0098 required property string artistsDisplayString 0099 required property string radioPlaylistId 0100 required property string thumbnailUrl 0101 0102 width: parent.width 0103 0104 contentItem: MouseArea { 0105 implicitHeight: content.implicitHeight 0106 acceptedButtons: Qt.LeftButton | Qt.RightButton 0107 onClicked: (mouse) => { 0108 if (mouse.button === Qt.RightButton) { 0109 if (delegateItem.type === SearchModel.Song || delegateItem.type === SearchModel.Video) { 0110 menu.openForSong(delegateItem.videoId, delegateItem.title, delegateItem.artists, delegateItem.artistsDisplayString) 0111 } 0112 } else if (mouse.button === Qt.LeftButton) { 0113 searchModel.triggerItem(index) 0114 } 0115 } 0116 RowLayout { 0117 id: content 0118 anchors.fill: parent 0119 RoundedImage { 0120 source: delegateItem.thumbnailUrl 0121 height: 35 0122 width: height 0123 radius: delegateItem.type === SearchModel.Artist ? height / 2 : 5 0124 } 0125 0126 ColumnLayout { 0127 Layout.fillWidth: true 0128 0129 Controls.Label { 0130 Layout.fillWidth: true 0131 text: title 0132 elide: Qt.ElideRight 0133 } 0134 0135 Controls.Label { 0136 Layout.fillWidth: true 0137 visible: delegateItem.artistsDisplayString 0138 color: Kirigami.Theme.disabledTextColor 0139 text: delegateItem.artistsDisplayString 0140 elide: Qt.ElideRight 0141 0142 } 0143 } 0144 0145 Controls.ToolButton { 0146 icon.name: "overflow-menu" 0147 display: Controls.AbstractButton.IconOnly 0148 text: i18n("More") 0149 visible: delegateItem.type === SearchModel.Song || delegateItem.type === SearchModel.Video 0150 onClicked: menu.openForSong(delegateItem.videoId, delegateItem.title, delegateItem.artists, delegateItem.artistsDisplayString) 0151 } 0152 } 0153 } 0154 } 0155 0156 Controls.BusyIndicator { 0157 anchors.centerIn: parent 0158 visible: searchModel.loading 0159 } 0160 } 0161 0162 footer: ConfirmationMessage { 0163 id: videoPlayMessage 0164 } 0165 }