Mixxx

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