diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..6e3b817f05bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files +*.slo +*.lo +*.o + +# Compiled Dynamic libraries +*.so +*.dylib + +# Compiled Static libraries +*.lai +*.la +*.a + +Debug +*.cproject +*.project +*.DS_Store + +*~ +*.swp +*.pyc diff --git a/mixxx/src/library/autodjfeature.cpp b/mixxx/src/library/autodjfeature.cpp index e5234387557a..59c6324e8758 100644 --- a/mixxx/src/library/autodjfeature.cpp +++ b/mixxx/src/library/autodjfeature.cpp @@ -23,13 +23,18 @@ AutoDJFeature::AutoDJFeature(QObject* parent, m_pTrackCollection(pTrackCollection), m_playlistDao(pTrackCollection->getPlaylistDAO()), m_pAutoDJView(NULL) { + + connect(&m_playlistDao,SIGNAL(playlistsTitleUpdate(int)),this,SLOT(slotUpdateTitle(int))); } AutoDJFeature::~AutoDJFeature() { } QVariant AutoDJFeature::title() { - return tr("Auto DJ"); + int autoDJId = m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE); + QString title = m_playlistDao.getPlaylistName(autoDJId); + return title; + //return tr("Auto DJ"); } QIcon AutoDJFeature::getIcon() { @@ -97,3 +102,8 @@ bool AutoDJFeature::dragMoveAccept(QUrl url) { QFileInfo file(url.toLocalFile()); return SoundSourceProxy::isFilenameSupported(file.fileName()); } + +void AutoDJFeature::slotUpdateTitle(int autoDJId) { + Q_UNUSED(autoDJId); + emit(nameUpdated(this)); +} diff --git a/mixxx/src/library/autodjfeature.h b/mixxx/src/library/autodjfeature.h index 2562bf0c5e88..9a1abc4f1850 100644 --- a/mixxx/src/library/autodjfeature.h +++ b/mixxx/src/library/autodjfeature.h @@ -35,8 +35,12 @@ class AutoDJFeature : public LibraryFeature { TreeItemModel* getChildModel(); + signals: + void nameUpdated(LibraryFeature*); + public slots: void activate(); + void slotUpdateTitle(int); private: ConfigObject* m_pConfig; diff --git a/mixxx/src/library/baseplaylistfeature.cpp b/mixxx/src/library/baseplaylistfeature.cpp index 0f9f7689d203..9436369b0347 100644 --- a/mixxx/src/library/baseplaylistfeature.cpp +++ b/mixxx/src/library/baseplaylistfeature.cpp @@ -69,6 +69,8 @@ BasePlaylistFeature::BasePlaylistFeature(QObject* parent, connect(&m_playlistDao, SIGNAL(lockChanged(int)), this, SLOT(slotPlaylistTableChanged(int))); + connect(&m_playlistDao, SIGNAL(playlistsTitleUpdate(int)), + this,SLOT(slotPlaylistTableChanged(int))); } BasePlaylistFeature::~BasePlaylistFeature() { @@ -477,4 +479,3 @@ QModelIndex BasePlaylistFeature::constructChildModel(int selected_id) void BasePlaylistFeature::clearChildModel() { m_childModel.removeRows(0, m_playlistList.size()); } - diff --git a/mixxx/src/library/cratefeature.cpp b/mixxx/src/library/cratefeature.cpp index 44bc349943a9..efcb80d6c5fd 100644 --- a/mixxx/src/library/cratefeature.cpp +++ b/mixxx/src/library/cratefeature.cpp @@ -66,6 +66,9 @@ CrateFeature::CrateFeature(QObject* parent, connect(&m_crateDao, SIGNAL(lockChanged(int)), this, SLOT(slotCrateTableChanged(int))); + connect(&m_crateDao, SIGNAL(cratesTitleUpdate(int)), + this, SLOT(slotCrateTableChanged(int))); + // construct child model TreeItem *rootItem = new TreeItem(); m_childModel.setRootItem(rootItem); diff --git a/mixxx/src/library/dao/cratedao.cpp b/mixxx/src/library/dao/cratedao.cpp index 6edbec017992..1cac9ad45918 100644 --- a/mixxx/src/library/dao/cratedao.cpp +++ b/mixxx/src/library/dao/cratedao.cpp @@ -18,6 +18,7 @@ CrateDAO::~CrateDAO() { void CrateDAO::initialize() { qDebug() << "CrateDAO::initialize()"; + updateCratesTitleNum(); } unsigned int CrateDAO::crateCount() { @@ -42,6 +43,7 @@ int CrateDAO::createCrate(const QString& name) { } int crateId = query.lastInsertId().toInt(); + updateCratesTitleNum(); emit(added(crateId)); return crateId; } @@ -56,6 +58,7 @@ bool CrateDAO::renameCrate(int crateId, const QString& newName) { LOG_FAILED_QUERY(query); return false; } + updateCratesTitleNum(); emit(renamed(crateId)); return true; } @@ -117,21 +120,48 @@ bool CrateDAO::deleteCrate(int crateId) { return true; } +//int CrateDAO::getCrateIdByName(const QString& name) { +// QSqlQuery query(m_database); +// query.prepare("SELECT id FROM " CRATE_TABLE " WHERE name = (:name)"); +// query.bindValue(":name", name); +// if (query.exec()) { +// if (query.next()) { +// int id = query.value(0).toInt(); +// return id; +// } +// } else { +// LOG_FAILED_QUERY(query); +// } +// return -1; +//} + int CrateDAO::getCrateIdByName(const QString& name) { + QString pattern("(.*)\x20(\\(([1-9]\\d*|0)\\))"); + QRegExp rxnum(pattern); + QSqlQuery query(m_database); - query.prepare("SELECT id FROM " CRATE_TABLE " WHERE name = (:name)"); - query.bindValue(":name", name); + query.prepare("SELECT id,name FROM " CRATE_TABLE); + if (query.exec()) { - if (query.next()) { - int id = query.value(0).toInt(); - return id; + while (query.next()) { + int queryID = query.value(0).toInt(); + QString queryName = query.value(1).toString(); + + if (queryName == name) { + return queryID; + } else if (rxnum.exactMatch(queryName)) { + QString originalName = rxnum.cap(1); + if (originalName == name) { + return queryID; + } + } } + return -1; } else { LOG_FAILED_QUERY(query); } return -1; } - int CrateDAO::getCrateId(int position) { QSqlQuery query(m_database); query.prepare("SELECT id FROM " CRATE_TABLE); @@ -209,7 +239,7 @@ bool CrateDAO::addTrackToCrate(int trackId, int crateId) { LOG_FAILED_QUERY(query); return false; } - + updateCratesTitleNum(); emit(trackAdded(crateId, trackId)); emit(changed(crateId)); return true; @@ -233,7 +263,7 @@ int CrateDAO::addTracksToCrate(QList trackIdList, int crateId) { } } transaction.commit(); - + updateCratesTitleNum(); // Emitting the trackAdded signals for each trackID outside the transaction foreach(int trackId, trackIdList) { emit(trackAdded(crateId, trackId)); @@ -256,7 +286,7 @@ bool CrateDAO::removeTrackFromCrate(int trackId, int crateId) { LOG_FAILED_QUERY(query); return false; } - + updateCratesTitleNum(); emit(trackRemoved(crateId, trackId)); emit(changed(crateId)); return true; @@ -280,6 +310,7 @@ bool CrateDAO::removeTracksFromCrate(QList ids, int crateId) { foreach (int trackId, ids) { emit(trackRemoved(crateId, trackId)); } + updateCratesTitleNum(); emit(changed(crateId)); return true; } @@ -295,8 +326,84 @@ void CrateDAO::removeTracksFromCrates(QList ids) { if (!query.exec()) { LOG_FAILED_QUERY(query); } + updateCratesTitleNum(); // TODO(XXX) should we emit this for all crates? // emit(trackRemoved(crateId, trackId)); // emit(changed(crateId)); } +void CrateDAO::updateCratesTitleNum() { + QString pattern("(.*)\x20(\\(([1-9]\\d*|0)\\))"); + QRegExp rxnum(pattern); + + m_database.transaction(); + QSqlQuery selectQuery(m_database); + //selectQuery.prepare(" SELECT Crates.name,count(*),Crates.id FROM Crates, Crate_tracks " + // " WHERE Crates.id = Crate_tracks.crate_id " + // " GROUP BY Crates.id "); + selectQuery.prepare(" SELECT Crates.name,Count_table.count,Crates.id FROM Crates INNER JOIN " + " (SELECT crate_id, count(*) AS count FROM Crate_tracks GROUP BY crate_id) " + " AS Count_table ON Count_table.crate_id = Crates.id "); + if (!selectQuery.exec()) { + LOG_FAILED_QUERY(selectQuery); + } else { + while (selectQuery.next()) { + QString newNameWithNum; + QString oldName = selectQuery.value(0).toString(); + QString tracksNum = selectQuery.value(1).toString(); + int cratesID = selectQuery.value(2).toInt(); + + if (!rxnum.exactMatch(oldName)) { + //qDebug() << "no:"< ids, int crateId); // remove tracks from all crates void removeTracksFromCrates(QList ids); + // Update the shown number of tracks in every crates + void updateCratesTitleNum(); signals: void added(int crateId); @@ -55,7 +57,7 @@ class CrateDAO : public QObject, public virtual DAO { void trackRemoved(int crateId, int trackId); void renamed(int crateId); void lockChanged(int crateId); - + void cratesTitleUpdate(int crateId); private: QSqlDatabase& m_database; DISALLOW_COPY_AND_ASSIGN(CrateDAO); diff --git a/mixxx/src/library/dao/playlistdao.cpp b/mixxx/src/library/dao/playlistdao.cpp index bc120bfbe774..cf2208cf79d0 100644 --- a/mixxx/src/library/dao/playlistdao.cpp +++ b/mixxx/src/library/dao/playlistdao.cpp @@ -17,6 +17,7 @@ PlaylistDAO::~PlaylistDAO() void PlaylistDAO::initialize() { + updatePlaylistsTitleNum(); } int PlaylistDAO::createPlaylist(QString name, HiddenType hidden) @@ -60,6 +61,7 @@ int PlaylistDAO::createPlaylist(QString name, HiddenType hidden) int playlistId = query.lastInsertId().toInt(); //Commit the transaction transaction.commit(); + updatePlaylistsTitleNum(); emit(added(playlistId)); return playlistId; } @@ -86,22 +88,55 @@ QString PlaylistDAO::getPlaylistName(int playlistId) return name; } +//int PlaylistDAO::getPlaylistIdFromName(QString name) { +// // qDebug() << "PlaylistDAO::getPlaylistIdFromName" << QThread::currentThread() << m_database.connectionName(); +// +// QSqlQuery query(m_database); +// query.prepare("SELECT id FROM Playlists WHERE name = :name"); +// query.bindValue(":name", name); +// if (query.exec()) { +// if (query.next()) { +// return query.value(query.record().indexOf("id")).toInt(); +// } +// } else { +// LOG_FAILED_QUERY(query); +// } +// return -1; +//} + int PlaylistDAO::getPlaylistIdFromName(QString name) { - // qDebug() << "PlaylistDAO::getPlaylistIdFromName" << QThread::currentThread() << m_database.connectionName(); + //qDebug() << "PlaylistDAO::getPlaylistIdFromName" << QThread::currentThread() << m_database.connectionName(); + // since now showing the number of the tracks in every playlist is through change the "name" column + // in "playlists" table, so here we need a regular expression to match. + QString pattern("(.*)\x20(\\(([1-9]\\d*|0)\\))"); + QRegExp rxnum(pattern); QSqlQuery query(m_database); - query.prepare("SELECT id FROM Playlists WHERE name = :name"); - query.bindValue(":name", name); + query.prepare("SELECT id,name FROM Playlists"); + if (query.exec()) { - if (query.next()) { - return query.value(query.record().indexOf("id")).toInt(); + while (query.next()) { + int queryID = query.value(0).toInt(); + QString queryName = query.value(1).toString(); + + //qDebug() << "queryID:" << queryID + // << "queryName:" << queryName; + + if (queryName == name) { + return queryID; + } else if (rxnum.exactMatch(queryName)) { + QString originalName = rxnum.cap(1); + if (originalName == name) { + return queryID; + } + } } + return -1; } else { LOG_FAILED_QUERY(query); } return -1; } - void PlaylistDAO::deletePlaylist(int playlistId) { // qDebug() << "PlaylistDAO::deletePlaylist" << QThread::currentThread() << m_database.connectionName(); @@ -144,6 +179,7 @@ void PlaylistDAO::renamePlaylist(int playlistId, const QString& newName) { return; } emit(renamed(playlistId)); + updatePlaylistsTitleNum(); } bool PlaylistDAO::setPlaylistLocked(int playlistId, bool locked) { @@ -210,6 +246,8 @@ bool PlaylistDAO::appendTracksToPlaylist(QList trackIds, int playlistId) { // Commit the transaction transaction.commit(); + updatePlaylistsTitleNum(); + insertPosition = position; foreach (int trackId, trackIds) { // TODO(XXX) don't emit if the track didn't add successfully. @@ -340,7 +378,7 @@ void PlaylistDAO::removeTrackFromPlaylist(int playlistId, int position) LOG_FAILED_QUERY(query); } transaction.commit(); - + updatePlaylistsTitleNum(); emit(trackRemoved(playlistId, trackId, position)); emit(changed(playlistId)); } @@ -394,6 +432,7 @@ void PlaylistDAO::removeTracksFromPlaylist(int playlistId, QList positions) emit(trackRemoved(playlistId, trackId, position)); } transaction.commit(); + updatePlaylistsTitleNum(); emit(changed(playlistId)); } @@ -436,6 +475,8 @@ bool PlaylistDAO::insertTrackIntoPlaylist(int trackId, int playlistId, int posit } transaction.commit(); + updatePlaylistsTitleNum(); + emit(trackAdded(playlistId, trackId, position)); emit(changed(playlistId)); return true; @@ -490,6 +531,8 @@ int PlaylistDAO::insertTracksIntoPlaylist(QList trackIds, int playlistId, i transaction.commit(); + updatePlaylistsTitleNum(); + insertPositon = position; foreach (int trackId, trackIds) { // TODO(XXX) The position is wrong if any track failed to insert. @@ -634,6 +677,8 @@ void PlaylistDAO::removeTrackFromPlaylists(int trackId) { if (!query.exec()) { LOG_FAILED_QUERY(query); } + + updatePlaylistsTitleNum(); } void PlaylistDAO::removeTracksFromPlaylists(QList ids) { @@ -647,6 +692,8 @@ void PlaylistDAO::removeTracksFromPlaylists(QList ids) { if (!query.exec()) { LOG_FAILED_QUERY(query); } + + updatePlaylistsTitleNum(); } int PlaylistDAO::tracksInPlaylist(int playlistId) { @@ -665,3 +712,82 @@ int PlaylistDAO::tracksInPlaylist(int playlistId) { } return count; } + +void PlaylistDAO::updatePlaylistsTitleNum() { + QString pattern("(.*)\x20(\\(([1-9]\\d*|0)\\))"); + QRegExp rxnum(pattern); + + m_database.transaction(); + QSqlQuery selectQuery(m_database); + + //selectQuery.prepare(" SELECT Playlists.name,count(*),Playlists.id FROM PlaylistTracks, Playlists " + // " WHERE PlaylistTracks.playlist_id = Playlists.id AND Playlists.hidden <> 2" + // " GROUP BY playlist_id "); + selectQuery.prepare(" SELECT Playlists.name,Count_table.count,Playlists.id FROM Playlists INNER JOIN " + " (SELECT playlist_id, count(*) AS count FROM PlaylistTracks GROUP BY playlist_id) " + " AS Count_table ON Count_table.playlist_id = Playlists.id " + " WHERE Playlists.hidden <> 2"); + if (!selectQuery.exec()) { + LOG_FAILED_QUERY(selectQuery); + } else { + while (selectQuery.next()) { + QString newNameWithNum; + QString oldName = selectQuery.value(0).toString(); + QString tracksNum = selectQuery.value(1).toString(); + int playlistsID = selectQuery.value(2).toInt(); + + if (!rxnum.exactMatch(oldName)) { + //qDebug() << "no:"<