Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/traktor/traktorplaylistmodel.cpp

Go to the documentation of this file.
00001 #include <QtCore>
00002 #include <QtGui>
00003 #include <QtSql>
00004 
00005 #include "library/trackcollection.h"
00006 #include "library/traktor/traktorplaylistmodel.h"
00007 #include "track/beatfactory.h"
00008 #include "track/beats.h"
00009 
00010 TraktorPlaylistModel::TraktorPlaylistModel(QObject* parent,
00011                                        TrackCollection* pTrackCollection)
00012         : BaseSqlTableModel(parent, pTrackCollection,
00013                             pTrackCollection->getDatabase(),
00014                             "mixxx.db.model.traktor.playlistmodel"),
00015           m_pTrackCollection(pTrackCollection),
00016           m_database(m_pTrackCollection->getDatabase()) {
00017     connect(this, SIGNAL(doSearch(const QString&)),
00018             this, SLOT(slotSearch(const QString&)));
00019 }
00020 
00021 TraktorPlaylistModel::~TraktorPlaylistModel() {
00022 }
00023 
00024 TrackPointer TraktorPlaylistModel::getTrack(const QModelIndex& index) const {
00025     //qDebug() << "getTraktorTrack";
00026     QString artist = index.sibling(
00027         index.row(), fieldIndex("artist")).data().toString();
00028     QString title = index.sibling(
00029         index.row(), fieldIndex("title")).data().toString();
00030     QString album = index.sibling(
00031         index.row(), fieldIndex("album")).data().toString();
00032     QString year = index.sibling(
00033         index.row(), fieldIndex("year")).data().toString();
00034     QString genre = index.sibling(
00035         index.row(), fieldIndex("genre")).data().toString();
00036     float bpm = index.sibling(
00037         index.row(), fieldIndex("bpm")).data().toString().toFloat();
00038     QString location = index.sibling(
00039         index.row(), fieldIndex("location")).data().toString();
00040 
00041     if (location.isEmpty()) {
00042         // Track is lost
00043         return TrackPointer();
00044     }
00045 
00046     TrackDAO& track_dao = m_pTrackCollection->getTrackDAO();
00047     int track_id = track_dao.getTrackId(location);
00048     bool track_already_in_library = track_id >= 0;
00049     if (track_id < 0) {
00050         // Add Track to library
00051         track_id = track_dao.addTrack(location, true);
00052     }
00053 
00054     TrackPointer pTrack;
00055 
00056     if (track_id < 0) {
00057         // Add Track to library failed, create a transient TrackInfoObject
00058         pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
00059     } else {
00060         pTrack = track_dao.getTrack(track_id);
00061     }
00062 
00063     // If this track was not in the Mixxx library it is now added and will be
00064     // saved with the metadata from iTunes. If it was already in the library
00065     // then we do not touch it so that we do not over-write the user's metadata.
00066     if (!track_already_in_library) {
00067         pTrack->setArtist(artist);
00068         pTrack->setTitle(title);
00069         pTrack->setAlbum(album);
00070         pTrack->setYear(year);
00071         pTrack->setGenre(genre);
00072         pTrack->setBpm(bpm);
00073 
00074         // If the track has a BPM, then give it a static beatgrid. TODO(XXX) load
00075         // traktor beatgrid information.
00076         if (bpm > 0) {
00077             BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0);
00078             pTrack->setBeats(pBeats);
00079         }
00080     }
00081     return pTrack;
00082 }
00083 
00084 void TraktorPlaylistModel::search(const QString& searchText) {
00085     // qDebug() << "TraktorPlaylistModel::search()" << searchText
00086     //          << QThread::currentThread();
00087     emit(doSearch(searchText));
00088 }
00089 
00090 void TraktorPlaylistModel::slotSearch(const QString& searchText) {
00091     BaseSqlTableModel::search(searchText);
00092 }
00093 
00094 bool TraktorPlaylistModel::isColumnInternal(int column) {
00095     if (column == fieldIndex("track_id")) {
00096         return true;
00097     }
00098     return false;
00099 }
00100 
00101 Qt::ItemFlags TraktorPlaylistModel::flags(const QModelIndex &index) const {
00102     return readOnlyFlags(index);
00103 }
00104 
00105 void TraktorPlaylistModel::setPlaylist(QString playlist_path) {
00106     int playlistId = -1;
00107     QSqlQuery finder_query(m_database);
00108     finder_query.prepare("SELECT id from traktor_playlists where name=:name");
00109     finder_query.bindValue(":name", playlist_path);
00110 
00111     if (!finder_query.exec()) {
00112         qDebug() << "SQL Error in TraktorPlaylistModel.cpp: line" << __LINE__
00113                  << finder_query.lastError();
00114         return;
00115     }
00116     while (finder_query.next()) {
00117         playlistId = finder_query.value(
00118             finder_query.record().indexOf("id")).toInt();
00119     }
00120 
00121     QString playlistID = "TraktorPlaylist_" + QString("%1").arg(playlistId);
00122     // Escape the playlist name
00123     QSqlDriver* driver = m_pTrackCollection->getDatabase().driver();
00124     QSqlField playlistNameField("name", QVariant::String);
00125     playlistNameField.setValue(playlistID);
00126 
00127     QStringList columns;
00128     columns << "track_id";
00129     columns << "position";
00130 
00131     QSqlQuery query(m_database);
00132     QString queryString = QString(
00133         "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
00134         "SELECT %2 FROM %3 WHERE playlist_id = %4")
00135             .arg(driver->formatValue(playlistNameField))
00136             .arg(columns.join(","))
00137             .arg("traktor_playlist_tracks")
00138             .arg(playlistId);
00139     query.prepare(queryString);
00140 
00141     if (!query.exec()) {
00142         qDebug() << "Error creating temporary view for traktor playlists."
00143                  << "TraktorPlaylistModel --> line: " << __LINE__
00144                  << query.lastError();
00145         qDebug() << "Executed Query: " << query.executedQuery();
00146         return;
00147     }
00148 
00149     setTable(playlistID, columns[0], columns,
00150              m_pTrackCollection->getTrackSource("traktor"));
00151     setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);
00152     initHeaderData();
00153     setSearch("");
00154 }
00155 
00156 bool TraktorPlaylistModel::isColumnHiddenByDefault(int column) {
00157     if (column == fieldIndex(LIBRARYTABLE_KEY) ||
00158         column == fieldIndex(LIBRARYTABLE_BITRATE)) {
00159         return true;
00160     }
00161     return false;
00162 }
00163 
00164 TrackModel::CapabilitiesFlags TraktorPlaylistModel::getCapabilities() const {
00165     // See src/library/trackmodel.h for the list of TRACKMODELCAPS
00166     return TRACKMODELCAPS_NONE
00167             | TRACKMODELCAPS_ADDTOPLAYLIST
00168             | TRACKMODELCAPS_ADDTOCRATE
00169             | TRACKMODELCAPS_ADDTOAUTODJ
00170             | TRACKMODELCAPS_LOADTODECK
00171             | TRACKMODELCAPS_LOADTOSAMPLER;
00172 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines