diff options
author | RJ Skerry-Ryan <rryan@mixxx.org> | 2018-12-26 09:27:13 -0800 |
---|---|---|
committer | RJ Skerry-Ryan <rryan@mixxx.org> | 2018-12-26 09:27:13 -0800 |
commit | 974bb2ad1b7ad1a06ddfc167903d29d977b142cc (patch) | |
tree | cd06248fb943ddc3f5de7ac861964ad50df4332f /src/library | |
parent | c05360f110f0280c028cf4d42fc4add94924f7c8 (diff) | |
parent | 84ca00e624d8ceaa0ce9d503f699ec37b0718e39 (diff) |
Merge remote-tracking branch 'mixxxdj/master' into remove-vamp
Diffstat (limited to 'src/library')
59 files changed, 491 insertions, 169 deletions
diff --git a/src/library/analysisfeature.cpp b/src/library/analysisfeature.cpp index d2613670ad..fea74315d8 100644 --- a/src/library/analysisfeature.cpp +++ b/src/library/analysisfeature.cpp @@ -32,7 +32,8 @@ AnalysisFeature::AnalysisFeature(Library* parent, m_pAnalyzerQueue(nullptr), m_bOldBpmEnabled(false), m_analysisTitleName(tr("Analyze")), - m_pAnalysisView(nullptr) { + m_pAnalysisView(nullptr), + m_icon(":/images/library/ic_library_prepare.svg") { setTitleDefault(); } @@ -61,7 +62,7 @@ QVariant AnalysisFeature::title() { } QIcon AnalysisFeature::getIcon() { - return QIcon(":/images/library/ic_library_prepare.svg"); + return m_icon; } void AnalysisFeature::bindWidget(WLibrary* libraryWidget, diff --git a/src/library/analysisfeature.h b/src/library/analysisfeature.h index c7d7c63bce..fc22868c55 100644 --- a/src/library/analysisfeature.h +++ b/src/library/analysisfeature.h @@ -79,6 +79,7 @@ class AnalysisFeature : public LibraryFeature { const static QString m_sAnalysisViewName; QString m_analysisTitleName; DlgAnalysis* m_pAnalysisView; + QIcon m_icon; }; diff --git a/src/library/autodj/autodjfeature.cpp b/src/library/autodj/autodjfeature.cpp index 64594d534e..0edbbbae7f 100644 --- a/src/library/autodj/autodjfeature.cpp +++ b/src/library/autodj/autodjfeature.cpp @@ -52,7 +52,8 @@ AutoDJFeature::AutoDJFeature(Library* pLibrary, m_iAutoDJPlaylistId(findOrCrateAutoDjPlaylistId(m_playlistDao)), m_pAutoDJProcessor(NULL), m_pAutoDJView(NULL), - m_autoDjCratesDao(m_iAutoDJPlaylistId, pTrackCollection, pConfig) { + m_autoDjCratesDao(m_iAutoDJPlaylistId, pTrackCollection, pConfig), + m_icon(":/images/library/ic_library_autodj.svg") { qRegisterMetaType<AutoDJProcessor::AutoDJState>("AutoDJState"); m_pAutoDJProcessor = new AutoDJProcessor( @@ -98,7 +99,7 @@ QVariant AutoDJFeature::title() { } QIcon AutoDJFeature::getIcon() { - return QIcon(":/images/library/ic_library_autodj.svg"); + return m_icon; } void AutoDJFeature::bindWidget(WLibrary* libraryWidget, @@ -132,7 +133,7 @@ TreeItemModel* AutoDJFeature::getChildModel() { void AutoDJFeature::activate() { //qDebug() << "AutoDJFeature::activate()"; emit(switchToView(m_sAutoDJViewName)); - emit(restoreSearch(QString())); //Null String disables search box + emit disableSearch(); emit(enableCoverArtDisplay(true)); } diff --git a/src/library/autodj/autodjfeature.h b/src/library/autodj/autodjfeature.h index 1d447fa642..559f185645 100644 --- a/src/library/autodj/autodjfeature.h +++ b/src/library/autodj/autodjfeature.h @@ -91,6 +91,8 @@ class AutoDJFeature : public LibraryFeature { // Used to map menu-item signals. QSignalMapper m_crateMapper; + QIcon m_icon; + private slots: // Add a crate to the auto-DJ queue. void slotAddCrateToAutoDj(int iCrateId); diff --git a/src/library/banshee/bansheedbconnection.cpp b/src/library/banshee/bansheedbconnection.cpp index ddd985a46c..3d28ecb9ea 100644 --- a/src/library/banshee/bansheedbconnection.cpp +++ b/src/library/banshee/bansheedbconnection.cpp @@ -53,10 +53,10 @@ int BansheeDbConnection::getSchemaVersion() { return -1; } -QList<struct BansheeDbConnection::Playlist> BansheeDbConnection::getPlaylists() { +QList<BansheeDbConnection::Playlist> BansheeDbConnection::getPlaylists() { - QList<struct BansheeDbConnection::Playlist> list; - struct BansheeDbConnection::Playlist playlist; + QList<BansheeDbConnection::Playlist> list; + BansheeDbConnection::Playlist playlist; QSqlQuery query(m_database); query.prepare("SELECT PlaylistID, Name FROM CorePlaylists ORDER By Name"); @@ -73,13 +73,13 @@ QList<struct BansheeDbConnection::Playlist> BansheeDbConnection::getPlaylists() return list; } -QList<struct BansheeDbConnection::PlaylistEntry> BansheeDbConnection::getPlaylistEntries(int playlistId) { +QList<BansheeDbConnection::PlaylistEntry> BansheeDbConnection::getPlaylistEntries(int playlistId) { PerformanceTimer time; time.start(); - QList<struct BansheeDbConnection::PlaylistEntry> list; - struct BansheeDbConnection::PlaylistEntry entry; + QList<BansheeDbConnection::PlaylistEntry> list; + BansheeDbConnection::PlaylistEntry entry; QSqlQuery query(m_database); query.setForwardOnly(true); // Saves about 50% time diff --git a/src/library/banshee/bansheedbconnection.h b/src/library/banshee/bansheedbconnection.h index b0d12d6d67..d7e2df6ddd 100644 --- a/src/library/banshee/bansheedbconnection.h +++ b/src/library/banshee/bansheedbconnection.h @@ -54,14 +54,14 @@ public: bool open(const QString& databaseFile); int getSchemaVersion(); - QList<struct Playlist> getPlaylists(); - QList<struct PlaylistEntry> getPlaylistEntries(int playlistId); + QList<Playlist> getPlaylists(); + QList<PlaylistEntry> getPlaylistEntries(int playlistId); private: QSqlDatabase m_database; - QMap<int, struct Track> m_trackMap; - QMap<int, struct Artist> m_artistMap; - QMap<int, struct Album> m_albumMap; + QMap<int, Track> m_trackMap; + QMap<int, Artist> m_artistMap; + QMap<int, Album> m_albumMap; }; diff --git a/src/library/banshee/bansheefeature.cpp b/src/library/banshee/bansheefeature.cpp index e0a6b4c75a..fad33e0e67 100644 --- a/src/library/banshee/bansheefeature.cpp +++ b/src/library/banshee/bansheefeature.cpp @@ -18,7 +18,8 @@ BansheeFeature::BansheeFeature(QObject* parent, UserSettingsPointer pConfig) : BaseExternalLibraryFeature(parent, pTrackCollection), m_pTrackCollection(pTrackCollection), - m_cancelImport(false) { + m_cancelImport(false), + m_icon(":/images/library/ic_library_banshee.svg") { Q_UNUSED(pConfig); m_pBansheePlaylistModel = new BansheePlaylistModel(this, m_pTrackCollection, &m_connection); m_isActivated = false; @@ -57,7 +58,7 @@ QVariant BansheeFeature::title() { } QIcon BansheeFeature::getIcon() { - return QIcon(":/images/library/ic_library_banshee.svg"); + return m_icon; } void BansheeFeature::activate() { @@ -139,6 +140,7 @@ void BansheeFeature::appendTrackIdsFromRightClickIndex(QList<TrackId>* trackIds, if (playlistID > 0) { BansheePlaylistModel* pPlaylistModelToAdd = new BansheePlaylistModel(this, m_pTrackCollection, &m_connection); pPlaylistModelToAdd->setTableModel(playlistID); + pPlaylistModelToAdd->select(); // Copy Tracks int rows = pPlaylistModelToAdd->rowCount(); diff --git a/src/library/banshee/bansheefeature.h b/src/library/banshee/bansheefeature.h index 5668358962..c9f3908df4 100644 --- a/src/library/banshee/bansheefeature.h +++ b/src/library/banshee/bansheefeature.h @@ -53,6 +53,7 @@ class BansheeFeature : public BaseExternalLibraryFeature { QFuture<TreeItem*> m_future; QString m_title; bool m_cancelImport; + QIcon m_icon; static QString m_databaseFile; diff --git a/src/library/banshee/bansheeplaylistmodel.cpp b/src/library/banshee/bansheeplaylistmodel.cpp index c871095bd3..d46661b965 100644 --- a/src/library/banshee/bansheeplaylistmodel.cpp +++ b/src/library/banshee/bansheeplaylistmodel.cpp @@ -11,6 +11,7 @@ #include "mixer/playermanager.h" #define BANSHEE_TABLE "banshee" +#define CLM_TRACK_ID "track_id" #define CLM_VIEW_ORDER "position" #define CLM_ARTIST "artist" #define CLM_TITLE "title" @@ -31,39 +32,50 @@ #define CLM_COMPOSER "composer" #define CLM_PREVIEW "preview" +namespace { +QAtomicInt sTableNumber; +} + BansheePlaylistModel::BansheePlaylistModel(QObject* pParent, TrackCollection* pTrackCollection, BansheeDbConnection* pConnection) : BaseSqlTableModel(pParent, pTrackCollection, "mixxx.db.model.banshee_playlist"), m_pConnection(pConnection), m_playlistId(-1) { + m_tempTableName = BANSHEE_TABLE + QString::number(sTableNumber.fetchAndAddAcquire(1)); } BansheePlaylistModel::~BansheePlaylistModel() { + dropTempTable(); } -void BansheePlaylistModel::setTableModel(int playlistId) { - //qDebug() << "BansheePlaylistModel::setTableModel" << playlistId; - if (m_playlistId == playlistId) { - qDebug() << "Already focused on playlist " << playlistId; - return; - } - +void BansheePlaylistModel::dropTempTable() { if (m_playlistId >= 0) { // Clear old playlist m_playlistId = -1; QSqlQuery query(m_pTrackCollection->database()); - QString strQuery("DELETE FROM " BANSHEE_TABLE); - if (!query.exec(strQuery)) { + QString strQuery("DROP TABLE IF EXISTS %1"); + if (!query.exec(strQuery.arg(m_tempTableName))) { LOG_FAILED_QUERY(query); } } +} + +void BansheePlaylistModel::setTableModel(int playlistId) { + //qDebug() << "BansheePlaylistModel::setTableModel" << this << playlistId; + if (m_playlistId == playlistId) { + qDebug() << "Already focused on playlist " << playlistId; + return; + } + + dropTempTable(); if (playlistId >= 0) { // setup new playlist m_playlistId = playlistId; QSqlQuery query(m_pTrackCollection->database()); - QString strQuery("CREATE TEMP TABLE IF NOT EXISTS " BANSHEE_TABLE - " (" CLM_VIEW_ORDER " INTEGER, " + QString strQuery("CREATE TEMP TABLE IF NOT EXISTS %1" + " (" CLM_TRACK_ID " INTEGER, " + CLM_VIEW_ORDER " INTEGER, " CLM_ARTIST " TEXT, " CLM_TITLE " TEXT, " CLM_DURATION " INTEGER, " @@ -82,12 +94,13 @@ void BansheePlaylistModel::setTableModel(int playlistId) { CLM_PLAYCOUNT" INTEGER, " CLM_COMPOSER " TEXT, " CLM_PREVIEW " TEXT)"); - if (!query.exec(strQuery)) { + if (!query.exec(strQuery.arg(m_tempTableName))) { LOG_FAILED_QUERY(query); } - query.prepare("INSERT INTO " BANSHEE_TABLE - " (" CLM_VIEW_ORDER ", " + QString strQuery2("INSERT INTO %1" + " (" CLM_TRACK_ID ", " + CLM_VIEW_ORDER ", " CLM_ARTIST ", " CLM_TITLE ", " CLM_DURATION ", " @@ -106,6 +119,7 @@ void BansheePlaylistModel::setTableModel(int playlistId) { CLM_PLAYCOUNT ", " CLM_COMPOSER ") " "VALUES (:" + CLM_TRACK_ID ", :" CLM_VIEW_ORDER ", :" CLM_ARTIST ", :" CLM_TITLE ", :" @@ -125,6 +139,7 @@ void BansheePlaylistModel::setTableModel(int playlistId) { CLM_PLAYCOUNT ", :" CLM_COMPOSER ") "); + query.prepare(strQuery2.arg(m_tempTableName)); QList<struct BansheeDbConnection::PlaylistEntry> list = m_pConnection->getPlaylistEntries(playlistId); @@ -133,6 +148,9 @@ void BansheePlaylistModel::setTableModel(int playlistId) { beginInsertRows(QModelIndex(), 0, list.size() - 1); foreach (struct BansheeDbConnection::PlaylistEntry entry, list) { + query.bindValue(":" CLM_TRACK_ID, entry.trackId); + // Note: entry.viewOrder is 0 for all tracks if they have + // never been sorted by the user query.bindValue(":" CLM_VIEW_ORDER, entry.viewOrder + 1); query.bindValue(":" CLM_ARTIST, entry.pArtist->name); query.bindValue(":" CLM_TITLE, entry.pTrack->title); @@ -165,11 +183,14 @@ void BansheePlaylistModel::setTableModel(int playlistId) { } QStringList tableColumns; - tableColumns << CLM_VIEW_ORDER // 0 - << CLM_PREVIEW; + tableColumns + << CLM_TRACK_ID // 0 + << CLM_VIEW_ORDER + << CLM_PREVIEW; // 3 QStringList trackSourceColumns; - trackSourceColumns << CLM_VIEW_ORDER // 0 + trackSourceColumns + << CLM_TRACK_ID // 0 << CLM_ARTIST << CLM_TITLE << CLM_DURATION @@ -189,10 +210,10 @@ void BansheePlaylistModel::setTableModel(int playlistId) { << CLM_COMPOSER; QSharedPointer<BaseTrackCache> trackSource( - new BaseTrackCache(m_pTrackCollection, BANSHEE_TABLE, CLM_VIEW_ORDER, + new BaseTrackCache(m_pTrackCollection, m_tempTableName, CLM_TRACK_ID, trackSourceColumns, false)); - setTable(BANSHEE_TABLE, CLM_VIEW_ORDER, tableColumns, trackSource); + setTable(m_tempTableName, CLM_TRACK_ID, tableColumns, trackSource); setSearch(""); setDefaultSort(fieldIndex(PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder); setSort(defaultSortColumn(), defaultSortOrder()); @@ -327,6 +348,15 @@ TrackPointer BansheePlaylistModel::getTrack(const QModelIndex& index) const { return pTrack; } +TrackId BansheePlaylistModel::getTrackId(const QModelIndex& index) const { + const auto track = getTrack(index); + if (track) { + return track->getId(); + } else { + return TrackId(); + } +} + // Gets the on-disk location of the track at the given location. QString BansheePlaylistModel::getTrackLocation(const QModelIndex& index) const { if (!index.isValid()) { @@ -365,6 +395,7 @@ QString BansheePlaylistModel::getTrackLocation(const QModelIndex& index) const { } bool BansheePlaylistModel::isColumnInternal(int column) { - Q_UNUSED(column); - return false; + return (column == fieldIndex(ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_TRACKID) || + (PlayerManager::numPreviewDecks() == 0 && + column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_PREVIEW))); } diff --git a/src/library/banshee/bansheeplaylistmodel.h b/src/library/banshee/bansheeplaylistmodel.h index efda77a878..d89fc20a8a 100644 --- a/src/library/banshee/bansheeplaylistmodel.h +++ b/src/library/banshee/bansheeplaylistmodel.h @@ -20,6 +20,8 @@ class BansheePlaylistModel : public BaseSqlTableModel { void setTableModel(int playlistId); TrackPointer getTrack(const QModelIndex& index) const final; + TrackId getTrackId(const QModelIndex& index) const final; + QString getTrackLocation(const QModelIndex& index) const final; bool isColumnInternal(int column) final; @@ -41,9 +43,11 @@ class BansheePlaylistModel : public BaseSqlTableModel { private: QString getFieldString(const QModelIndex& index, const QString& fieldName) const; QVariant getFieldVariant(const QModelIndex& index, const QString& fieldName) const; + void dropTempTable(); BansheeDbConnection* m_pConnection; int m_playlistId; + QString m_tempTableName; }; #endif // BANSHEEPLAYLISTMODEL_H diff --git a/src/library/baseexternallibraryfeature.cpp b/src/library/baseexternallibraryfeature.cpp index 87807a62e7..b527c119d3 100644 --- a/src/library/baseexternallibraryfeature.cpp +++ b/src/library/baseexternallibraryfeature.cpp @@ -56,7 +56,7 @@ void BaseExternalLibraryFeature::slotAddToAutoDJTop() { } void BaseExternalLibraryFeature::addToAutoDJ(bool bTop) { - // qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data(); + //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data(); QList<TrackId> trackIds; QString playlist; @@ -96,15 +96,14 @@ void BaseExternalLibraryFeature::slotImportAsMixxxPlaylist() { } // This is a common function for all external Librarys copied to Mixxx DB -void BaseExternalLibraryFeature::appendTrackIdsFromRightClickIndex(QList<TrackId>* trackIds, QString* pPlaylist) { +void BaseExternalLibraryFeature::appendTrackIdsFromRightClickIndex( + QList<TrackId>* trackIds, QString* pPlaylist) { if (!m_lastRightClickedIndex.isValid()) { return; } - // Qt::UserRole asks TreeItemModel for the TreeItem's data. We need to - // use the data because models with nested playlists need to use the - // full path/name of the playlist. - *pPlaylist = m_lastRightClickedIndex.data(Qt::UserRole).toString(); + DEBUG_ASSERT(pPlaylist); + *pPlaylist = m_lastRightClickedIndex.data().toString(); QScopedPointer<BaseSqlTableModel> pPlaylistModelToAdd( getPlaylistModelForPlaylist(*pPlaylist)); diff --git a/src/library/baseexternalplaylistmodel.cpp b/src/library/baseexternalplaylistmodel.cpp index 7529523896..2ba94fe30b 100644 --- a/src/library/baseexternalplaylistmodel.cpp +++ b/src/library/baseexternalplaylistmodel.cpp @@ -65,6 +65,15 @@ TrackPointer BaseExternalPlaylistModel::getTrack(const QModelIndex& index) const return pTrack; } +TrackId BaseExternalPlaylistModel::getTrackId(const QModelIndex& index) const { + const auto track = getTrack(index); + if (track) { + return track->getId(); + } else { + return TrackId(); + } +} + bool BaseExternalPlaylistModel::isColumnInternal(int column) { if (column == fieldIndex(ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_TRACKID) || (PlayerManager::numPreviewDecks() == 0 && diff --git a/src/library/baseexternalplaylistmodel.h b/src/library/baseexternalplaylistmodel.h index 0b8cd3e7b4..51cbb9c94f 100644 --- a/src/library/baseexternalplaylistmodel.h +++ b/src/library/baseexternalplaylistmodel.h @@ -25,6 +25,7 @@ class BaseExternalPlaylistModel : public BaseSqlTableModel { void setPlaylist(QString path_name); TrackPointer getTrack(const QModelIndex& index) const override; + TrackId getTrackId(const QModelIndex& index) const override; bool isColumnInternal(int column) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void trackLoaded(QString group, TrackPointer pTrack) override; diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp index 0971edbcfb..74b759ea2b 100644 --- a/src/library/baseplaylistfeature.cpp +++ b/src/library/baseplaylistfeature.cpp @@ -132,7 +132,7 @@ int BasePlaylistFeature::playlistIdFromIndex(QModelIndex index) { void BasePlaylistFeature::activate() { emit(switchToView(m_rootViewName)); - emit(restoreSearch(QString())); // Null String disables search box + emit disableSearch(); emit(enableCoverArtDisplay(true)); } @@ -623,8 +623,8 @@ QModelIndex BasePlaylistFeature::constructChildModel(int selected_id) { int selected_row = -1; int row = 0; - for (QList<QPair<int, QString> >::const_iterator it = m_playlistList.begin(); - it != m_playlistList.end(); ++it, ++row) { + for (auto it = m_playlistList.constBegin(); + it != m_playlistList.constEnd(); ++it, ++row) { int playlist_id = it->first; QString playlist_name = it->second; @@ -654,8 +654,8 @@ void BasePlaylistFeature::updateChildModel(int selected_id) { buildPlaylistList(); int row = 0; - for (QList<QPair<int, QString> >::const_iterator it = m_playlistList.begin(); - it != m_playlistList.end(); ++it, ++row) { + for (auto it = m_playlistList.constBegin(); + it != m_playlistList.constEnd(); ++it, ++row) { int playlist_id = it->first; QString playlist_name = it->second; @@ -680,8 +680,8 @@ void BasePlaylistFeature::clearChildModel() { QModelIndex BasePlaylistFeature::indexFromPlaylistId(int playlistId) { int row = 0; - for (QList<QPair<int, QString> >::const_iterator it = m_playlistList.begin(); - it != m_playlistList.end(); ++it, ++row) { + for (auto it = m_playlistList.constBegin(); + it != m_playlistList.constEnd(); ++it, ++row) { int current_id = it->first; QString playlist_name = it->second; @@ -708,8 +708,8 @@ void BasePlaylistFeature::slotTr |