Warning, /multimedia/elisa/src/qml/DataListView.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 SPDX-FileCopyrightText: 2022 (c) Nate Graham <nate@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-3.0-or-later 0006 */ 0007 0008 import QtQuick 2.15 0009 0010 import org.kde.kirigami 2.12 as Kirigami 0011 import org.kde.elisa 1.0 0012 0013 AbstractDataView { 0014 id: listView 0015 0016 property int databaseId 0017 property bool showSection: false 0018 property bool radioCase: false 0019 0020 // Otherwise tracks are sorted in the wrong order 0021 sortModel: !displaySingleAlbum 0022 0023 function openMetaDataView(databaseId, url, entryType) { 0024 metadataLoader.setSource(Kirigami.Settings.isMobile ? "mobile/MobileMediaTrackMetadataView.qml" : "MediaTrackMetadataView.qml", 0025 { 0026 fileName: url, 0027 modelType: entryType, 0028 showImage: entryType !== ElisaUtils.Radio, 0029 showTrackFileName: entryType !== ElisaUtils.Radio, 0030 showDeleteButton: entryType === ElisaUtils.Radio, 0031 editableMetadata: true, 0032 canAddMoreMetadata: entryType !== ElisaUtils.Radio, 0033 }); 0034 metadataLoader.active = true; 0035 } 0036 function openCreateRadioView() 0037 { 0038 metadataLoader.setSource(Kirigami.Settings.isMobile ? "mobile/MobileMediaTrackMetadataView.qml" : "MediaTrackMetadataView.qml", 0039 { 0040 modelType: ElisaUtils.Radio, 0041 isCreating: true, 0042 showImage: false, 0043 showTrackFileName: false, 0044 showDeleteButton: true, 0045 editableMetadata: true, 0046 canAddMoreMetadata: false, 0047 }); 0048 metadataLoader.active = true; 0049 } 0050 0051 Loader { 0052 id: metadataLoader 0053 active: false 0054 onLoaded: { 0055 // on mobile, the metadata loader is a page 0056 // on desktop, it's a window 0057 if (Kirigami.Settings.isMobile) { 0058 mainWindow.pageStack.layers.push(item); 0059 } else { 0060 item.show(); 0061 } 0062 } 0063 } 0064 0065 delegate: ListBrowserDelegate { 0066 id: entry 0067 0068 width: contentDirectoryView.width 0069 0070 focus: true 0071 0072 trackUrl: model.url 0073 dataType: model.dataType 0074 title: model.display ? model.display : "" 0075 artist: model.artist ? model.artist : "" 0076 album: model.album ? model.album : "" 0077 albumArtist: model.albumArtist ? model.albumArtist : "" 0078 duration: model.duration ? model.duration : "" 0079 imageUrl: model.imageUrl ? model.imageUrl : "" 0080 trackNumber: model.trackNumber ? model.trackNumber : -1 0081 discNumber: model.discNumber ? model.discNumber : -1 0082 rating: model.rating 0083 hideDiscNumber: !listView.displaySingleAlbum && model.isSingleDiscAlbum 0084 isSelected: contentDirectoryView.currentIndex === index 0085 isAlternateColor: (index % 2) === 1 0086 detailedView: !listView.displaySingleAlbum 0087 0088 onTrackRatingChanged: (url, rating) => { 0089 ElisaApplication.musicManager.updateSingleFileMetaData(url, DataTypes.RatingRole, rating) 0090 } 0091 0092 onEnqueue: ElisaApplication.mediaPlayListProxyModel.enqueue(model.fullData, model.display, 0093 ElisaUtils.AppendPlayList, 0094 ElisaUtils.DoNotTriggerPlay) 0095 0096 onClicked: { 0097 forceActiveFocus() 0098 contentDirectoryView.currentIndex = model.index 0099 } 0100 0101 onActiveFocusChanged: { 0102 if (activeFocus && contentDirectoryView.currentIndex !== model.index) { 0103 contentDirectoryView.currentIndex = model.index 0104 } 0105 } 0106 0107 onCallOpenMetaDataView: (url, entryType) => { 0108 openMetaDataView(databaseId, url, entryType) 0109 } 0110 0111 Connections { 0112 id: navigationBar 0113 // Escalate to our parent, so we can replace the current playlist with this view's tracks. 0114 function onReplaceAndPlay(url) { 0115 // If we're a radio type then only enqueue the current track 0116 if (dataType === ElisaUtils.Radio) { 0117 ElisaApplication.mediaPlayListProxyModel.enqueue(model.fullData, model.display, 0118 ElisaUtils.ReplacePlayList, 0119 ElisaUtils.TriggerPlay) 0120 } else { 0121 listView.contentModel.replaceAndPlayOfPlayListFromTrackUrl(contentDirectoryView.model.rootIndex, url) 0122 } 0123 } 0124 } 0125 } 0126 0127 0128 contentView: ListView { 0129 id: contentDirectoryView 0130 0131 activeFocusOnTab: true 0132 keyNavigationEnabled: true 0133 0134 reuseItems: true 0135 0136 model: delegateModel 0137 0138 // HACK: setting currentIndex to -1 in mobile for some reason causes segfaults, no idea why 0139 currentIndex: Kirigami.Settings.isMobile ? 0 : -1 0140 0141 Accessible.role: Accessible.List 0142 Accessible.name: mainTitle 0143 Accessible.description: secondaryTitle 0144 0145 section.property: showSection ? "discNumber" : "" 0146 section.criteria: ViewSection.FullString 0147 section.labelPositioning: ViewSection.InlineLabels 0148 section.delegate: TracksDiscHeader { 0149 discNumber: section 0150 width: contentDirectoryView.width 0151 } 0152 0153 onCountChanged: if (count === 0) { 0154 currentIndex = -1; 0155 } 0156 } 0157 0158 Connections { 0159 target: navigationBar // lives in parent item 0160 0161 function onCreateRadio() { 0162 listView.openCreateRadioView() 0163 } 0164 0165 function onShowArtist(name: string) { 0166 viewManager.openArtistView(name) 0167 } 0168 } 0169 }