diff --git a/src/elisaapplication.cpp b/src/elisaapplication.cpp --- a/src/elisaapplication.cpp +++ b/src/elisaapplication.cpp @@ -379,6 +379,7 @@ d->mMediaPlayList.get(), static_cast &, ElisaUtils::PlayListEnqueueMode, ElisaUtils::PlayListEnqueueTriggerPlay)>(&MediaPlayList::enqueue)); + d->mMusicManager->subscribeForMetadata(d->mFileBrowserProxyModel.get()); #endif } diff --git a/src/models/filebrowserproxymodel.h b/src/models/filebrowserproxymodel.h --- a/src/models/filebrowserproxymodel.h +++ b/src/models/filebrowserproxymodel.h @@ -25,6 +25,7 @@ #include "musicaudiotrack.h" #include "filescanner.h" #include "elisautils.h" +#include "trackdatahelper.h" #include #include @@ -54,6 +55,10 @@ READ sortedAscending NOTIFY sortedAscendingChanged) + Q_PROPERTY(TrackDataHelper* scannedFile + READ scannedFile + NOTIFY scannedFileChanged) + public: explicit FileBrowserProxyModel(QObject *parent = nullptr); @@ -66,10 +71,12 @@ bool canGoBack() const; - Q_INVOKABLE MusicAudioTrack loadMetaDataFromUrl(const QUrl &url); + Q_INVOKABLE void loadMetaDataFromUrl(const QUrl &url); bool sortedAscending() const; + TrackDataHelper* scannedFile(); + public Q_SLOTS: void enqueueToPlayList(); @@ -86,6 +93,8 @@ void replaceAndPlayOfUrl(const QUrl &fileUrl); + void readScannedMetaData(const MusicAudioTrack &track); + Q_SIGNALS: void filesToEnqueue(QList newFiles, @@ -100,10 +109,14 @@ void sortedAscendingChanged(); + void scannedFileChanged(); + void replaceAndPlayFileByUrl(const QUrl &fileUrl); void loadPlayListFromUrl(const QUrl &playListUrl); + void scanFileForMetaData(const QUrl &fileUrl); + protected: bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; @@ -128,6 +141,8 @@ std::unique_ptr mFileModel; + TrackDataHelper mScannedFile; + }; #endif // FILEBROWSERPROXYMODEL_H diff --git a/src/models/filebrowserproxymodel.cpp b/src/models/filebrowserproxymodel.cpp --- a/src/models/filebrowserproxymodel.cpp +++ b/src/models/filebrowserproxymodel.cpp @@ -172,11 +172,22 @@ } } -MusicAudioTrack FileBrowserProxyModel::loadMetaDataFromUrl(const QUrl &url) +void FileBrowserProxyModel::loadMetaDataFromUrl(const QUrl &url) { - auto newTrack = mFileScanner.scanOneFile(url, mMimeDb); - qDebug() << "loaded metadata " << url << newTrack; - return newTrack; + qDebug() << "FileBrowserProxyModel::loadMetaDataFromUrl" << url; + mScannedFile.setTrackData(MusicAudioTrack()); + mScannedFile.setResourceURI(url); + Q_EMIT scannedFileChanged(); + Q_EMIT scanFileForMetaData(url); +} + +void FileBrowserProxyModel::readScannedMetaData(const MusicAudioTrack &track) +{ + qDebug() << "FileBrowserProxyModel::readScannedMetaData" << track; + if (track.resourceURI() == mScannedFile.trackData().resourceURI()) { + mScannedFile.setTrackData(track); + Q_EMIT scannedFileChanged(); + } } QString FileBrowserProxyModel::url() const @@ -189,6 +200,11 @@ return sortOrder() ? false : true; } +TrackDataHelper* FileBrowserProxyModel::scannedFile() +{ + return &mScannedFile; +} + void FileBrowserProxyModel::sortModel(Qt::SortOrder order) { this->sort(0,order); diff --git a/src/musiclistenersmanager.h b/src/musiclistenersmanager.h --- a/src/musiclistenersmanager.h +++ b/src/musiclistenersmanager.h @@ -39,6 +39,7 @@ class ElisaApplication; class QAbstractItemModel; class AbstractMediaProxyModel; +class FileBrowserProxyModel; class ELISALIB_EXPORT MusicListenersManager : public QObject { @@ -104,6 +105,8 @@ void subscribeForTracks(MediaPlayList *client); + void subscribeForMetadata(FileBrowserProxyModel *client); + int importedTracksCount() const; bool isIndexingRunning() const; diff --git a/src/musiclistenersmanager.cpp b/src/musiclistenersmanager.cpp --- a/src/musiclistenersmanager.cpp +++ b/src/musiclistenersmanager.cpp @@ -27,6 +27,10 @@ #include "baloo/baloolistener.h" #endif +#if defined KF5KIO_FOUND && KF5KIO_FOUND +#include "models/filebrowserproxymodel.h" +#endif + #include "databaseinterface.h" #include "mediaplaylist.h" #include "file/filelistener.h" @@ -221,6 +225,20 @@ connect(client, &MediaPlayList::newArtistInList, d->mTracksListener.get(), &TracksListener::newArtistInList); } +#if defined KF5KIO_FOUND && KF5KIO_FOUND +void MusicListenersManager::subscribeForMetadata(FileBrowserProxyModel *client) +{ + createTracksListener(); + connect(client, &FileBrowserProxyModel::scanFileForMetaData, d->mTracksListener.get(), &TracksListener::scanMetaDataOfFile); + connect(d->mTracksListener.get(), &TracksListener::scannedTrack, client, &FileBrowserProxyModel::readScannedMetaData); +} +#else +void MusicListenersManager::subscribeForMetadata(FileBrowserProxyModel *client) +{ + Q_UNUSED(client); +} +#endif + int MusicListenersManager::importedTracksCount() const { return d->mImportedTracksCount; diff --git a/src/qml/FileBrowserDelegate.qml b/src/qml/FileBrowserDelegate.qml --- a/src/qml/FileBrowserDelegate.qml +++ b/src/qml/FileBrowserDelegate.qml @@ -67,10 +67,10 @@ onTriggered: { if (metadataLoader.active === false) { metadataLoader.active = true - metadataLoader.item.trackDataHelper.trackData = contentModel.loadMetaDataFromUrl(fileUrl) + contentModel.loadMetaDataFromUrl(fileUrl) } else { - metadataLoader.item.close(); + metadataLoader.item.close() metadataLoader.active = false } } @@ -82,10 +82,7 @@ onLoaded: item.show() sourceComponent: MediaTrackMetadataView { - trackDataHelper: TrackDataHelper { - id: dataHelper - } - + trackDataHelper: contentModel.scannedFile onRejected: metadataLoader.active = false; } } diff --git a/src/trackslistener.h b/src/trackslistener.h --- a/src/trackslistener.h +++ b/src/trackslistener.h @@ -47,6 +47,8 @@ void albumAdded(const QList &tracks); + void scannedTrack(const MusicAudioTrack &audioTrack); + public Q_SLOTS: void tracksAdded(const QList &allTracks); @@ -63,6 +65,8 @@ void newArtistInList(const QString &artist); + void scanMetaDataOfFile(const QUrl &fileName); + private: MusicAudioTrack scanOneFile(const QUrl &scanFile); diff --git a/src/trackslistener.cpp b/src/trackslistener.cpp --- a/src/trackslistener.cpp +++ b/src/trackslistener.cpp @@ -166,6 +166,14 @@ } } +void TracksListener::scanMetaDataOfFile(const QUrl &fileName) +{ + auto newTrack = scanOneFile(fileName); + if (newTrack.isValid()) { + Q_EMIT scannedTrack(newTrack); + } +} + void TracksListener::trackByIdInList(qulonglong newTrackId) { d->mTracksByIdSet.insert(newTrackId);