=== modified file 'mixxx/src/library/cratefeature.cpp' --- mixxx/src/library/cratefeature.cpp 2010-11-25 01:03:57 +0000 +++ mixxx/src/library/cratefeature.cpp 2010-12-27 02:42:58 +0000 @@ -23,6 +23,10 @@ connect(m_pCreateCrateAction, SIGNAL(triggered()), this, SLOT(slotCreateCrate())); + m_pRenameCrateAction = new QAction(tr("Rename"),this); + connect(m_pRenameCrateAction, SIGNAL(triggered()), + this, SLOT(slotRenameCrate())); + m_pDeleteCrateAction = new QAction(tr("Remove"),this); connect(m_pDeleteCrateAction, SIGNAL(triggered()), this, SLOT(slotDeleteCrate())); @@ -123,6 +127,7 @@ QMenu menu(NULL); menu.addAction(m_pCreateCrateAction); + menu.addAction(m_pRenameCrateAction); menu.addSeparator(); menu.addAction(m_pDeleteCrateAction); menu.exec(globalPos); @@ -175,3 +180,59 @@ qDebug() << "Failed to delete crateId" << crateId; } } + +void CrateFeature::slotRenameCrate() +{ + if (m_lastRightClickedIndex.isValid()) + { + int err = 0; + bool ok = false; + + QString old = m_lastRightClickedIndex.data().toString(); + + QString name = QInputDialog::getText( + NULL, tr("Rename Crate"), tr("Crate name:"), + QLineEdit::Normal, old, &ok); + + // Ensure that the user has not cancelled the operation, + // and that they did not try to rename the playlist to its current name + if (!ok || name == old) + return; + + // Ensure the name isn't blank + if (name == "") { + QMessageBox::warning(NULL, + tr("Crate Renaming Failed"), + tr("A crate cannot have a blank name.")); + return; + } + + CrateDAO& crateDao = m_pTrackCollection->getCrateDAO(); + + // Ensure that a playlist with this name doesn't exist already + if (crateDao.getCrateIdByName(name) == -1) { + //Ensure the renaming works at the DAO level... + if (!crateDao.renameCrate(old, name)) + { + QMessageBox::warning(NULL, + tr("Crate Renaming Failed"), + tr("An unknown error occurred while renaming crate ") + old + + tr(" to ") + name); + return; + } + + m_crateListTableModel.select(); + emit(featureUpdated()); + + // Switch to the new crate. + int crate_id = crateDao.getCrateIdByName(name); + m_crateTableModel.setCrate(crate_id); + emit(showTrackModel(&m_crateTableModel)); + // TODO(XXX) set sidebar selection + } else { + QMessageBox::warning(NULL, + tr("Crate Renaming Failed"), + tr("A crate by that name already exists.")); + } + } +} === modified file 'mixxx/src/library/cratefeature.h' --- mixxx/src/library/cratefeature.h 2010-02-23 20:06:25 +0000 +++ mixxx/src/library/cratefeature.h 2010-12-27 02:28:21 +0000 @@ -40,12 +40,14 @@ void onRightClickChild(const QPoint& globalPos, QModelIndex index); void slotCreateCrate(); + void slotRenameCrate(); void slotDeleteCrate(); private: TrackCollection* m_pTrackCollection; QAction *m_pCreateCrateAction; QAction *m_pDeleteCrateAction; + QAction *m_pRenameCrateAction; QSqlTableModel m_crateListTableModel; CrateTableModel m_crateTableModel; QModelIndex m_lastRightClickedIndex; === modified file 'mixxx/src/library/dao/cratedao.cpp' --- mixxx/src/library/dao/cratedao.cpp 2010-10-19 01:35:26 +0000 +++ mixxx/src/library/dao/cratedao.cpp 2010-12-27 02:36:25 +0000 @@ -171,3 +171,27 @@ } return false; } + +/** Rename a crate */ +bool CrateDAO::renameCrate(QString old_name, QString new_name) +{ + qDebug() << "Renaming crate " << old_name << " to " << new_name; + + // Query the Crates database to replace the old name with the new name + QSqlQuery query(m_database); + query.prepare("UPDATE Crates " + "SET name = :nname " + "WHERE name = :oname"); + query.bindValue(":nname", new_name); + query.bindValue(":oname", old_name); + query.exec(); + + //Print out any SQL error, if there was one. + if (query.lastError().isValid()) { + qDebug() << "renameCrate" << query.lastError(); + // m_database.rollback(); + return false; + } + + return true; +} === modified file 'mixxx/src/library/dao/cratedao.h' --- mixxx/src/library/dao/cratedao.h 2010-10-19 01:35:26 +0000 +++ mixxx/src/library/dao/cratedao.h 2010-12-27 02:34:56 +0000 @@ -29,6 +29,8 @@ unsigned int crateSize(int crateId); bool addTrackToCrate(int trackId, int crateId); bool removeTrackFromCrate(int trackId, int crateId); + /** Rename a crate */ + bool renameCrate(QString old_name, QString new_name); private: QSqlDatabase& m_database; === modified file 'mixxx/src/library/dao/playlistdao.cpp' --- mixxx/src/library/dao/playlistdao.cpp 2010-10-07 03:05:48 +0000 +++ mixxx/src/library/dao/playlistdao.cpp 2010-12-27 01:26:57 +0000 @@ -5,6 +5,9 @@ #include "trackinfoobject.h" #include "library/dao/playlistdao.h" +// Included for the Add Playlist to Auto-DJ Queue feature: +#include "library/trackcollection.h" + PlaylistDAO::PlaylistDAO(QSqlDatabase& database) : m_database(database) { @@ -309,3 +312,57 @@ m_database.commit(); } + +/** Add a playlist to the Auto-DJ Queue */ +void PlaylistDAO::addToAutoDJQueue(int playlistId) +{ + qDebug() << "Adding tracks from playlist " << playlistId << " to the Auto-DJ Queue"; + + // Query the PlaylistTracks database to locate tracks in the selected playlist + QSqlQuery query(m_database); + query.prepare("SELECT track_id FROM PlaylistTracks " + "WHERE playlist_id = :plid"); + query.bindValue(":plid", playlistId); + query.exec(); + + //Print out any SQL error, if there was one. + if (query.lastError().isValid()) { + qDebug() << "addToAutoDJQueue" << query.lastError(); + // m_database.rollback(); + // return; + } + + // Get the ID of the Auto-DJ playlist + int autoDJId = getPlaylistIdFromName(AUTODJ_TABLE); + + // Loop through the tracks, adding them to the Auto-DJ Queue + while(query.next()) + { + appendTrackToPlaylist(query.value(0).toInt(), autoDJId); + qDebug() << "Adding track " << query.value(0).toString(); + } +} + +/** Rename a playlist */ +bool PlaylistDAO::renamePlaylist(QString old_name, QString new_name) +{ + qDebug() << "Renaming playlist " << old_name << " to " << new_name; + + // Query the Playlists database to replace the old name with the new name + QSqlQuery query(m_database); + query.prepare("UPDATE Playlists " + "SET name = :nname " + "WHERE name = :oname"); + query.bindValue(":nname", new_name); + query.bindValue(":oname", old_name); + query.exec(); + + //Print out any SQL error, if there was one. + if (query.lastError().isValid()) { + qDebug() << "renamePlaylist" << query.lastError(); + // m_database.rollback(); + return false; + } + + return true; +} === modified file 'mixxx/src/library/dao/playlistdao.h' --- mixxx/src/library/dao/playlistdao.h 2010-09-12 20:00:07 +0000 +++ mixxx/src/library/dao/playlistdao.h 2010-12-27 01:12:44 +0000 @@ -35,6 +35,11 @@ void removeTrackFromPlaylist(int playlistId, int position); /** Insert a track into a specific position in a playlist */ void insertTrackIntoPlaylist(int trackId, int playlistId, int position); + /** Add a playlist to the Auto-DJ Queue */ + void addToAutoDJQueue(int playlistId); + /** Rename a playlist */ + bool renamePlaylist(QString old_name, QString new_name); + private: QSqlDatabase& m_database; }; === modified file 'mixxx/src/library/playlistfeature.cpp' --- mixxx/src/library/playlistfeature.cpp 2010-11-25 01:06:46 +0000 +++ mixxx/src/library/playlistfeature.cpp 2010-12-27 01:47:00 +0000 @@ -23,6 +23,14 @@ connect(m_pCreatePlaylistAction, SIGNAL(triggered()), this, SLOT(slotCreatePlaylist())); + m_pAddToAutoDJAction = new QAction(tr("Add Playlist to Auto-DJ Queue"),this); + connect(m_pAddToAutoDJAction, SIGNAL(triggered()), + this, SLOT(slotAddToAutoDJ())); + + m_pRenamePlaylistAction = new QAction(tr("Rename Playlist"),this); + connect(m_pRenamePlaylistAction, SIGNAL(triggered()), + this, SLOT(slotRenamePlaylist())); + m_pDeletePlaylistAction = new QAction(tr("Remove"),this); connect(m_pDeletePlaylistAction, SIGNAL(triggered()), this, SLOT(slotDeletePlaylist())); @@ -42,7 +50,9 @@ PlaylistFeature::~PlaylistFeature() { delete m_pPlaylistTableModel; delete m_pCreatePlaylistAction; + delete m_pRenamePlaylistAction; delete m_pDeletePlaylistAction; + delete m_pAddToAutoDJAction; } QVariant PlaylistFeature::title() { @@ -94,6 +104,8 @@ //Create the right-click menu QMenu menu(NULL); menu.addAction(m_pCreatePlaylistAction); + menu.addAction(m_pAddToAutoDJAction); + menu.addAction(m_pRenamePlaylistAction); menu.addSeparator(); menu.addAction(m_pDeletePlaylistAction); menu.exec(globalPos); @@ -156,6 +168,73 @@ emit(featureUpdated()); } +void PlaylistFeature::slotAddToAutoDJ() +{ + //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data(); + + if (m_lastRightClickedIndex.isValid()) { + int playlistId = m_playlistDao.getPlaylistIdFromName(m_lastRightClickedIndex.data().toString()); + Q_ASSERT(playlistId >= 0); + m_playlistDao.addToAutoDJQueue(playlistId); + } + + emit(featureUpdated()); +} + +void PlaylistFeature::slotRenamePlaylist() +{ + if (m_lastRightClickedIndex.isValid()) + { + int err = 0; + bool ok = false; + + QString old = m_lastRightClickedIndex.data().toString(); + + QString name = QInputDialog::getText( + NULL, tr("Rename Playlist"), tr("Playlist name:"), + QLineEdit::Normal, old, &ok); + + // Ensure that the user has not cancelled the operation, + // and that they did not try to rename the playlist to its current name + if (!ok || name == old) + return; + + // Ensure the name isn't blank + if (name == "") { + QMessageBox::warning(NULL, + tr("Playlist Renaming Failed"), + tr("A playlist cannot have a blank name.")); + return; + } + + // Ensure that a playlist with this name doesn't exist already + if (m_playlistDao.getPlaylistIdFromName(name) == -1) { + //Ensure the renaming works at the DAO level... + if (!m_playlistDao.renamePlaylist(old, name)) + { + QMessageBox::warning(NULL, + tr("Playlist Renaming Failed"), + tr("An unknown error occurred while renaming playlist ") + old + + tr(" to ") + name); + return; + } + + m_playlistTableModel.select(); + emit(featureUpdated()); + + // Switch the view to the renamed playlist. + int playlistId = m_playlistDao.getPlaylistIdFromName(name); + m_pPlaylistTableModel->setPlaylist(playlistId); + // TODO(XXX) set sidebar selection + emit(showTrackModel(m_pPlaylistTableModel)); + } else { + QMessageBox::warning(NULL, + tr("Playlist Renaming Failed"), + tr("A playlist by that name already exists.")); + } + } +} + bool PlaylistFeature::dropAccept(QUrl url) { return false; } === modified file 'mixxx/src/library/playlistfeature.h' --- mixxx/src/library/playlistfeature.h 2010-02-23 20:06:25 +0000 +++ mixxx/src/library/playlistfeature.h 2010-12-27 01:27:51 +0000 @@ -45,6 +45,8 @@ void slotCreatePlaylist(); void slotDeletePlaylist(); + void slotAddToAutoDJ(); + void slotRenamePlaylist(); private: PlaylistTableModel* m_pPlaylistTableModel; @@ -52,6 +54,8 @@ TrackDAO &m_trackDao; QAction *m_pCreatePlaylistAction; QAction *m_pDeletePlaylistAction; + QAction *m_pAddToAutoDJAction; + QAction *m_pRenamePlaylistAction; QSqlTableModel m_playlistTableModel; QModelIndex m_lastRightClickedIndex; };