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 }