Changeset View
Standalone View
src/models/trackmetadatamodel.cpp
Show All 17 Lines | |||||
18 | #include "trackmetadatamodel.h" | 18 | #include "trackmetadatamodel.h" | ||
19 | 19 | | |||
20 | #include "musiclistenersmanager.h" | 20 | #include "musiclistenersmanager.h" | ||
21 | 21 | | |||
22 | #include <KI18n/KLocalizedString> | 22 | #include <KI18n/KLocalizedString> | ||
23 | 23 | | |||
24 | #include <QtConcurrent> | 24 | #include <QtConcurrent> | ||
25 | 25 | | |||
26 | const QList<DatabaseInterface::ColumnsRoles> mFieldsForClassicTrack({DatabaseInterface::TitleRole, DatabaseInterface::ArtistRole, DatabaseInterface::AlbumRole, | ||||
27 | DatabaseInterface::AlbumArtistRole, DatabaseInterface::TrackNumberRole, DatabaseInterface::DiscNumberRole, | ||||
28 | DatabaseInterface::RatingRole, DatabaseInterface::GenreRole, DatabaseInterface::LyricistRole, | ||||
29 | DatabaseInterface::ComposerRole, DatabaseInterface::CommentRole, DatabaseInterface::YearRole, | ||||
30 | DatabaseInterface::LastPlayDate, DatabaseInterface::PlayCounter}); | ||||
31 | | ||||
32 | const QList mFieldsForRadioTrack({DatabaseInterface::TitleRole,DatabaseInterface::ResourceRole, DatabaseInterface::CommentRole, DatabaseInterface::DatabaseIdRole, | ||||
33 | DatabaseInterface::ArtistRole, DatabaseInterface::AlbumRole}); | ||||
34 | | ||||
35 | | ||||
26 | TrackMetadataModel::TrackMetadataModel(QObject *parent) | 36 | TrackMetadataModel::TrackMetadataModel(QObject *parent) | ||
27 | : QAbstractListModel(parent) | 37 | : QAbstractListModel(parent) | ||
28 | { | 38 | { | ||
29 | connect(&mLyricsValueWatcher, &QFutureWatcher<QString>::finished, | 39 | connect(&mLyricsValueWatcher, &QFutureWatcher<QString>::finished, | ||
30 | this, &TrackMetadataModel::lyricsValueIsReady); | 40 | this, &TrackMetadataModel::lyricsValueIsReady); | ||
31 | } | 41 | } | ||
32 | 42 | | |||
33 | TrackMetadataModel::~TrackMetadataModel() | 43 | TrackMetadataModel::~TrackMetadataModel() | ||
34 | { | 44 | { | ||
35 | if (mLyricsValueWatcher.isRunning() && !mLyricsValueWatcher.isFinished()) { | 45 | if (mLyricsValueWatcher.isRunning() && !mLyricsValueWatcher.isFinished()) { | ||
36 | mLyricsValueWatcher.waitForFinished(); | 46 | mLyricsValueWatcher.waitForFinished(); | ||
37 | } | 47 | } | ||
38 | } | 48 | } | ||
39 | 49 | | |||
40 | int TrackMetadataModel::rowCount(const QModelIndex &parent) const | 50 | int TrackMetadataModel::rowCount(const QModelIndex &parent) const | ||
41 | { | 51 | { | ||
42 | if (parent.isValid()) { | 52 | if (parent.isValid()) { | ||
43 | return 0; | 53 | return 0; | ||
44 | } | 54 | } | ||
45 | 55 | | |||
46 | return mTrackData.count(); | 56 | return mTrackData.count(); | ||
47 | } | 57 | } | ||
48 | 58 | | |||
49 | QVariant TrackMetadataModel::data(const QModelIndex &index, int role) const | 59 | QVariant TrackMetadataModel::dataGeneral(const QModelIndex &index, int role) const | ||
50 | { | 60 | { | ||
51 | auto result = QVariant{}; | 61 | auto result = QVariant{}; | ||
52 | 62 | | |||
53 | const auto currentKey = mTrackKeys[index.row()]; | 63 | const auto currentKey = mTrackKeys[index.row()]; | ||
54 | 64 | | |||
55 | switch (role) | 65 | switch (role) | ||
56 | { | 66 | { | ||
57 | case Qt::DisplayRole: | 67 | case Qt::DisplayRole: | ||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Line(s) | 166 | case DatabaseInterface::LastPlayDate: | |||
157 | result = i18nc("Last play date label for track metadata view", "Last played"); | 167 | result = i18nc("Last play date label for track metadata view", "Last played"); | ||
158 | break; | 168 | break; | ||
159 | case DatabaseInterface::PlayCounter: | 169 | case DatabaseInterface::PlayCounter: | ||
160 | result = i18nc("Play counter label for track metadata view", "Play count"); | 170 | result = i18nc("Play counter label for track metadata view", "Play count"); | ||
161 | break; | 171 | break; | ||
162 | case DatabaseInterface::LyricsRole: | 172 | case DatabaseInterface::LyricsRole: | ||
163 | result = i18nc("Lyrics label for track metadata view", "Lyrics"); | 173 | result = i18nc("Lyrics label for track metadata view", "Lyrics"); | ||
164 | break; | 174 | break; | ||
175 | case DatabaseInterface::ResourceRole: | ||||
176 | result = i18nc("Radio HTTP address for radio metadata view", "Stream Http Address"); | ||||
177 | break; | ||||
astippich: Not needed anymore for the general case | |||||
165 | case DatabaseInterface::SecondaryTextRole: | 178 | case DatabaseInterface::SecondaryTextRole: | ||
166 | case DatabaseInterface::ImageUrlRole: | 179 | case DatabaseInterface::ImageUrlRole: | ||
167 | case DatabaseInterface::ShadowForImageRole: | 180 | case DatabaseInterface::ShadowForImageRole: | ||
168 | case DatabaseInterface::ChildModelRole: | 181 | case DatabaseInterface::ChildModelRole: | ||
169 | case DatabaseInterface::StringDurationRole: | 182 | case DatabaseInterface::StringDurationRole: | ||
170 | case DatabaseInterface::MilliSecondsDurationRole: | 183 | case DatabaseInterface::MilliSecondsDurationRole: | ||
171 | case DatabaseInterface::IsValidAlbumArtistRole: | 184 | case DatabaseInterface::IsValidAlbumArtistRole: | ||
172 | case DatabaseInterface::AllArtistsRole: | 185 | case DatabaseInterface::AllArtistsRole: | ||
173 | case DatabaseInterface::HighestTrackRating: | 186 | case DatabaseInterface::HighestTrackRating: | ||
174 | case DatabaseInterface::ResourceRole: | | |||
175 | case DatabaseInterface::IdRole: | 187 | case DatabaseInterface::IdRole: | ||
176 | case DatabaseInterface::DatabaseIdRole: | 188 | case DatabaseInterface::DatabaseIdRole: | ||
177 | case DatabaseInterface::IsSingleDiscAlbumRole: | 189 | case DatabaseInterface::IsSingleDiscAlbumRole: | ||
178 | case DatabaseInterface::ContainerDataRole: | 190 | case DatabaseInterface::ContainerDataRole: | ||
179 | case DatabaseInterface::IsPartialDataRole: | 191 | case DatabaseInterface::IsPartialDataRole: | ||
180 | case DatabaseInterface::AlbumIdRole: | 192 | case DatabaseInterface::AlbumIdRole: | ||
181 | case DatabaseInterface::HasEmbeddedCover: | 193 | case DatabaseInterface::HasEmbeddedCover: | ||
182 | case DatabaseInterface::FileModificationTime: | 194 | case DatabaseInterface::FileModificationTime: | ||
183 | case DatabaseInterface::FirstPlayDate: | 195 | case DatabaseInterface::FirstPlayDate: | ||
184 | case DatabaseInterface::PlayFrequency: | 196 | case DatabaseInterface::PlayFrequency: | ||
185 | case DatabaseInterface::ElementTypeRole: | 197 | case DatabaseInterface::ElementTypeRole: | ||
186 | break; | 198 | break; | ||
187 | } | 199 | } | ||
188 | break; | 200 | break; | ||
189 | case ItemTypeRole: | 201 | case ItemTypeRole: | ||
190 | switch (currentKey) | 202 | switch (currentKey) | ||
191 | { | 203 | { | ||
192 | case DatabaseInterface::TitleRole: | 204 | case DatabaseInterface::TitleRole: | ||
193 | result = TextEntry; | 205 | result = TextEntry; | ||
194 | break; | 206 | break; | ||
207 | case DatabaseInterface::ResourceRole: | ||||
208 | result = TextEntry; | ||||
209 | break; | ||||
195 | case DatabaseInterface::ArtistRole: | 210 | case DatabaseInterface::ArtistRole: | ||
196 | result = TextEntry; | 211 | result = TextEntry; | ||
197 | break; | 212 | break; | ||
198 | case DatabaseInterface::AlbumRole: | 213 | case DatabaseInterface::AlbumRole: | ||
199 | result = TextEntry; | 214 | result = TextEntry; | ||
200 | break; | 215 | break; | ||
201 | case DatabaseInterface::AlbumArtistRole: | 216 | case DatabaseInterface::AlbumArtistRole: | ||
202 | result = TextEntry; | 217 | result = TextEntry; | ||
Show All 39 Lines | |||||
242 | case DatabaseInterface::ImageUrlRole: | 257 | case DatabaseInterface::ImageUrlRole: | ||
243 | case DatabaseInterface::ShadowForImageRole: | 258 | case DatabaseInterface::ShadowForImageRole: | ||
244 | case DatabaseInterface::ChildModelRole: | 259 | case DatabaseInterface::ChildModelRole: | ||
245 | case DatabaseInterface::StringDurationRole: | 260 | case DatabaseInterface::StringDurationRole: | ||
246 | case DatabaseInterface::MilliSecondsDurationRole: | 261 | case DatabaseInterface::MilliSecondsDurationRole: | ||
247 | case DatabaseInterface::IsValidAlbumArtistRole: | 262 | case DatabaseInterface::IsValidAlbumArtistRole: | ||
248 | case DatabaseInterface::AllArtistsRole: | 263 | case DatabaseInterface::AllArtistsRole: | ||
249 | case DatabaseInterface::HighestTrackRating: | 264 | case DatabaseInterface::HighestTrackRating: | ||
265 | case DatabaseInterface::IdRole: | ||||
266 | case DatabaseInterface::DatabaseIdRole: | ||||
267 | case DatabaseInterface::IsSingleDiscAlbumRole: | ||||
268 | case DatabaseInterface::ContainerDataRole: | ||||
269 | case DatabaseInterface::IsPartialDataRole: | ||||
270 | case DatabaseInterface::AlbumIdRole: | ||||
271 | case DatabaseInterface::HasEmbeddedCover: | ||||
272 | case DatabaseInterface::FileModificationTime: | ||||
273 | case DatabaseInterface::FirstPlayDate: | ||||
274 | case DatabaseInterface::PlayFrequency: | ||||
275 | case DatabaseInterface::ElementTypeRole: | ||||
276 | break; | ||||
277 | } | ||||
278 | break; | ||||
279 | } | ||||
280 | | ||||
281 | return result; | ||||
282 | } | ||||
283 | | ||||
284 | QVariant TrackMetadataModel::dataRadio(const QModelIndex &index, int role) const | ||||
285 | { | ||||
286 | auto result = QVariant{}; | ||||
287 | | ||||
288 | const auto currentKey = mTrackKeys[index.row()]; | ||||
289 | | ||||
290 | switch (role) | ||||
291 | { | ||||
292 | case Qt::DisplayRole: | ||||
293 | result = mTrackData[currentKey]; | ||||
294 | break; | ||||
295 | case ItemNameRole: | ||||
296 | switch (currentKey) | ||||
297 | { | ||||
298 | case DatabaseInterface::TitleRole: | ||||
299 | result = i18nc("Track title for track metadata view", "Title"); | ||||
300 | break; | ||||
301 | case DatabaseInterface::CommentRole: | ||||
302 | result = i18nc("Comment label for track metadata view", "Comment"); | ||||
303 | break; | ||||
250 | case DatabaseInterface::ResourceRole: | 304 | case DatabaseInterface::ResourceRole: | ||
305 | result = i18nc("Radio HTTP address for radio metadata view", "Stream Http Address"); | ||||
306 | break; | ||||
307 | case DatabaseInterface::ChannelsRole: | ||||
308 | case DatabaseInterface::BitRateRole: | ||||
309 | case DatabaseInterface::SampleRateRole: | ||||
310 | case DatabaseInterface::LastPlayDate: | ||||
311 | case DatabaseInterface::PlayCounter: | ||||
312 | case DatabaseInterface::LyricsRole: | ||||
313 | case DatabaseInterface::YearRole: | ||||
314 | case DatabaseInterface::ComposerRole: | ||||
315 | case DatabaseInterface::ArtistRole: | ||||
316 | case DatabaseInterface::AlbumRole: | ||||
317 | case DatabaseInterface::AlbumArtistRole: | ||||
318 | case DatabaseInterface::TrackNumberRole: | ||||
319 | case DatabaseInterface::DiscNumberRole: | ||||
320 | case DatabaseInterface::RatingRole: | ||||
321 | case DatabaseInterface::GenreRole: | ||||
322 | case DatabaseInterface::LyricistRole: | ||||
323 | case DatabaseInterface::DurationRole: | ||||
324 | case DatabaseInterface::SecondaryTextRole: | ||||
325 | case DatabaseInterface::ImageUrlRole: | ||||
326 | case DatabaseInterface::ShadowForImageRole: | ||||
327 | case DatabaseInterface::ChildModelRole: | ||||
328 | case DatabaseInterface::StringDurationRole: | ||||
329 | case DatabaseInterface::MilliSecondsDurationRole: | ||||
330 | case DatabaseInterface::AllArtistsRole: | ||||
331 | case DatabaseInterface::HighestTrackRating: | ||||
332 | case DatabaseInterface::IdRole: | ||||
333 | case DatabaseInterface::DatabaseIdRole: | ||||
334 | case DatabaseInterface::IsSingleDiscAlbumRole: | ||||
335 | case DatabaseInterface::ContainerDataRole: | ||||
336 | case DatabaseInterface::IsPartialDataRole: | ||||
337 | case DatabaseInterface::AlbumIdRole: | ||||
338 | case DatabaseInterface::HasEmbeddedCover: | ||||
339 | case DatabaseInterface::FileModificationTime: | ||||
340 | case DatabaseInterface::FirstPlayDate: | ||||
341 | case DatabaseInterface::PlayFrequency: | ||||
342 | case DatabaseInterface::ElementTypeRole: | ||||
343 | break; | ||||
344 | } | ||||
345 | break; | ||||
346 | case ItemTypeRole: | ||||
347 | switch (currentKey) | ||||
348 | { | ||||
349 | case DatabaseInterface::TitleRole: | ||||
350 | result = TextEntry; | ||||
351 | break; | ||||
352 | case DatabaseInterface::ResourceRole: | ||||
353 | result = TextEntry; | ||||
354 | break; | ||||
355 | case DatabaseInterface::CommentRole: | ||||
356 | result = TextEntry; | ||||
357 | break; | ||||
358 | case DatabaseInterface::ArtistRole: | ||||
359 | case DatabaseInterface::AlbumRole: | ||||
360 | case DatabaseInterface::AlbumArtistRole: | ||||
361 | case DatabaseInterface::TrackNumberRole: | ||||
362 | case DatabaseInterface::DiscNumberRole: | ||||
363 | case DatabaseInterface::RatingRole: | ||||
364 | case DatabaseInterface::GenreRole: | ||||
365 | case DatabaseInterface::LyricistRole: | ||||
366 | case DatabaseInterface::ComposerRole: | ||||
367 | case DatabaseInterface::YearRole: | ||||
368 | case DatabaseInterface::LastPlayDate: | ||||
369 | case DatabaseInterface::PlayCounter: | ||||
370 | case DatabaseInterface::LyricsRole: | ||||
371 | case DatabaseInterface::DurationRole: | ||||
372 | case DatabaseInterface::SampleRateRole: | ||||
373 | case DatabaseInterface::BitRateRole: | ||||
374 | case DatabaseInterface::ChannelsRole: | ||||
375 | case DatabaseInterface::SecondaryTextRole: | ||||
376 | case DatabaseInterface::ImageUrlRole: | ||||
377 | case DatabaseInterface::ShadowForImageRole: | ||||
378 | case DatabaseInterface::ChildModelRole: | ||||
379 | case DatabaseInterface::StringDurationRole: | ||||
380 | case DatabaseInterface::MilliSecondsDurationRole: | ||||
381 | case DatabaseInterface::AllArtistsRole: | ||||
382 | case DatabaseInterface::HighestTrackRating: | ||||
251 | case DatabaseInterface::IdRole: | 383 | case DatabaseInterface::IdRole: | ||
252 | case DatabaseInterface::DatabaseIdRole: | 384 | case DatabaseInterface::DatabaseIdRole: | ||
253 | case DatabaseInterface::IsSingleDiscAlbumRole: | 385 | case DatabaseInterface::IsSingleDiscAlbumRole: | ||
254 | case DatabaseInterface::ContainerDataRole: | 386 | case DatabaseInterface::ContainerDataRole: | ||
255 | case DatabaseInterface::IsPartialDataRole: | 387 | case DatabaseInterface::IsPartialDataRole: | ||
256 | case DatabaseInterface::AlbumIdRole: | 388 | case DatabaseInterface::AlbumIdRole: | ||
257 | case DatabaseInterface::HasEmbeddedCover: | 389 | case DatabaseInterface::HasEmbeddedCover: | ||
258 | case DatabaseInterface::FileModificationTime: | 390 | case DatabaseInterface::FileModificationTime: | ||
259 | case DatabaseInterface::FirstPlayDate: | 391 | case DatabaseInterface::FirstPlayDate: | ||
260 | case DatabaseInterface::PlayFrequency: | 392 | case DatabaseInterface::PlayFrequency: | ||
261 | case DatabaseInterface::ElementTypeRole: | 393 | case DatabaseInterface::ElementTypeRole: | ||
262 | break; | 394 | break; | ||
263 | } | 395 | } | ||
264 | break; | 396 | break; | ||
265 | } | 397 | } | ||
266 | 398 | | |||
267 | return result; | 399 | return result; | ||
268 | } | 400 | } | ||
269 | 401 | | |||
402 | QVariant TrackMetadataModel::data(const QModelIndex &index, int role) const | ||||
403 | { | ||||
404 | if (this->mIsRadio) { | ||||
405 | return dataRadio(index, role); | ||||
406 | } else { | ||||
407 | return dataGeneral(index, role); | ||||
408 | } | ||||
409 | } | ||||
410 | | ||||
I have a general question about the need for a special handling of radio. I do not get what is so special that we would need a complete code duplication here. mgallien: I have a general question about the need for a special handling of radio. I do not get what is… | |||||
I experienced an issue with the meta view if I returned some data in the other roles not concerned by the radio (TitleRole, ResourceRole, CommentRole). I can take a look at the metaView to fix the issue on the UI level. jguidon: I experienced an issue with the meta view if I returned some data in the other roles not… | |||||
mgallien: What was the issue ? I can maybe provide some help here. | |||||
jguidon: I get some other fields which are not very revelant for radios editing and viewing details, for… | |||||
270 | bool TrackMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role) | 411 | bool TrackMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role) | ||
271 | { | 412 | { | ||
272 | if (data(index, role) != value) { | 413 | if (data(index, role) != value) { | ||
273 | // FIXME: Implement me! | 414 | mTrackData[mTrackKeys[index.row()]] = value; | ||
415 | | ||||
274 | emit dataChanged(index, index, QVector<int>() << role); | 416 | emit dataChanged(index, index, QVector<int>() << role); | ||
275 | return true; | 417 | return true; | ||
276 | } | 418 | } | ||
277 | return false; | 419 | return false; | ||
278 | } | 420 | } | ||
279 | 421 | | |||
280 | QHash<int, QByteArray> TrackMetadataModel::roleNames() const | 422 | QHash<int, QByteArray> TrackMetadataModel::roleNames() const | ||
281 | { | 423 | { | ||
Show All 40 Lines | |||||
322 | 464 | | |||
323 | void TrackMetadataModel::fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData) | 465 | void TrackMetadataModel::fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData) | ||
324 | { | 466 | { | ||
325 | beginResetModel(); | 467 | beginResetModel(); | ||
326 | mFullData = trackData; | 468 | mFullData = trackData; | ||
327 | mTrackData.clear(); | 469 | mTrackData.clear(); | ||
328 | mTrackKeys.clear(); | 470 | mTrackKeys.clear(); | ||
329 | 471 | | |||
330 | for (auto role : {DatabaseInterface::TitleRole, DatabaseInterface::ArtistRole, DatabaseInterface::AlbumRole, | 472 | for (DatabaseInterface::ColumnsRoles role : (isRadio() ? mFieldsForRadioTrack : mFieldsForClassicTrack)){ | ||
331 | DatabaseInterface::AlbumArtistRole, DatabaseInterface::TrackNumberRole, DatabaseInterface::DiscNumberRole, | | |||
332 | DatabaseInterface::RatingRole, DatabaseInterface::GenreRole, DatabaseInterface::LyricistRole, | | |||
333 | DatabaseInterface::ComposerRole, DatabaseInterface::CommentRole, DatabaseInterface::YearRole, | | |||
334 | DatabaseInterface::LastPlayDate, DatabaseInterface::PlayCounter}) { | | |||
335 | if (trackData.constFind(role) != trackData.constEnd()) { | 473 | if (trackData.constFind(role) != trackData.constEnd()) { | ||
336 | if (role == DatabaseInterface::RatingRole) { | 474 | if (role == DatabaseInterface::RatingRole) { | ||
337 | if (trackData[role].toInt() == 0) { | 475 | if (trackData[role].toInt() == 0) { | ||
338 | continue; | 476 | continue; | ||
I am not a fan of all these if(isRadio) {} else {} blocks. Is there a different way to achieve this? astippich: I am not a fan of all these if(isRadio) {} else {} blocks. Is there a different way to achieve… | |||||
On a further thought, we may revisit how the metadata works later, but we can leave it as is right now here astippich: On a further thought, we may revisit how the metadata works later, but we can leave it as is… | |||||
jguidon: Maybe it is more readable this way? | |||||
Yeah, much better! I think your changes makes it even possible to provide some groundwork for future metadata editing for the tracks. astippich: Yeah, much better!
I think your changes makes it even possible to provide some groundwork for… | |||||
339 | } | 477 | } | ||
340 | } | 478 | } | ||
341 | 479 | | |||
342 | mTrackKeys.push_back(role); | 480 | mTrackKeys.push_back(role); | ||
343 | mTrackData[role] = trackData[role]; | 481 | mTrackData[role] = trackData[role]; | ||
344 | } | 482 | } | ||
345 | } | 483 | } | ||
346 | filterDataFromTrackData(); | 484 | filterDataFromTrackData(); | ||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Line(s) | 542 | { | |||
414 | if (mManager) { | 552 | if (mManager) { | ||
415 | mManager->connectModel(&mDataLoader); | 553 | mManager->connectModel(&mDataLoader); | ||
416 | } | 554 | } | ||
417 | 555 | | |||
418 | connect(this, &TrackMetadataModel::needDataByDatabaseId, | 556 | connect(this, &TrackMetadataModel::needDataByDatabaseId, | ||
419 | &mDataLoader, &ModelDataLoader::loadDataByDatabaseId); | 557 | &mDataLoader, &ModelDataLoader::loadDataByDatabaseId); | ||
420 | connect(this, &TrackMetadataModel::needDataByFileName, | 558 | connect(this, &TrackMetadataModel::needDataByFileName, | ||
421 | &mDataLoader, &ModelDataLoader::loadDataByFileName); | 559 | &mDataLoader, &ModelDataLoader::loadDataByFileName); | ||
422 | connect(&mDataLoader, &ModelDataLoader::allTrackData, | 560 | | ||
561 | if (isRadio()) { | ||||
562 | connect(this, &TrackMetadataModel::saveRadioData, | ||||
astippich: code style
if (....) { | |||||
563 | &mDataLoader, &ModelDataLoader::updateRadioData); | ||||
564 | connect(this, &TrackMetadataModel::deleteRadioData, | ||||
565 | &mDataLoader, &ModelDataLoader::deleteRadioData); | ||||
566 | connect(&mDataLoader, &ModelDataLoader::radioAdded, | ||||
567 | this, &TrackMetadataModel::radioAdded); | ||||
568 | connect(&mDataLoader, &ModelDataLoader::radioModified, | ||||
569 | this, &TrackMetadataModel::radioModified); | ||||
570 | connect(&mDataLoader, &ModelDataLoader::radioRemoved, | ||||
571 | this, &TrackMetadataModel::radioRemoved); | ||||
572 | connect(&mDataLoader, &ModelDataLoader::allRadioData, | ||||
423 | this, &TrackMetadataModel::trackData); | 573 | this, &TrackMetadataModel::trackData); | ||
mgallien: This is probably needed to get file tracks to work ? | |||||
astippich: code style
} else { | |||||
574 | } else { | ||||
424 | connect(&mDataLoader, &ModelDataLoader::trackModified, | 575 | connect(&mDataLoader, &ModelDataLoader::trackModified, | ||
425 | this, &TrackMetadataModel::trackData); | 576 | this, &TrackMetadataModel::trackData); | ||
577 | connect(&mDataLoader, &ModelDataLoader::allTrackData, | ||||
578 | this, &TrackMetadataModel::trackData); | ||||
579 | } | ||||
astippich: this belongs also into the "else" block below, doesn't it? | |||||
426 | } | 580 | } | ||
427 | 581 | | |||
428 | void TrackMetadataModel::fetchLyrics() | 582 | void TrackMetadataModel::fetchLyrics() | ||
429 | { | 583 | { | ||
430 | auto lyricicsValue = QtConcurrent::run(QThreadPool::globalInstance(), [=]() { | 584 | auto lyricicsValue = QtConcurrent::run(QThreadPool::globalInstance(), [=]() { | ||
431 | auto trackData = mFileScanner.scanOneFile(mFullData[DatabaseInterface::ResourceRole].toUrl(), mMimeDatabase); | 585 | auto trackData = mFileScanner.scanOneFile(mFullData[DatabaseInterface::ResourceRole].toUrl(), mMimeDatabase); | ||
432 | if (!trackData.lyrics().isEmpty()) { | 586 | if (!trackData.lyrics().isEmpty()) { | ||
433 | return trackData.lyrics(); | 587 | return trackData.lyrics(); | ||
434 | } | 588 | } | ||
435 | return QString{}; | 589 | return QString{}; | ||
436 | }); | 590 | }); | ||
437 | 591 | | |||
438 | mLyricsValueWatcher.setFuture(lyricicsValue); | 592 | mLyricsValueWatcher.setFuture(lyricicsValue); | ||
439 | } | 593 | } | ||
440 | 594 | | |||
441 | void TrackMetadataModel::initializeByTrackId(qulonglong databaseId) | 595 | void TrackMetadataModel::initializeByTrackId(qulonglong databaseId) | ||
442 | { | 596 | { | ||
443 | mFullData.clear(); | 597 | mFullData.clear(); | ||
444 | mTrackData.clear(); | 598 | mTrackData.clear(); | ||
445 | mCoverImage.clear(); | 599 | mCoverImage.clear(); | ||
446 | mFileUrl.clear(); | 600 | mFileUrl.clear(); | ||
447 | 601 | | |||
448 | Q_EMIT lyricsChanged(); | 602 | Q_EMIT lyricsChanged(); | ||
449 | 603 | | |||
450 | Q_EMIT needDataByDatabaseId(ElisaUtils::Track, databaseId); | 604 | Q_EMIT needDataByDatabaseId((isRadio() ? ElisaUtils::Radio : ElisaUtils::Track), databaseId); | ||
605 | } | ||||
606 | | ||||
607 | void TrackMetadataModel::initializeForNewRadio() | ||||
608 | { | ||||
609 | mFullData.clear(); | ||||
610 | mTrackData.clear(); | ||||
611 | | ||||
612 | fillDataForNewRadio(); | ||||
613 | } | ||||
614 | | ||||
615 | void TrackMetadataModel::fillDataForNewRadio() | ||||
616 | { | ||||
617 | beginResetModel(); | ||||
618 | mTrackData.clear(); | ||||
619 | mTrackKeys.clear(); | ||||
620 | | ||||
621 | for (auto role : { | ||||
622 | DatabaseInterface::TitleRole, | ||||
623 | DatabaseInterface::ResourceRole, | ||||
624 | DatabaseInterface::CommentRole, | ||||
625 | DatabaseInterface::DatabaseIdRole | ||||
626 | | ||||
627 | }) { | ||||
628 | mTrackKeys.push_back(role); | ||||
629 | if (role == DatabaseInterface::DatabaseIdRole) { | ||||
630 | mTrackData[role] = -1; | ||||
631 | Q_EMIT hideDeleteButton(); | ||||
632 | } else { | ||||
633 | mTrackData[role] = QStringLiteral(""); | ||||
634 | } | ||||
635 | | ||||
636 | } | ||||
637 | filterDataFromTrackData(); | ||||
638 | endResetModel(); | ||||
451 | } | 639 | } | ||
452 | 640 | | |||
453 | void TrackMetadataModel::initializeByTrackFileName(const QString &fileName) | 641 | void TrackMetadataModel::initializeByTrackFileName(const QString &fileName) | ||
454 | { | 642 | { | ||
455 | mFullData.clear(); | 643 | mFullData.clear(); | ||
456 | mTrackData.clear(); | 644 | mTrackData.clear(); | ||
457 | mCoverImage.clear(); | 645 | mCoverImage.clear(); | ||
458 | mFileUrl.clear(); | 646 | mFileUrl.clear(); | ||
459 | 647 | | |||
460 | Q_EMIT lyricsChanged(); | 648 | Q_EMIT lyricsChanged(); | ||
461 | 649 | | |||
462 | Q_EMIT needDataByFileName(ElisaUtils::FileName, QUrl::fromLocalFile(fileName)); | 650 | Q_EMIT needDataByFileName(ElisaUtils::FileName, QUrl::fromLocalFile(fileName)); | ||
463 | } | 651 | } | ||
464 | 652 | | |||
465 | void TrackMetadataModel::setManager(MusicListenersManager *newManager) | 653 | void TrackMetadataModel::setManager(MusicListenersManager *newManager) | ||
466 | { | 654 | { | ||
467 | initialize(newManager, nullptr); | 655 | initialize(newManager, nullptr); | ||
468 | } | 656 | } | ||
469 | 657 | | |||
658 | void TrackMetadataModel::setIsRadio(bool isRadio){ | ||||
659 | this->mIsRadio = isRadio; | ||||
660 | } | ||||
661 | | ||||
470 | void TrackMetadataModel::setDatabase(DatabaseInterface *trackDatabase) | 662 | void TrackMetadataModel::setDatabase(DatabaseInterface *trackDatabase) | ||
471 | { | 663 | { | ||
472 | initialize(nullptr, trackDatabase); | 664 | initialize(nullptr, trackDatabase); | ||
473 | } | 665 | } | ||
474 | 666 | | |||
667 | bool TrackMetadataModel::isRadio(){ | ||||
668 | return this->mIsRadio; | ||||
669 | } | ||||
670 | | ||||
671 | void TrackMetadataModel::saveData() | ||||
672 | { | ||||
673 | Q_EMIT saveRadioData(mTrackData); | ||||
674 | } | ||||
675 | | ||||
676 | void TrackMetadataModel::deleteRadio() | ||||
677 | { | ||||
678 | if (mTrackData[DatabaseInterface::DatabaseIdRole]>=0) { | ||||
679 | Q_EMIT deleteRadioData(mTrackData[DatabaseInterface::DatabaseIdRole].toULongLong()); | ||||
680 | } | ||||
681 | } | ||||
682 | | ||||
683 | void TrackMetadataModel::radioAdded(TrackDataType radiosData){ | ||||
684 | mTrackData[DatabaseInterface::DatabaseIdRole] = radiosData[DatabaseInterface::DatabaseIdRole]; | ||||
685 | Q_EMIT showDeleteButton(); | ||||
686 | radioModified(); | ||||
687 | } | ||||
688 | | ||||
689 | void TrackMetadataModel::radioModified(){ | ||||
690 | Q_EMIT disableApplyButton(); | ||||
691 | } | ||||
692 | | ||||
693 | void TrackMetadataModel::radioRemoved(){ | ||||
694 | Q_EMIT closeWindow(); | ||||
695 | } | ||||
475 | 696 | | |||
476 | #include "moc_trackmetadatamodel.cpp" | 697 | #include "moc_trackmetadatamodel.cpp" |
Not needed anymore for the general case