File indexing completed on 2024-04-28 04:49:03
0001 /* 0002 SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #ifndef TRACKMETADATAMODEL_H 0008 #define TRACKMETADATAMODEL_H 0009 0010 #include "elisaLib_export.h" 0011 0012 #include "elisautils.h" 0013 #include "trackslistener.h" 0014 #include "datatypes.h" 0015 #include "modeldataloader.h" 0016 #include "filescanner.h" 0017 0018 #include <QUrl> 0019 #include <QAbstractListModel> 0020 #include <QFutureWatcher> 0021 #include <QMutex> 0022 0023 class MusicListenersManager; 0024 0025 class ELISALIB_EXPORT TrackMetadataModel : public QAbstractListModel 0026 { 0027 Q_OBJECT 0028 0029 Q_PROPERTY(QUrl coverUrl 0030 READ coverUrl 0031 NOTIFY coverUrlChanged) 0032 0033 Q_PROPERTY(QString fileUrl 0034 READ fileUrl 0035 NOTIFY fileUrlChanged) 0036 0037 Q_PROPERTY(qulonglong databaseId 0038 READ databaseId 0039 NOTIFY databaseIdChanged) 0040 0041 Q_PROPERTY(MusicListenersManager* manager 0042 READ manager 0043 WRITE setManager 0044 NOTIFY managerChanged) 0045 0046 Q_PROPERTY(QString lyrics 0047 READ lyrics 0048 NOTIFY lyricsChanged) 0049 0050 public: 0051 0052 enum ColumnRoles 0053 { 0054 ItemNameRole = Qt::UserRole + 1, 0055 ItemTypeRole, 0056 }; 0057 0058 Q_ENUM(ColumnRoles) 0059 0060 enum ItemType 0061 { 0062 TextEntry, 0063 UrlEntry, 0064 IntegerEntry, 0065 RatingEntry, 0066 DateEntry, 0067 DurationEntry, 0068 LongTextEntry, 0069 }; 0070 0071 Q_ENUM(ItemType) 0072 0073 using TrackDataType = DataTypes::TrackDataType; 0074 0075 explicit TrackMetadataModel(QObject *parent = nullptr); 0076 0077 ~TrackMetadataModel() override; 0078 0079 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0080 0081 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0082 0083 bool setData(const QModelIndex &index, const QVariant &value, 0084 int role = Qt::EditRole) override; 0085 0086 QHash<int, QByteArray> roleNames() const override; 0087 0088 QUrl coverUrl() const; 0089 0090 QString fileUrl() const; 0091 0092 MusicListenersManager* manager() const; 0093 0094 QString lyrics() const; 0095 0096 qulonglong databaseId() const; 0097 0098 Q_SIGNALS: 0099 0100 void needDataByDatabaseIdAndUrl(ElisaUtils::PlayListEntryType dataType, qulonglong databaseId, const QUrl &url); 0101 0102 void needDataByUrl(ElisaUtils::PlayListEntryType dataType, const QUrl &fileName); 0103 0104 void coverUrlChanged(); 0105 0106 void fileUrlChanged(); 0107 0108 void managerChanged(); 0109 0110 void lyricsChanged(); 0111 0112 void databaseIdChanged(); 0113 0114 public Q_SLOTS: 0115 0116 void trackData(const TrackMetadataModel::TrackDataType &trackData); 0117 0118 void initializeByIdAndUrl(ElisaUtils::PlayListEntryType type, qulonglong databaseId, const QUrl &url); 0119 0120 void initializeByUrl(ElisaUtils::PlayListEntryType type, const QUrl &url); 0121 0122 void initializeForNewRadio(); 0123 0124 void setManager(MusicListenersManager *newManager); 0125 0126 void setDatabase(DatabaseInterface *trackDatabase); 0127 0128 void radioData(const TrackMetadataModel::TrackDataType &radiosData); 0129 0130 protected: 0131 0132 void saveChanges(); 0133 0134 void undoChanges(); 0135 0136 virtual void fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData); 0137 0138 virtual void fillDataForNewRadio(); 0139 0140 virtual void filterDataFromTrackData(); 0141 0142 void removeMetaData(DataTypes::ColumnsRoles metaData); 0143 0144 TrackDataType::mapped_type dataFromType(TrackDataType::key_type metaData) const; 0145 0146 virtual void fillLyricsDataFromTrack(); 0147 0148 const TrackDataType& allTrackData() const; 0149 0150 virtual void initialize(MusicListenersManager *newManager, 0151 DatabaseInterface *trackDatabase); 0152 0153 ModelDataLoader& modelDataLoader(); 0154 0155 const TrackDataType& displayedTrackData() const; 0156 0157 DataTypes::ColumnsRoles trackKey(int index) const; 0158 0159 void removeDataByIndex(int index); 0160 0161 void addDataByName(const QString &name); 0162 0163 static QString nameFromRole(DataTypes::ColumnsRoles role); 0164 0165 bool metadataExists(DataTypes::ColumnsRoles metadataRole) const; 0166 0167 private Q_SLOTS: 0168 0169 void lyricsValueIsReady(); 0170 0171 private: 0172 0173 void fetchLyrics(); 0174 0175 void resetDisplayData(); 0176 0177 TrackDataType mFullData; 0178 0179 TrackDataType mDisplayData; 0180 0181 QUrl mCoverImage; 0182 0183 QUrl mFileUrl; 0184 0185 qulonglong mDatabaseId = 0; 0186 0187 QList<TrackDataType::key_type> mDisplayKeys; 0188 0189 ModelDataLoader mDataLoader; 0190 0191 MusicListenersManager *mManager = nullptr; 0192 0193 FileScanner mFileScanner; 0194 0195 QMutex mFileScannerMutex; 0196 0197 QFutureWatcher<QString> mLyricsValueWatcher; 0198 }; 0199 0200 #endif // TRACKMETADATAMODEL_H