Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/rhythmbox/rhythmboxplaylistmodel.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/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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines