File indexing completed on 2024-05-05 04:50:34
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 #include "trackmetadatamodel.h" 0008 0009 #include "musiclistenersmanager.h" 0010 0011 #include <KLocalizedString> 0012 0013 #include <QtConcurrentRun> 0014 0015 #include <algorithm> 0016 0017 #include <KFormat> 0018 0019 QList<DataTypes::ColumnsRoles> displayFields(const ElisaUtils::PlayListEntryType dataType) 0020 { 0021 switch (dataType) { 0022 case ElisaUtils::Track: 0023 return { 0024 DataTypes::TitleRole, DataTypes::ArtistRole, 0025 DataTypes::AlbumRole, DataTypes::AlbumArtistRole, 0026 DataTypes::TrackNumberRole, DataTypes::DiscNumberRole, 0027 DataTypes::RatingRole, DataTypes::GenreRole, 0028 DataTypes::LyricistRole, DataTypes::ComposerRole, 0029 DataTypes::CommentRole, DataTypes::YearRole, 0030 DataTypes::ChannelsRole, DataTypes::BitRateRole, 0031 DataTypes::SampleRateRole, DataTypes::LastPlayDate, 0032 DataTypes::PlayCounter, DataTypes::DurationRole, 0033 DataTypes::LyricsRole 0034 }; 0035 case ElisaUtils::Radio: 0036 return {DataTypes::TitleRole, DataTypes::ResourceRole, DataTypes::CommentRole, DataTypes::ImageUrlRole}; 0037 default: 0038 return {}; 0039 } 0040 } 0041 0042 TrackMetadataModel::TrackMetadataModel(QObject *parent) 0043 : QAbstractListModel(parent) 0044 { 0045 connect(&mLyricsValueWatcher, &QFutureWatcher<QString>::finished, 0046 this, &TrackMetadataModel::lyricsValueIsReady); 0047 } 0048 0049 TrackMetadataModel::~TrackMetadataModel() 0050 { 0051 if (mLyricsValueWatcher.isRunning() && !mLyricsValueWatcher.isFinished()) { 0052 mLyricsValueWatcher.waitForFinished(); 0053 } 0054 } 0055 0056 int TrackMetadataModel::rowCount(const QModelIndex &parent) const 0057 { 0058 if (parent.isValid()) { 0059 return 0; 0060 } 0061 0062 return mDisplayKeys.count(); 0063 } 0064 0065 QVariant TrackMetadataModel::data(const QModelIndex &index, int role) const 0066 { 0067 auto result = QVariant{}; 0068 0069 const auto currentKey = mDisplayKeys[index.row()]; 0070 0071 switch (role) 0072 { 0073 case Qt::DisplayRole: 0074 switch (currentKey) 0075 { 0076 case DataTypes::TrackNumberRole: 0077 { 0078 auto trackNumber = mDisplayData.trackNumber(); 0079 if (trackNumber > 0) { 0080 result = trackNumber; 0081 } 0082 break; 0083 } 0084 case DataTypes::DiscNumberRole: 0085 { 0086 auto discNumber = mDisplayData.discNumber(); 0087 if (discNumber > 0) { 0088 result = discNumber; 0089 } 0090 break; 0091 } 0092 case DataTypes::ChannelsRole: 0093 { 0094 auto channels = mDisplayData.channels(); 0095 if (channels > 0) { 0096 result = channels; 0097 } 0098 break; 0099 } 0100 case DataTypes::BitRateRole: 0101 { 0102 auto bitRate = mDisplayData.bitRate(); 0103 if (bitRate > 0) { 0104 result = KFormat().formatValue(bitRate, QStringLiteral("bit/s"), 0, 0105 KFormat::UnitPrefix::Kilo, KFormat::MetricBinaryDialect); 0106 } 0107 break; 0108 } 0109 case DataTypes::SampleRateRole: 0110 { 0111 auto sampleRate = mDisplayData.sampleRate(); 0112 if (sampleRate > 0) { 0113 result = KFormat().formatValue(sampleRate, KFormat::Unit::Hertz, 1, 0114 KFormat::UnitPrefix::Kilo, KFormat::MetricBinaryDialect); 0115 } 0116 break; 0117 } 0118 case DataTypes::DurationRole: 0119 { 0120 auto trackDuration = mDisplayData.duration(); 0121 if (trackDuration.hour() == 0) { 0122 result = trackDuration.toString(QStringLiteral("mm:ss")); 0123 } else { 0124 result = trackDuration.toString(); 0125 } 0126 break; 0127 } 0128 default: 0129 result = mDisplayData[currentKey]; 0130 break; 0131 } 0132 break; 0133 case ItemNameRole: 0134 result = nameFromRole(currentKey); 0135 break; 0136 case ItemTypeRole: 0137 switch (currentKey) 0138 { 0139 case DataTypes::TitleRole: 0140 result = TextEntry; 0141 break; 0142 case DataTypes::ResourceRole: 0143 case DataTypes::ImageUrlRole: 0144 result = UrlEntry; 0145 break; 0146 case DataTypes::ArtistRole: 0147 result = TextEntry; 0148 break; 0149 case DataTypes::AlbumRole: 0150 result = TextEntry; 0151 break; 0152 case DataTypes::AlbumArtistRole: 0153 result = TextEntry; 0154 break; 0155 case DataTypes::TrackNumberRole: 0156 result = IntegerEntry; 0157 break; 0158 case DataTypes::DiscNumberRole: 0159 result = IntegerEntry; 0160 break; 0161 case DataTypes::RatingRole: 0162 result = RatingEntry; 0163 break; 0164 case DataTypes::GenreRole: 0165 result = TextEntry; 0166 break; 0167 case DataTypes::LyricistRole: 0168 result = TextEntry; 0169 break; 0170 case DataTypes::ComposerRole: 0171 result = TextEntry; 0172 break; 0173 case DataTypes::CommentRole: 0174 result = TextEntry; 0175 break; 0176 case DataTypes::YearRole: 0177 result = IntegerEntry; 0178 break; 0179 case DataTypes::LastPlayDate: 0180 result = DateEntry; 0181 break; 0182 case DataTypes::PlayCounter: 0183 result = IntegerEntry; 0184 break; 0185 case DataTypes::LyricsRole: 0186 result = LongTextEntry; 0187 break; 0188 case DataTypes::SampleRateRole: 0189 result = IntegerEntry; 0190 break; 0191 case DataTypes::BitRateRole: 0192 result = IntegerEntry; 0193 break; 0194 case DataTypes::ChannelsRole: 0195 result = IntegerEntry; 0196 break; 0197 case DataTypes::FirstPlayDate: 0198 result = DateEntry; 0199 break; 0200 case DataTypes::DurationRole: 0201 result = DurationEntry; 0202 break; 0203 case DataTypes::SecondaryTextRole: 0204 case DataTypes::ShadowForImageRole: 0205 case DataTypes::ChildModelRole: 0206 case DataTypes::StringDurationRole: 0207 case DataTypes::IsValidAlbumArtistRole: 0208 case DataTypes::AllArtistsRole: 0209 case DataTypes::HighestTrackRating: 0210 case DataTypes::IdRole: 0211 case DataTypes::ParentIdRole: 0212 case DataTypes::DatabaseIdRole: 0213 case DataTypes::IsSingleDiscAlbumRole: 0214 case DataTypes::ContainerDataRole: 0215 case DataTypes::IsPartialDataRole: 0216 case DataTypes::AlbumIdRole: 0217 case DataTypes::HasEmbeddedCover: 0218 case DataTypes::FileModificationTime: 0219 case DataTypes::ElementTypeRole: 0220 case DataTypes::FullDataRole: 0221 case DataTypes::IsDirectoryRole: 0222 case DataTypes::IsPlayListRole: 0223 case DataTypes::FilePathRole: 0224 case DataTypes::HasChildrenRole: 0225 case DataTypes::MultipleImageUrlsRole: 0226 break; 0227 } 0228 break; 0229 } 0230 0231 return result; 0232 } 0233 0234 bool TrackMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role) 0235 { 0236 if (data(index, role) != value) { 0237 auto dataType = mDisplayKeys[index.row()]; 0238 0239 mDisplayData[dataType] = value; 0240 0241 Q_EMIT dataChanged(index, index, QVector<int>() << role); 0242 return true; 0243 } 0244 return false; 0245 } 0246 0247 void TrackMetadataModel::saveChanges() 0248 { 0249 mFullData.insert(mDisplayData); 0250 } 0251 0252 void TrackMetadataModel::undoChanges() 0253 { 0254 resetDisplayData(); 0255 } 0256 0257 QHash<int, QByteArray> TrackMetadataModel::roleNames() const 0258 { 0259 auto names = QAbstractListModel::roleNames(); 0260 0261 names[ItemNameRole] = "name"; 0262 names[ItemTypeRole] = "type"; 0263 0264 return names; 0265 } 0266 0267 QString TrackMetadataModel::fileUrl() const 0268 { 0269 if (mFileUrl.isLocalFile()) { 0270 return mFileUrl.toLocalFile(); 0271 } else { 0272 return mFileUrl.toString(); 0273 } 0274 } 0275 0276 QUrl TrackMetadataModel::coverUrl() const 0277 { 0278 if (mCoverImage.isEmpty()) { 0279 return QUrl(QStringLiteral("image://icon/media-default-album")); 0280 } else { 0281 return mCoverImage; 0282 } 0283 } 0284 0285 MusicListenersManager *TrackMetadataModel::manager() const 0286 { 0287 return mManager; 0288 } 0289 0290 QString TrackMetadataModel::lyrics() const 0291 { 0292 return mFullData[TrackDataType::key_type::LyricsRole].toString(); 0293 } 0294 0295 qulonglong TrackMetadataModel::databaseId() const 0296 { 0297 return mDatabaseId; 0298 } 0299 0300 void TrackMetadataModel::trackData(const TrackMetadataModel::TrackDataType &trackData) 0301 { 0302 if (!mFileUrl.isEmpty() && trackData.resourceURI() != mFileUrl) { 0303 return; 0304 } 0305 0306 fillDataFromTrackData(trackData); 0307 } 0308 0309 void TrackMetadataModel::fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData) 0310 { 0311 mFullData = trackData; 0312 resetDisplayData(); 0313 0314 if (trackData.hasDatabaseId()) { 0315 fetchLyrics(); 0316 } else { 0317 Q_EMIT lyricsChanged(); 0318 } 0319 0320 mDatabaseId = trackData[DataTypes::DatabaseIdRole].toULongLong(); 0321 Q_EMIT databaseIdChanged(); 0322 0323 mCoverImage = trackData[DataTypes::ImageUrlRole].toUrl(); 0324 Q_EMIT coverUrlChanged(); 0325 0326 auto rawFileUrl = trackData[DataTypes::ResourceRole].toUrl(); 0327 0328 mFileUrl = rawFileUrl; 0329 Q_EMIT fileUrlChanged(); 0330 } 0331 0332 void TrackMetadataModel::resetDisplayData() 0333 { 0334 const auto fieldsForTrack = displayFields(mFullData.elementType()); 0335 beginResetModel(); 0336 mDisplayData.clear(); 0337 mDisplayKeys.clear(); 0338 0339 for (DataTypes::ColumnsRoles role : fieldsForTrack) { 0340 if (mFullData.constFind(role) != mFullData.constEnd()) { 0341 mDisplayKeys.push_back(role); 0342 mDisplayData[role] = mFullData[role]; 0343 } 0344 } 0345 filterDataFromTrackData(); 0346 endResetModel(); 0347 } 0348 0349 void TrackMetadataModel::filterDataFromTrackData() 0350 { 0351 } 0352 0353 void TrackMetadataModel::removeMetaData(DataTypes::ColumnsRoles metaData) 0354 { 0355 auto itMetaData = std::find(mDisplayKeys.cbegin(), mDisplayKeys.cend(), metaData); 0356 if (itMetaData == mDisplayKeys.cend()) { 0357 return; 0358 } 0359 0360 mDisplayKeys.erase(itMetaData); 0361 mDisplayData.remove(metaData); 0362 } 0363 0364 TrackMetadataModel::TrackDataType::mapped_type TrackMetadataModel::dataFromType(TrackDataType::key_type metaData) const 0365 { 0366 return mFullData[metaData]; 0367 } 0368 0369 void TrackMetadataModel::fillLyricsDataFromTrack() 0370 { 0371 beginInsertRows({}, mDisplayData.size(), mDisplayData.size()); 0372 mDisplayKeys.push_back(DataTypes::LyricsRole); 0373 mDisplayData[DataTypes::LyricsRole] = mLyricsValueWatcher.result(); 0374 endInsertRows(); 0375 } 0376 0377 const TrackMetadataModel::TrackDataType &TrackMetadataModel::allTrackData() const 0378 { 0379 return mFullData; 0380 } 0381 0382 void TrackMetadataModel::lyricsValueIsReady() 0383 { 0384 if (!mLyricsValueWatcher.result().isEmpty()) { 0385 fillLyricsDataFromTrack(); 0386 0387 mFullData[DataTypes::LyricsRole] = mLyricsValueWatcher.result(); 0388 0389 Q_EMIT lyricsChanged(); 0390 } 0391 } 0392 0393 void TrackMetadataModel::initializeByIdAndUrl(ElisaUtils::PlayListEntryType type, qulonglong databaseId, const QUrl &url) 0394 { 0395 if (!mFullData.isEmpty()) { 0396 beginResetModel(); 0397 mFullData.clear(); 0398 mDisplayData.clear(); 0399 mCoverImage.clear(); 0400 mFileUrl.clear(); 0401 endResetModel(); 0402 0403 Q_EMIT lyricsChanged(); 0404 } 0405 0406 mFileUrl = url; 0407 mDatabaseId = databaseId; 0408 0409 Q_EMIT needDataByDatabaseIdAndUrl(type, databaseId, url); 0410 } 0411 0412 void TrackMetadataModel::initialize(MusicListenersManager *newManager, DatabaseInterface *trackDatabase) 0413 { 0414 mManager = newManager; 0415 Q_EMIT managerChanged(); 0416 0417 if (mManager) { 0418 mDataLoader.setDatabase(mManager->viewDatabase()); 0419 } else if (trackDatabase) { 0420 mDataLoader.setDatabase(trackDatabase); 0421 } 0422 0423 if (mManager) { 0424 mManager->connectModel(&mDataLoader); 0425 } 0426 0427 connect(this, &TrackMetadataModel::needDataByDatabaseIdAndUrl, 0428 &mDataLoader, &ModelDataLoader::loadDataByDatabaseIdAndUrl); 0429 connect(this, &TrackMetadataModel::needDataByUrl, 0430 &mDataLoader, &ModelDataLoader::loadDataByUrl); 0431 connect(&mDataLoader, &ModelDataLoader::trackModified, 0432 this, &TrackMetadataModel::trackData); 0433 connect(&mDataLoader, &ModelDataLoader::allTrackData, 0434 this, &TrackMetadataModel::trackData); 0435 connect(&mDataLoader, &ModelDataLoader::allRadioData, 0436 this, &TrackMetadataModel::radioData); 0437 connect(&mDataLoader, &ModelDataLoader::radioAdded, 0438 this, &TrackMetadataModel::radioData); 0439 connect(&mDataLoader, &ModelDataLoader::radioModified, 0440 this, &TrackMetadataModel::radioData); 0441 } 0442 0443 ModelDataLoader &TrackMetadataModel::modelDataLoader() 0444 { 0445 return mDataLoader; 0446 } 0447 0448 const TrackMetadataModel::TrackDataType &TrackMetadataModel::displayedTrackData() const 0449 { 0450 return mDisplayData; 0451 } 0452 0453 DataTypes::ColumnsRoles TrackMetadataModel::trackKey(int index) const 0454 { 0455 return mDisplayKeys[index]; 0456 } 0457 0458 void TrackMetadataModel::removeDataByIndex(int index) 0459 { 0460 auto dataKey = mDisplayKeys[index]; 0461 0462 mDisplayData[dataKey] = {}; 0463 mDisplayKeys.removeAt(index); 0464 } 0465 0466 void TrackMetadataModel::addDataByName(const QString &name) 0467 { 0468 DataTypes::ColumnsRoles newRole = DataTypes::TitleRole; 0469 0470 if (name == i18nc("@label:textbox Track title for track metadata view", "Title")) { 0471 newRole = DataTypes::TitleRole; 0472 } else if (name == i18nc("@label:textbox Track artist for track metadata view", "Artist")) { 0473 newRole = DataTypes::ArtistRole; 0474 } else if (name == i18nc("@label:textbox Album name for track metadata view", "Album")) { 0475 newRole = DataTypes::AlbumRole; 0476 } else if (name == i18nc("@label:textbox Album artist for track metadata view", "Album Artist")) { 0477 newRole = DataTypes::AlbumArtistRole; 0478 } else if (name == i18nc("@label:textbox Track number for track metadata view", "Track Number")) { 0479 newRole = DataTypes::TrackNumberRole; 0480 } else if (name == i18nc("@label:textbox Disc number for track metadata view", "Disc Number")) { 0481 newRole = DataTypes::DiscNumberRole; 0482 } else if (name == i18nc("@label:textbox Rating label for information panel", "Rating")) { 0483 newRole = DataTypes::RatingRole; 0484 } else if (name == i18nc("@label:textbox Genre label for track metadata view", "Genre")) { 0485 newRole = DataTypes::GenreRole; 0486 } else if (name == i18nc("@label:textbox Lyricist label for track metadata view", "Lyricist")) { 0487 newRole = DataTypes::LyricistRole; 0488 } else if (name == i18nc("@label:textbox Composer name for track metadata view", "Composer")) { 0489 newRole = DataTypes::ComposerRole; 0490 } else if (name == i18nc("@label:textbox Comment label for track metadata view", "Comment")) { 0491 newRole = DataTypes::CommentRole; 0492 } else if (name == i18nc("@label:textbox Year label for track metadata view", "Year")) { 0493 newRole = DataTypes::YearRole; 0494 } else if (name == i18nc("@label:textbox Channels label for track metadata view", "Channels")) { 0495 newRole = DataTypes::ChannelsRole; 0496 } else if (name == i18nc("@label:textbox Bit rate label for track metadata view", "Bit Rate")) { 0497 newRole = DataTypes::BitRateRole; 0498 } else if (name == i18nc("@label:textbox Sample Rate label for track metadata view", "Sample Rate")) { 0499 newRole = DataTypes::SampleRateRole; 0500 } else if (name == i18nc("@label:textbox Lyrics label for track metadata view", "Lyrics")) { 0501 newRole = DataTypes::LyricsRole; 0502 } else if (name == i18nc("@label:textbox Duration label for track metadata view", "Duration")) { 0503 newRole = DataTypes::DurationRole; 0504 } 0505 0506 mDisplayData[newRole] = {}; 0507 mDisplayKeys.push_back(newRole); 0508 } 0509 0510 QString TrackMetadataModel::nameFromRole(DataTypes::ColumnsRoles role) 0511 { 0512 auto result = QString{}; 0513 switch (role) 0514 { 0515 case DataTypes::TitleRole: 0516 result = i18nc("@label:textbox Track title for track metadata view", "Title"); 0517 break; 0518 case DataTypes::DurationRole: 0519 result = i18nc("@label:textbox Duration label for track metadata view", "Duration"); 0520 break; 0521 case DataTypes::ArtistRole: 0522 result = i18nc("@label:textbox Track artist for track metadata view", "Artist"); 0523 break; 0524 case DataTypes::AlbumRole: 0525 result = i18nc("@label:textbox Album name for track metadata view", "Album"); 0526 break; 0527 case DataTypes::AlbumArtistRole: 0528 result = i18nc("@label:textbox Album artist for track metadata view", "Album Artist"); 0529 break; 0530 case DataTypes::TrackNumberRole: 0531 result = i18nc("@label:textbox Track number for track metadata view", "Track Number"); 0532 break; 0533 case DataTypes::DiscNumberRole: 0534 result = i18nc("@label:textbox Disc number for track metadata view", "Disc Number"); 0535 break; 0536 case DataTypes::RatingRole: 0537 result = i18nc("@label:textbox Rating label for information panel", "Rating"); 0538 break; 0539 case DataTypes::GenreRole: 0540 result = i18nc("@label:textbox Genre label for track metadata view", "Genre"); 0541 break; 0542 case DataTypes::LyricistRole: 0543 result = i18nc("@label:textbox Lyricist label for track metadata view", "Lyricist"); 0544 break; 0545 case DataTypes::ComposerRole: 0546 result = i18nc("@label:textbox Composer name for track metadata view", "Composer"); 0547 break; 0548 case DataTypes::CommentRole: 0549 result = i18nc("@label:textbox Comment label for track metadata view", "Comment"); 0550 break; 0551 case DataTypes::YearRole: 0552 result = i18nc("@label:textbox Year label for track metadata view", "Year"); 0553 break; 0554 case DataTypes::ChannelsRole: 0555 result = i18nc("@label:textbox Channels label for track metadata view", "Channels"); 0556 break; 0557 case DataTypes::BitRateRole: 0558 result = i18nc("@label:textbox Bit rate label for track metadata view", "Bit Rate"); 0559 break; 0560 case DataTypes::SampleRateRole: 0561 result = i18nc("@label:textbox Sample Rate label for track metadata view", "Sample Rate"); 0562 break; 0563 case DataTypes::LastPlayDate: 0564 result = i18nc("@label:textbox Last play date label for track metadata view", "Last played"); 0565 break; 0566 case DataTypes::FirstPlayDate: 0567 result = i18nc("@label:textbox First play date label for track metadata view", "First played"); 0568 break; 0569 case DataTypes::PlayCounter: 0570 result = i18nc("@label:textbox Play counter label for track metadata view", "Play count"); 0571 break; 0572 case DataTypes::LyricsRole: 0573 result = i18nc("@label:textbox Lyrics label for track metadata view", "Lyrics"); 0574 break; 0575 case DataTypes::ResourceRole: 0576 result = i18nc("@label:textbox Radio HTTP address for radio metadata view", "Stream Http Address"); 0577 break; 0578 case DataTypes::ImageUrlRole: 0579 result = i18nc("@label:textbox Image address for radio metadata view", "Image Address"); 0580 break; 0581 case DataTypes::SecondaryTextRole: 0582 case DataTypes::ShadowForImageRole: 0583 case DataTypes::ChildModelRole: 0584 case DataTypes::StringDurationRole: 0585 case DataTypes::IsValidAlbumArtistRole: 0586 case DataTypes::AllArtistsRole: 0587 case DataTypes::HighestTrackRating: 0588 case DataTypes::IdRole: 0589 case DataTypes::ParentIdRole: 0590 case DataTypes::DatabaseIdRole: 0591 case DataTypes::IsSingleDiscAlbumRole: 0592 case DataTypes::ContainerDataRole: 0593 case DataTypes::IsPartialDataRole: 0594 case DataTypes::AlbumIdRole: 0595 case DataTypes::HasEmbeddedCover: 0596 case DataTypes::FileModificationTime: 0597 case DataTypes::ElementTypeRole: 0598 case DataTypes::FullDataRole: 0599 case DataTypes::IsDirectoryRole: 0600 case DataTypes::IsPlayListRole: 0601 case DataTypes::FilePathRole: 0602 case DataTypes::HasChildrenRole: 0603 case DataTypes::MultipleImageUrlsRole: 0604 break; 0605 } 0606 return result; 0607 } 0608 0609 bool TrackMetadataModel::metadataExists(DataTypes::ColumnsRoles metadataRole) const 0610 { 0611 return std::find(mDisplayKeys.begin(), mDisplayKeys.end(), metadataRole) != mDisplayKeys.end(); 0612 } 0613 0614 void TrackMetadataModel::fetchLyrics() 0615 { 0616 auto fileUrl = mFullData[DataTypes::ResourceRole].toUrl(); 0617 auto lyricicsValue = QtConcurrent::run(QThreadPool::globalInstance(), [fileUrl, this]() { 0618 auto locker = QMutexLocker(&mFileScannerMutex); 0619 auto trackData = mFileScanner.scanOneFile(fileUrl); 0620 if (!trackData.lyrics().isEmpty()) { 0621 return trackData.lyrics(); 0622 } 0623 return QString{}; 0624 }); 0625 0626 mLyricsValueWatcher.setFuture(lyricicsValue); 0627 } 0628 0629 void TrackMetadataModel::initializeForNewRadio() 0630 { 0631 mFullData.clear(); 0632 mDisplayData.clear(); 0633 0634 fillDataForNewRadio(); 0635 } 0636 0637 void TrackMetadataModel::fillDataForNewRadio() 0638 { 0639 beginResetModel(); 0640 mFullData.clear(); 0641 mDisplayData.clear(); 0642 mDisplayKeys.clear(); 0643 0644 auto allRoles = {DataTypes::TitleRole, DataTypes::ResourceRole, 0645 DataTypes::CommentRole, DataTypes::ImageUrlRole}; 0646 0647 for (auto role : allRoles) { 0648 mDisplayKeys.push_back(role); 0649 if (role == DataTypes::DatabaseIdRole) { 0650 mFullData[role] = -1; 0651 } else { 0652 mFullData[role] = QString(); 0653 } 0654 } 0655 mDisplayData = mFullData; 0656 mFullData[DataTypes::ElementTypeRole] = ElisaUtils::Radio; 0657 filterDataFromTrackData(); 0658 endResetModel(); 0659 } 0660 0661 void TrackMetadataModel::initializeByUrl(ElisaUtils::PlayListEntryType type, const QUrl &url) 0662 { 0663 mFullData.clear(); 0664 mDisplayData.clear(); 0665 mCoverImage.clear(); 0666 mFileUrl.clear(); 0667 0668 Q_EMIT lyricsChanged(); 0669 0670 mFileUrl = url; 0671 0672 Q_EMIT needDataByUrl(type, url); 0673 } 0674 0675 void TrackMetadataModel::setManager(MusicListenersManager *newManager) 0676 { 0677 initialize(newManager, nullptr); 0678 } 0679 0680 void TrackMetadataModel::setDatabase(DatabaseInterface *trackDatabase) 0681 { 0682 initialize(nullptr, trackDatabase); 0683 } 0684 0685 void TrackMetadataModel::radioData(const TrackDataType &radiosData) 0686 { 0687 if (!mFullData.isEmpty() && mFullData[DataTypes::DatabaseIdRole].toInt() != -1 && 0688 mFullData.databaseId() != radiosData.databaseId()) { 0689 return; 0690 } 0691 0692 fillDataFromTrackData(radiosData); 0693 } 0694 0695 #include "moc_trackmetadatamodel.cpp"