![]() |
Mixxx
|
00001 #include <QtCore> 00002 #include <QtGui> 00003 #include <QtSql> 00004 00005 #include "library/trackcollection.h" 00006 #include "library/librarytablemodel.h" 00007 #include "library/queryutil.h" 00008 00009 #include "mixxxutils.cpp" 00010 00011 const QString LibraryTableModel::DEFAULT_LIBRARYFILTER = 00012 "mixxx_deleted=0 AND fs_deleted=0"; 00013 00014 LibraryTableModel::LibraryTableModel(QObject* parent, 00015 TrackCollection* pTrackCollection, 00016 QString settingsNamespace) 00017 : BaseSqlTableModel(parent, pTrackCollection, 00018 pTrackCollection->getDatabase(), 00019 settingsNamespace), 00020 m_trackDao(pTrackCollection->getTrackDAO()) { 00021 QStringList columns; 00022 columns << "library." + LIBRARYTABLE_ID; 00023 00024 QSqlQuery query(pTrackCollection->getDatabase()); 00025 QString queryString = "CREATE TEMPORARY VIEW IF NOT EXISTS library_view AS " 00026 "SELECT " + columns.join(",") + 00027 " FROM library INNER JOIN track_locations " 00028 "ON library.location = track_locations.id " 00029 "WHERE (" + LibraryTableModel::DEFAULT_LIBRARYFILTER + ")"; 00030 query.prepare(queryString); 00031 if (!query.exec()) { 00032 LOG_FAILED_QUERY(query); 00033 } 00034 00035 QStringList tableColumns; 00036 tableColumns << LIBRARYTABLE_ID; 00037 setTable("library_view", LIBRARYTABLE_ID, tableColumns, 00038 pTrackCollection->getTrackSource("default")); 00039 00040 // BaseSqlTabelModel will setup the header info 00041 initHeaderData(); 00042 00043 setSearch(""); 00044 setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder); 00045 00046 connect(this, SIGNAL(doSearch(const QString&)), 00047 this, SLOT(slotSearch(const QString&))); 00048 } 00049 00050 LibraryTableModel::~LibraryTableModel() { 00051 } 00052 00053 bool LibraryTableModel::addTrack(const QModelIndex& index, QString location) { 00054 QFileInfo fileInfo(location); 00055 00056 // Adds track, does not insert duplicates, handles unremoving logic. 00057 int trackId = m_trackDao.addTrack(fileInfo, true); 00058 if (trackId >= 0) { 00059 // TODO(rryan) do not select since we will get a signal. instead, do 00060 // something nice UI wise and select the track they dropped. 00061 select(); //Repopulate the data model. 00062 return true; 00063 } 00064 return false; 00065 } 00066 00067 TrackPointer LibraryTableModel::getTrack(const QModelIndex& index) const { 00068 int trackId = getTrackId(index); 00069 return m_trackDao.getTrack(trackId); 00070 } 00071 00072 void LibraryTableModel::removeTracks(const QModelIndexList& indices) { 00073 QList<int> trackIds; 00074 00075 foreach (QModelIndex index, indices) { 00076 int trackId = getTrackId(index); 00077 trackIds.append(trackId); 00078 } 00079 00080 m_trackDao.removeTracks(trackIds); 00081 00082 // TODO(rryan) : do not select, instead route event to BTC and notify from 00083 // there. 00084 select(); //Repopulate the data model. 00085 } 00086 00087 void LibraryTableModel::removeTrack(const QModelIndex& index) { 00088 int trackId = getTrackId(index); 00089 m_trackDao.removeTrack(trackId); 00090 // TODO(rryan) : do not select, instead route event to BTC and notify from 00091 // there. 00092 select(); //Repopulate the data model. 00093 } 00094 00095 void LibraryTableModel::moveTrack(const QModelIndex& sourceIndex, 00096 const QModelIndex& destIndex) { 00097 // Does nothing because we don't support reordering tracks in the library, 00098 // and getCapabilities() reports that. 00099 } 00100 00101 void LibraryTableModel::search(const QString& searchText) { 00102 // qDebug() << "LibraryTableModel::search()" << searchText 00103 // << QThread::currentThread(); 00104 emit(doSearch(searchText)); 00105 } 00106 00107 void LibraryTableModel::slotSearch(const QString& searchText) { 00108 // qDebug() << "slotSearch()" << searchText << QThread::currentThread(); 00109 BaseSqlTableModel::search(searchText); 00110 } 00111 00112 bool LibraryTableModel::isColumnInternal(int column) { 00113 if ((column == fieldIndex(LIBRARYTABLE_ID)) || 00114 (column == fieldIndex(LIBRARYTABLE_URL)) || 00115 (column == fieldIndex(LIBRARYTABLE_CUEPOINT)) || 00116 (column == fieldIndex(LIBRARYTABLE_REPLAYGAIN)) || 00117 (column == fieldIndex(LIBRARYTABLE_WAVESUMMARYHEX)) || 00118 (column == fieldIndex(LIBRARYTABLE_SAMPLERATE)) || 00119 (column == fieldIndex(LIBRARYTABLE_MIXXXDELETED)) || 00120 (column == fieldIndex(LIBRARYTABLE_HEADERPARSED)) || 00121 (column == fieldIndex(LIBRARYTABLE_PLAYED)) || 00122 (column == fieldIndex(LIBRARYTABLE_CHANNELS)) || 00123 (column == fieldIndex(TRACKLOCATIONSTABLE_FSDELETED))) { 00124 return true; 00125 } 00126 return false; 00127 } 00128 00129 bool LibraryTableModel::isColumnHiddenByDefault(int column) { 00130 if (column == fieldIndex(LIBRARYTABLE_KEY)) 00131 return true; 00132 return false; 00133 } 00134 00135 QItemDelegate* LibraryTableModel::delegateForColumn(const int i) { 00136 return NULL; 00137 } 00138 00139 TrackModel::CapabilitiesFlags LibraryTableModel::getCapabilities() const { 00140 return TRACKMODELCAPS_NONE 00141 | TRACKMODELCAPS_RECEIVEDROPS 00142 | TRACKMODELCAPS_ADDTOPLAYLIST 00143 | TRACKMODELCAPS_ADDTOCRATE 00144 | TRACKMODELCAPS_ADDTOAUTODJ 00145 | TRACKMODELCAPS_RELOADMETADATA 00146 | TRACKMODELCAPS_LOADTODECK 00147 | TRACKMODELCAPS_LOADTOSAMPLER 00148 | TRACKMODELCAPS_REMOVE; 00149 }