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