Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/cratetablemodel.cpp

Go to the documentation of this file.
00001 // cratetablemodel.cpp
00002 // Created 10/25/2009 by RJ Ryan (rryan@mit.edu)
00003 
00004 #include <QtDebug>
00005 
00006 #include "library/cratetablemodel.h"
00007 
00008 #include "library/dao/cratedao.h"
00009 #include "library/librarytablemodel.h"
00010 #include "library/queryutil.h"
00011 #include "library/trackcollection.h"
00012 
00013 #include "mixxxutils.cpp"
00014 
00015 CrateTableModel::CrateTableModel(QObject* pParent, TrackCollection* pTrackCollection)
00016         : BaseSqlTableModel(pParent, pTrackCollection,
00017                             pTrackCollection->getDatabase(),
00018                             "mixxx.db.model.crate"),
00019           m_pTrackCollection(pTrackCollection),
00020           m_iCrateId(-1) {
00021     connect(this, SIGNAL(doSearch(const QString&)),
00022             this, SLOT(slotSearch(const QString&)));
00023 }
00024 
00025 CrateTableModel::~CrateTableModel() {
00026 }
00027 
00028 void CrateTableModel::setCrate(int crateId) {
00029     //qDebug() << "CrateTableModel::setCrate()" << crateId;
00030     m_iCrateId = crateId;
00031 
00032     QString tableName = QString("crate_%1").arg(m_iCrateId);
00033     QSqlQuery query(m_pTrackCollection->getDatabase());
00034     FieldEscaper escaper(m_pTrackCollection->getDatabase());
00035     QStringList columns;
00036     columns << CRATETRACKSTABLE_TRACKID;
00037 
00038     // We drop files that have been explicitly deleted from mixxx
00039     // (mixxx_deleted=0) from the view. There was a bug in <= 1.9.0 where
00040     // removed files were not removed from playlists, so some users will have
00041     // libraries where this is the case.
00042     QString queryString = QString(
00043         "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
00044         "SELECT %2 FROM %3 "
00045         "INNER JOIN library ON library.id = %3.%4 "
00046         "WHERE %3.%5 = %6 AND library.mixxx_deleted = 0")
00047             .arg(escaper.escapeString(tableName))
00048             .arg(columns.join(","))
00049             .arg(CRATE_TRACKS_TABLE)
00050             .arg(CRATETRACKSTABLE_TRACKID)
00051             .arg(CRATETRACKSTABLE_CRATEID)
00052             .arg(crateId);
00053     query.prepare(queryString);
00054     if (!query.exec()) {
00055         LOG_FAILED_QUERY(query);
00056     }
00057 
00058     setTable(tableName, columns[0], columns,
00059              m_pTrackCollection->getTrackSource("default"));
00060     // BaseSqlTableModel sets up the header names
00061     initHeaderData();
00062     setSearch("");
00063     setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder);
00064 }
00065 
00066 bool CrateTableModel::addTrack(const QModelIndex& index, QString location) {
00067     // If a track is dropped but it isn't in the library, then add it because
00068     // the user probably dropped a file from outside Mixxx into this playlist.
00069     QFileInfo fileInfo(location);
00070 
00071     TrackDAO& trackDao = m_pTrackCollection->getTrackDAO();
00072 
00073     // Adds track, does not insert duplicates, handles unremoving logic.
00074     int iTrackId = trackDao.addTrack(fileInfo, true);
00075 
00076     bool success = false;
00077     if (iTrackId >= 0) {
00078         success = m_pTrackCollection->getCrateDAO().addTrackToCrate(iTrackId, m_iCrateId);
00079     }
00080 
00081     if (success) {
00082         // TODO(rryan) just add the track dont select
00083         select();
00084         return true;
00085     } else {
00086         qDebug() << "CrateTableModel::addTrack could not add track"
00087                  << fileInfo.absoluteFilePath() << "to crate" << m_iCrateId;
00088         return false;
00089     }
00090 }
00091 
00092 TrackPointer CrateTableModel::getTrack(const QModelIndex& index) const {
00093     int trackId = getTrackId(index);
00094     return m_pTrackCollection->getTrackDAO().getTrack(trackId);
00095 }
00096 
00097 void CrateTableModel::removeTracks(const QModelIndexList& indices) {
00098     CrateDAO& crateDao = m_pTrackCollection->getCrateDAO();
00099     bool locked = crateDao.isCrateLocked(m_iCrateId);
00100 
00101     if (!locked) {
00102         QList<int> trackIds;
00103         foreach (QModelIndex index, indices) {
00104             trackIds.append(getTrackId(index));
00105         }
00106         foreach (int trackId, trackIds) {
00107             crateDao.removeTrackFromCrate(trackId, m_iCrateId);
00108         }
00109         select();
00110     }
00111 }
00112 
00113 void CrateTableModel::removeTrack(const QModelIndex& index) {
00114     CrateDAO& crateDao = m_pTrackCollection->getCrateDAO();
00115     bool locked = crateDao.isCrateLocked(m_iCrateId);
00116 
00117     if (!locked) {
00118         int trackId = getTrackId(index);
00119         if (m_pTrackCollection->getCrateDAO().
00120             removeTrackFromCrate(trackId, m_iCrateId)) {
00121             select();
00122         } else {
00123             // TODO(XXX) feedback
00124         }
00125     }
00126 }
00127 
00128 void CrateTableModel::moveTrack(const QModelIndex& sourceIndex,
00129                                 const QModelIndex& destIndex) {
00130     return;
00131 }
00132 
00133 void CrateTableModel::search(const QString& searchText) {
00134     // qDebug() << "CrateTableModel::search()" << searchText
00135     //          << QThread::currentThread();
00136     emit(doSearch(searchText));
00137 }
00138 
00139 void CrateTableModel::slotSearch(const QString& searchText) {
00140     BaseSqlTableModel::search(
00141         searchText, LibraryTableModel::DEFAULT_LIBRARYFILTER);
00142 }
00143 
00144 bool CrateTableModel::isColumnInternal(int column) {
00145     if (column == fieldIndex(CRATETRACKSTABLE_TRACKID) ||
00146         column == fieldIndex(LIBRARYTABLE_PLAYED) ||
00147         column == fieldIndex(LIBRARYTABLE_MIXXXDELETED) ||
00148         column == fieldIndex(TRACKLOCATIONSTABLE_FSDELETED)) {
00149         return true;
00150     }
00151     return false;
00152 }
00153 bool CrateTableModel::isColumnHiddenByDefault(int column) {
00154     if (column == fieldIndex(LIBRARYTABLE_KEY))
00155         return true;
00156     return false;
00157 }
00158 
00159 QItemDelegate* CrateTableModel::delegateForColumn(int i) {
00160     return NULL;
00161 }
00162 
00163 TrackModel::CapabilitiesFlags CrateTableModel::getCapabilities() const {
00164     CapabilitiesFlags caps =  TRACKMODELCAPS_NONE
00165             | TRACKMODELCAPS_RECEIVEDROPS
00166             | TRACKMODELCAPS_ADDTOPLAYLIST
00167             | TRACKMODELCAPS_ADDTOCRATE
00168             | TRACKMODELCAPS_ADDTOAUTODJ
00169             | TRACKMODELCAPS_RELOADMETADATA
00170             | TRACKMODELCAPS_LOADTODECK
00171             | TRACKMODELCAPS_LOADTOSAMPLER
00172             | TRACKMODELCAPS_REMOVE;
00173 
00174     CrateDAO& crateDao = m_pTrackCollection->getCrateDAO();
00175     bool locked = crateDao.isCrateLocked(m_iCrateId);
00176 
00177     if (locked) {
00178         caps |= TRACKMODELCAPS_LOCKED;
00179     }
00180 
00181     return caps;
00182 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines