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