![]() |
Mixxx
|
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 }