diff --git a/mixxx/src/dlgautodj.cpp b/mixxx/src/dlgautodj.cpp index 3da32d7d6f8..f4b4b1a0d04 100644 --- a/mixxx/src/dlgautodj.cpp +++ b/mixxx/src/dlgautodj.cpp @@ -50,7 +50,7 @@ DlgAutoDJ::DlgAutoDJ(QWidget* parent, ConfigObject* pConfig, playlistId = playlistDao.createPlaylist(AUTODJ_TABLE, PlaylistDAO::PLHT_AUTO_DJ); } - m_pAutoDJTableModel->setPlaylist(playlistId); + m_pAutoDJTableModel->setTableModel(playlistId); m_pTrackTableView->loadTrackModel(m_pAutoDJTableModel); // Override some playlist-view properties: diff --git a/mixxx/src/library/baseexternalplaylistmodel.cpp b/mixxx/src/library/baseexternalplaylistmodel.cpp index 3813241cd30..e462e4e96b3 100644 --- a/mixxx/src/library/baseexternalplaylistmodel.cpp +++ b/mixxx/src/library/baseexternalplaylistmodel.cpp @@ -8,20 +8,19 @@ BaseExternalPlaylistModel::BaseExternalPlaylistModel( QString settingsNamespace, QString playlistsTable, QString playlistTracksTable, QString trackSource) : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), settingsNamespace), m_playlistsTable(playlistsTable), m_playlistTracksTable(playlistTracksTable), - m_trackSource(trackSource), - m_pTrackCollection(pTrackCollection), - m_database(m_pTrackCollection->getDatabase()) { - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); + m_trackSource(trackSource) { } BaseExternalPlaylistModel::~BaseExternalPlaylistModel() { } +void BaseExternalPlaylistModel::setTableModel(int id) { + Q_UNUSED(id); +} + TrackPointer BaseExternalPlaylistModel::getTrack(const QModelIndex& index) const { QString artist = index.sibling( index.row(), fieldIndex("artist")).data().toString(); @@ -74,16 +73,6 @@ TrackPointer BaseExternalPlaylistModel::getTrack(const QModelIndex& index) const return pTrack; } -void BaseExternalPlaylistModel::search(const QString& searchText) { - // qDebug() << "BaseExternalPlaylistModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void BaseExternalPlaylistModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search(searchText); -} - bool BaseExternalPlaylistModel::isColumnInternal(int column) { if (column == fieldIndex("track_id") || (PlayerManager::numPreviewDecks() == 0 && column == fieldIndex("preview"))) { diff --git a/mixxx/src/library/baseexternalplaylistmodel.h b/mixxx/src/library/baseexternalplaylistmodel.h index 44419fe3f19..a2b86059dd9 100644 --- a/mixxx/src/library/baseexternalplaylistmodel.h +++ b/mixxx/src/library/baseexternalplaylistmodel.h @@ -19,27 +19,18 @@ class BaseExternalPlaylistModel : public BaseSqlTableModel { QString playlistTracksTable, QString trackSource); virtual ~BaseExternalPlaylistModel(); + void setTableModel(int id=-1); virtual TrackPointer getTrack(const QModelIndex& index) const; - virtual void search(const QString& searchText); - virtual bool isColumnInternal(int column); - virtual bool isColumnHiddenByDefault(int column); - virtual Qt::ItemFlags flags(const QModelIndex &index) const; - virtual void setPlaylist(QString path_name); - virtual TrackModel::CapabilitiesFlags getCapabilities() const; - - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); + bool isColumnInternal(int column); + bool isColumnHiddenByDefault(int column); + Qt::ItemFlags flags(const QModelIndex &index) const; + void setPlaylist(QString path_name); + TrackModel::CapabilitiesFlags getCapabilities() const; private: QString m_playlistsTable; QString m_playlistTracksTable; QString m_trackSource; - - TrackCollection* m_pTrackCollection; - QSqlDatabase& m_database; }; #endif /* BASEEXTERNALPLAYLISTMODEL_H */ diff --git a/mixxx/src/library/baseexternaltrackmodel.cpp b/mixxx/src/library/baseexternaltrackmodel.cpp index 6fd4b338819..1f74b05da8c 100644 --- a/mixxx/src/library/baseexternaltrackmodel.cpp +++ b/mixxx/src/library/baseexternaltrackmodel.cpp @@ -7,20 +7,19 @@ BaseExternalTrackModel::BaseExternalTrackModel(QObject* parent, QString settingsNamespace, QString trackTable, QString trackSource) - : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), - settingsNamespace), - m_pTrackCollection(pTrackCollection), - m_database(m_pTrackCollection->getDatabase()) { - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); + : BaseSqlTableModel(parent, pTrackCollection, settingsNamespace), + m_trackTable(trackTable), + m_trackSource(trackSource) { + setTableModel(); +} +void BaseExternalTrackModel::setTableModel(int id) { + Q_UNUSED(id); QStringList columns; columns << "id"; // TODO(XXX) preview column, needs a temporary view - - setTable(trackTable, columns[0], columns, - m_pTrackCollection->getTrackSource(trackSource)); + setTable(m_trackTable, columns[0], columns, + m_pTrackCollection->getTrackSource(m_trackSource)); setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder); initHeaderData(); } @@ -74,15 +73,6 @@ TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const { return pTrack; } -void BaseExternalTrackModel::search(const QString& searchText) { - // qDebug() << "BaseExternalTrackModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void BaseExternalTrackModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search(searchText); -} bool BaseExternalTrackModel::isColumnInternal(int column) { // Used for preview deck widgets. diff --git a/mixxx/src/library/baseexternaltrackmodel.h b/mixxx/src/library/baseexternaltrackmodel.h index 1e2add7a0be..780cc2395a4 100644 --- a/mixxx/src/library/baseexternaltrackmodel.h +++ b/mixxx/src/library/baseexternaltrackmodel.h @@ -21,22 +21,16 @@ class BaseExternalTrackModel : public BaseSqlTableModel { QString trackSource); virtual ~BaseExternalTrackModel(); + void setTableModel(int id=-1); TrackModel::CapabilitiesFlags getCapabilities() const; - virtual TrackPointer getTrack(const QModelIndex& index) const; - virtual void search(const QString& searchText); - virtual bool isColumnInternal(int column); - virtual bool isColumnHiddenByDefault(int column); - virtual Qt::ItemFlags flags(const QModelIndex &index) const; - - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); + TrackPointer getTrack(const QModelIndex& index) const; + bool isColumnInternal(int column); + bool isColumnHiddenByDefault(int column); + Qt::ItemFlags flags(const QModelIndex &index) const; private: - TrackCollection* m_pTrackCollection; - QSqlDatabase& m_database; + QString m_trackTable; + QString m_trackSource; }; #endif /* BASEEXTERNALTRACKMODEL_H */ diff --git a/mixxx/src/library/baseplaylistfeature.cpp b/mixxx/src/library/baseplaylistfeature.cpp index 33b2289a731..0f9f7689d20 100644 --- a/mixxx/src/library/baseplaylistfeature.cpp +++ b/mixxx/src/library/baseplaylistfeature.cpp @@ -11,17 +11,17 @@ #include "widget/wlibrary.h" #include "widget/wlibrarytextbrowser.h" -BasePlaylistFeature::BasePlaylistFeature( - QObject* parent, ConfigObject* pConfig, - TrackCollection* pTrackCollection, - QString rootViewName) - : LibraryFeature(parent), - m_pConfig(pConfig), - m_pTrackCollection(pTrackCollection), - m_playlistDao(pTrackCollection->getPlaylistDAO()), - m_trackDao(pTrackCollection->getTrackDAO()), - m_pPlaylistTableModel(NULL), - m_rootViewName(rootViewName) { +BasePlaylistFeature::BasePlaylistFeature(QObject* parent, + ConfigObject* pConfig, + TrackCollection* pTrackCollection, + QString rootViewName) + : LibraryFeature(parent), + m_pConfig(pConfig), + m_pTrackCollection(pTrackCollection), + m_playlistDao(pTrackCollection->getPlaylistDAO()), + m_trackDao(pTrackCollection->getTrackDAO()), + m_pPlaylistTableModel(NULL), + m_rootViewName(rootViewName) { m_pCreatePlaylistAction = new QAction(tr("New Playlist"),this); connect(m_pCreatePlaylistAction, SIGNAL(triggered()), this, SLOT(slotCreatePlaylist())); @@ -96,7 +96,7 @@ void BasePlaylistFeature::activateChild(const QModelIndex& index) { QString playlistName = index.data().toString(); int playlistId = m_playlistDao.getPlaylistIdFromName(playlistName); if (m_pPlaylistTableModel) { - m_pPlaylistTableModel->setPlaylist(playlistId); + m_pPlaylistTableModel->setTableModel(playlistId); emit(showTrackModel(m_pPlaylistTableModel)); } } @@ -337,11 +337,12 @@ void BasePlaylistFeature::slotExportPlaylist() { } // Create a new table model since the main one might have an active search. + // This will only export songs that we think exist on default QScopedPointer pPlaylistTableModel( new PlaylistTableModel(this, m_pTrackCollection, "mixxx.db.model.playlist_export")); - pPlaylistTableModel->setPlaylist(m_pPlaylistTableModel->getPlaylist()); + pPlaylistTableModel->setTableModel(m_pPlaylistTableModel->getPlaylist()); pPlaylistTableModel->setSort(pPlaylistTableModel->fieldIndex(PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder); pPlaylistTableModel->select(); diff --git a/mixxx/src/library/basesqltablemodel.cpp b/mixxx/src/library/basesqltablemodel.cpp index 9d31be5bd8a..77e63cf727d 100644 --- a/mixxx/src/library/basesqltablemodel.cpp +++ b/mixxx/src/library/basesqltablemodel.cpp @@ -1,4 +1,3 @@ -// basesqltablemodel.h // Created by RJ Ryan (rryan@mit.edu) 1/29/2010 #include @@ -20,16 +19,15 @@ const bool sDebug = false; BaseSqlTableModel::BaseSqlTableModel(QObject* pParent, TrackCollection* pTrackCollection, - QSqlDatabase db, QString settingsNamespace) : QAbstractTableModel(pParent), - TrackModel(db, settingsNamespace), - m_currentSearch(""), - m_previewDeckGroup(PlayerManager::groupForPreviewDeck(0)), - m_iPreviewDeckTrackId(-1), + TrackModel(pTrackCollection->getDatabase(), settingsNamespace), m_pTrackCollection(pTrackCollection), m_trackDAO(m_pTrackCollection->getTrackDAO()), - m_database(db) { + m_database(pTrackCollection->getDatabase()), + m_currentSearch(""), + m_previewDeckGroup(PlayerManager::groupForPreviewDeck(0)), + m_iPreviewDeckTrackId(-1) { m_bInitialized = false; m_bDirty = true; m_iSortColumn = 0; @@ -359,7 +357,7 @@ void BaseSqlTableModel::setSearch(const QString& searchText, const QString extra m_bDirty = true; } -void BaseSqlTableModel::search(const QString& searchText, const QString extraFilter) { +void BaseSqlTableModel::search(const QString& searchText, const QString& extraFilter) { if (sDebug) { qDebug() << this << "search" << searchText; } @@ -626,6 +624,10 @@ int BaseSqlTableModel::getTrackId(const QModelIndex& index) const { return index.sibling(index.row(), fieldIndex(m_idColumn)).data().toInt(); } +TrackPointer BaseSqlTableModel::getTrack(const QModelIndex& index) const { + return m_trackDAO.getTrack(getTrackId(index)); +} + QString BaseSqlTableModel::getTrackLocation(const QModelIndex& index) const { if (!index.isValid()) { return ""; diff --git a/mixxx/src/library/basesqltablemodel.h b/mixxx/src/library/basesqltablemodel.h index 212a99b49ab..7bdf7cd021f 100644 --- a/mixxx/src/library/basesqltablemodel.h +++ b/mixxx/src/library/basesqltablemodel.h @@ -1,4 +1,3 @@ -// basesqltablemodel.h // Created by RJ Ryan (rryan@mit.edu) 1/29/2010 #ifndef BASESQLTABLEMODEL_H #define BASESQLTABLEMODEL_H @@ -12,7 +11,6 @@ #include "library/dao/trackdao.h" #include "library/trackcollection.h" #include "library/trackmodel.h" - #include "util.h" // BaseSqlTableModel is a custom-written SQL-backed table which aggressively @@ -22,66 +20,74 @@ class BaseSqlTableModel : public QAbstractTableModel, public TrackModel { public: BaseSqlTableModel(QObject* pParent, TrackCollection* pTrackCollection, - QSqlDatabase db, QString settingsNamespace); + QString settingsNamespace); virtual ~BaseSqlTableModel(); - //////////////////////////////////////////////////////////////////////////// - // Methods implemented from QAbstractItemModel - //////////////////////////////////////////////////////////////////////////// - - virtual void sort(int column, Qt::SortOrder order); - virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - virtual bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); - virtual int columnCount(const QModelIndex& parent=QModelIndex()) const; - virtual int rowCount(const QModelIndex& parent=QModelIndex()) const; - virtual bool setHeaderData(int section, Qt::Orientation orientation, - const QVariant &value, int role=Qt::EditRole); - virtual QVariant headerData(int section, Qt::Orientation orientation, - int role=Qt::DisplayRole) const; - virtual QMimeData* mimeData(const QModelIndexList &indexes) const; + /////////////////////////////////////////////////////////////////////////// + // Functions that have to/can be reimplemented + /////////////////////////////////////////////////////////////////////////// + // This class also has protected variables that should be used in child's + // m_database, m_pTrackCollection, m_trackDAO + + virtual void setTableModel(int id=-1) = 0; + virtual bool isColumnInternal(int column) = 0; + virtual bool isColumnHiddenByDefault(int column) = 0; + virtual TrackModel::CapabilitiesFlags getCapabilities() const = 0; + + // reimplement for external libraries + virtual TrackPointer getTrack(const QModelIndex& index) const; + // calls readWriteFlags() by default, reimplement this if the child calls + // should be readOnly + virtual Qt::ItemFlags flags(const QModelIndex &index) const; //////////////////////////////////////////////////////////////////////////// // Other public methods //////////////////////////////////////////////////////////////////////////// - virtual void search(const QString& searchText, const QString extraFilter=QString()); - virtual void setSearch(const QString& searchText, const QString extraFilter=QString()); - virtual const QString currentSearch() const; - virtual void setSort(int column, Qt::SortOrder order); - virtual int fieldIndex(const QString& fieldName) const; - virtual void select(); - virtual int getTrackId(const QModelIndex& index) const; - virtual QString getTrackLocation(const QModelIndex& index) const; - virtual QAbstractItemDelegate* delegateForColumn(const int i, QObject* pParent); - virtual void hideTracks(const QModelIndexList& indices); // Returns true if the BaseSqlTableModel has been initialized. Calling data // access methods on a BaseSqlTableModel which is not initialized is likely // to cause instability / crashes. bool initialized() const { return m_bInitialized; } + int getTrackId(const QModelIndex& index) const; + void search(const QString& searchText, const QString& extraFilter=QString()); + void setSearch(const QString& searchText, const QString extraFilter=QString()); + const QString currentSearch() const; + void setSort(int column, Qt::SortOrder order); + void hideTracks(const QModelIndexList& indices); + int fieldIndex(const QString& fieldName) const; + void select(); + QString getTrackLocation(const QModelIndex& index) const; + QAbstractItemDelegate* delegateForColumn(const int i, QObject* pParent); + + // Methods reimplemented from QAbstractItemModel + void sort(int column, Qt::SortOrder order); + int rowCount(const QModelIndex& parent=QModelIndex()) const; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); + int columnCount(const QModelIndex& parent=QModelIndex()) const; + bool setHeaderData(int section, Qt::Orientation orientation, + const QVariant &value, int role=Qt::EditRole); + QVariant headerData(int section, Qt::Orientation orientation, + int role=Qt::DisplayRole) const; + virtual QMimeData* mimeData(const QModelIndexList &indexes) const; protected: // Returns the row of trackId in this result set. If trackId is not present, // returns -1. - virtual const QLinkedList getTrackRows(int trackId) const; - - virtual void setTable(const QString& tableName, - const QString& trackIdColumn, - const QStringList& tableColumns, - QSharedPointer trackSource); - QSqlDatabase database() const; + const QLinkedList getTrackRows(int trackId) const; + void setTable(const QString& tableName, const QString& trackIdColumn, + const QStringList& tableColumns, + QSharedPointer trackSource); + void initHeaderData(); - /** Use this if you want a model that is read-only. */ - virtual Qt::ItemFlags readOnlyFlags(const QModelIndex &index) const; - /** Use this if you want a model that can be changed */ - virtual Qt::ItemFlags readWriteFlags(const QModelIndex &index) const; - /** calls readWriteFlags() by default */ - virtual Qt::ItemFlags flags(const QModelIndex &index) const; + // Use this if you want a model that is read-only. + Qt::ItemFlags readOnlyFlags(const QModelIndex &index) const; + // Use this if you want a model that can be changed + Qt::ItemFlags readWriteFlags(const QModelIndex &index) const; - // Set the columns used for searching. Names must correspond to the column - // names in the table provided to setTable. Must be called after setTable is - // called. - virtual QString orderByClause() const; - virtual void initHeaderData(); + TrackCollection* m_pTrackCollection; + TrackDAO& m_trackDAO; + QSqlDatabase m_database; private slots: void tracksChanged(QSet trackIds); @@ -90,6 +96,11 @@ class BaseSqlTableModel : public QAbstractTableModel, public TrackModel { private: inline void setTrackValueForColumn(TrackPointer pTrack, int column, QVariant value); QVariant getBaseValue(const QModelIndex& index, int role = Qt::DisplayRole) const; + // Set the columns used for searching. Names must correspond to the column + // names in the table provided to setTable. Must be called after setTable is + // called. + QString orderByClause() const; + QSqlDatabase database() const; struct RowInfo { int trackId; @@ -106,6 +117,7 @@ class BaseSqlTableModel : public QAbstractTableModel, public TrackModel { return order < other.order; } }; + QVector m_rowInfo; QString m_tableName; QString m_idColumn; @@ -113,29 +125,19 @@ class BaseSqlTableModel : public QAbstractTableModel, public TrackModel { QStringList m_tableColumns; QString m_tableColumnsJoined; QHash m_tableColumnIndex; - int m_iSortColumn; Qt::SortOrder m_eSortOrder; - bool m_bInitialized; bool m_bDirty; QSqlRecord m_queryRecord; - QVector m_rowInfo; QHash m_trackSortOrder; QHash > m_trackIdToRows; - QString m_currentSearch; QString m_currentSearchFilter; - QString m_previewDeckGroup; int m_iPreviewDeckTrackId; - QVector > m_headerInfo; - TrackCollection* m_pTrackCollection; - TrackDAO& m_trackDAO; - QSqlDatabase m_database; - DISALLOW_COPY_AND_ASSIGN(BaseSqlTableModel); }; diff --git a/mixxx/src/library/browse/browsetablemodel.cpp b/mixxx/src/library/browse/browsetablemodel.cpp index 4dab236389d..7ee2132298e 100644 --- a/mixxx/src/library/browse/browsetablemodel.cpp +++ b/mixxx/src/library/browse/browsetablemodel.cpp @@ -124,7 +124,8 @@ const QLinkedList BrowseTableModel::getTrackRows(int trackId) const { return QLinkedList(); } -void BrowseTableModel::search(const QString& searchText) { +void BrowseTableModel::search(const QString& searchText, const QString& extraFilter) { + Q_UNUSED(extraFilter); Q_UNUSED(searchText); } diff --git a/mixxx/src/library/browse/browsetablemodel.h b/mixxx/src/library/browse/browsetablemodel.h index e6248e083aa..8c5a5014fb3 100644 --- a/mixxx/src/library/browse/browsetablemodel.h +++ b/mixxx/src/library/browse/browsetablemodel.h @@ -38,22 +38,23 @@ class BrowseTableModel : public QStandardItemModel, public virtual TrackModel { void setPath(QString absPath); //reimplemented from TrackModel class virtual TrackPointer getTrack(const QModelIndex& index) const; - virtual QString getTrackLocation(const QModelIndex& index) const; - virtual int getTrackId(const QModelIndex& index) const; - TrackModel::CapabilitiesFlags getCapabilities() const; - virtual const QLinkedList getTrackRows(int trackId) const; - virtual void search(const QString& searchText); - virtual void removeTrack(const QModelIndex& index); - virtual void removeTracks(const QModelIndexList& indices); - virtual bool addTrack(const QModelIndex& index, QString location); - virtual QMimeData* mimeData(const QModelIndexList &indexes) const; - virtual const QString currentSearch() const; - virtual bool isColumnInternal(int); - virtual void moveTrack(const QModelIndex&, const QModelIndex&); - virtual bool isColumnHiddenByDefault(int column); - virtual const QList& searchColumns() const; - virtual Qt::ItemFlags flags(const QModelIndex &index) const; - virtual bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); + virtual TrackModel::CapabilitiesFlags getCapabilities() const; + + QString getTrackLocation(const QModelIndex& index) const; + int getTrackId(const QModelIndex& index) const; + const QLinkedList getTrackRows(int trackId) const; + void search(const QString& searchText,const QString& extraFilter=QString()); + void removeTrack(const QModelIndex& index); + void removeTracks(const QModelIndexList& indices); + bool addTrack(const QModelIndex& index, QString location); + QMimeData* mimeData(const QModelIndexList &indexes) const; + const QString currentSearch() const; + bool isColumnInternal(int); + void moveTrack(const QModelIndex&, const QModelIndex&); + bool isColumnHiddenByDefault(int column); + const QList& searchColumns() const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); QAbstractItemDelegate* delegateForColumn(const int i, QObject* pParent); public slots: diff --git a/mixxx/src/library/browse/browsethread.h b/mixxx/src/library/browse/browsethread.h index b1dbcedfb64..0b62a1279f3 100644 --- a/mixxx/src/library/browse/browsethread.h +++ b/mixxx/src/library/browse/browsethread.h @@ -11,15 +11,13 @@ #include #include -/* - * This class is a singleton and represents a thread - * that is used to read ID3 metadata - * from a particular folder. - * - * The BroseTableModel uses this class. - * Note: Don't call getInstance() from places - * other than the GUI thread. - */ +// This class is a singleton and represents a thread +// that is used to read ID3 metadata +// from a particular folder. +// +// The BroseTableModel uses this class. +// Note: Don't call getInstance() from places +// other than the GUI thread. class BrowseTableModel; class BrowseThread : public QThread { diff --git a/mixxx/src/library/cratefeature.cpp b/mixxx/src/library/cratefeature.cpp index ec3195d7b98..44bc349943a 100644 --- a/mixxx/src/library/cratefeature.cpp +++ b/mixxx/src/library/cratefeature.cpp @@ -20,7 +20,8 @@ #include "soundsourceproxy.h" CrateFeature::CrateFeature(QObject* parent, - TrackCollection* pTrackCollection, ConfigObject* pConfig) + TrackCollection* pTrackCollection, + ConfigObject* pConfig) : m_pTrackCollection(pTrackCollection), m_crateDao(pTrackCollection->getCrateDAO()), m_crateTableModel(this, pTrackCollection), @@ -156,7 +157,7 @@ void CrateFeature::activateChild(const QModelIndex& index) { return; QString crateName = index.data().toString(); int crateId = m_crateDao.getCrateIdByName(crateName); - m_crateTableModel.setCrate(crateId); + m_crateTableModel.setTableModel(crateId); emit(showTrackModel(&m_crateTableModel)); } @@ -504,7 +505,7 @@ void CrateFeature::slotExportPlaylist(){ // Create a new table model since the main one might have an active search. QScopedPointer pCrateTableModel( new CrateTableModel(this, m_pTrackCollection)); - pCrateTableModel->setCrate(m_crateTableModel.getCrate()); + pCrateTableModel->setTableModel(m_crateTableModel.getCrate()); pCrateTableModel->select(); if (file_location.endsWith(".csv", Qt::CaseInsensitive)) { @@ -542,7 +543,7 @@ void CrateFeature::slotCrateTableChanged(int crateId) { clearChildModel(); m_lastRightClickedIndex = constructChildModel(crateId); // Switch the view to the crate. - m_crateTableModel.setCrate(crateId); + m_crateTableModel.setTableModel(crateId); // Update selection emit(featureSelect(this, m_lastRightClickedIndex)); } diff --git a/mixxx/src/library/cratetablemodel.cpp b/mixxx/src/library/cratetablemodel.cpp index 835546aa750..4378fd6a5e8 100644 --- a/mixxx/src/library/cratetablemodel.cpp +++ b/mixxx/src/library/cratetablemodel.cpp @@ -4,53 +4,53 @@ #include #include "library/cratetablemodel.h" - -#include "library/dao/cratedao.h" -#include "library/librarytablemodel.h" #include "library/queryutil.h" #include "library/trackcollection.h" #include "mixxxutils.cpp" #include "playermanager.h" -CrateTableModel::CrateTableModel(QObject* pParent, TrackCollection* pTrackCollection) +CrateTableModel::CrateTableModel(QObject* pParent, + TrackCollection* pTrackCollection) : BaseSqlTableModel(pParent, pTrackCollection, - pTrackCollection->getDatabase(), "mixxx.db.model.crate"), - m_pTrackCollection(pTrackCollection), - m_iCrateId(-1) { - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); + m_iCrateId(-1), + m_crateDAO(pTrackCollection->getCrateDAO()) { } CrateTableModel::~CrateTableModel() { } -void CrateTableModel::setCrate(int crateId) { +void CrateTableModel::setTableModel(int crateId) { //qDebug() << "CrateTableModel::setCrate()" << crateId; + if (crateId == m_iCrateId) { + qDebug() << "Already focused on crate " << crateId; + return; + } m_iCrateId = crateId; QString tableName = QString("crate_%1").arg(m_iCrateId); - QSqlQuery query(m_pTrackCollection->getDatabase()); - FieldEscaper escaper(m_pTrackCollection->getDatabase()); + QSqlQuery query(m_database); + FieldEscaper escaper(m_database); + QString filter = "library.mixxx_deleted = 0"; QStringList columns; - columns << CRATETRACKSTABLE_TRACKID + " as " + LIBRARYTABLE_ID + columns << "crate_tracks."+CRATETRACKSTABLE_TRACKID + " as " + LIBRARYTABLE_ID << "'' as preview"; // We drop files that have been explicitly deleted from mixxx // (mixxx_deleted=0) from the view. There was a bug in <= 1.9.0 where - // removed files were not removed from playlists, so some users will have + // removed files were not removed from crates, so some users will have // libraries where this is the case. - QString queryString = QString( - "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS " - "SELECT %2 FROM %3 " - "INNER JOIN library ON library.id = %3.%4 " - "WHERE %3.%5 = %6 AND library.mixxx_deleted = 0") - .arg(escaper.escapeString(tableName), - columns.join(","), - CRATE_TRACKS_TABLE, - CRATETRACKSTABLE_TRACKID, - CRATETRACKSTABLE_CRATEID, - QString::number(crateId)); + QString queryString = QString("CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS " + "SELECT %2 FROM %3 " + "INNER JOIN library ON library.id = %3.%4 " + "WHERE %3.%5 = %6 AND %7") + .arg(escaper.escapeString(tableName), + columns.join(","), + CRATE_TRACKS_TABLE, + CRATETRACKSTABLE_TRACKID, + CRATETRACKSTABLE_CRATEID, + QString::number(crateId), + filter); query.prepare(queryString); if (!query.exec()) { LOG_FAILED_QUERY(query); @@ -103,10 +103,9 @@ int CrateTableModel::addTracks(const QModelIndex& index, fileInfoList.append(QFileInfo(fileLocation)); } - TrackDAO& trackDao = m_pTrackCollection->getTrackDAO(); - QList trackIDs = trackDao.addTracks(fileInfoList, true); + QList trackIDs = m_trackDAO.addTracks(fileInfoList, true); - int tracksAdded = m_pTrackCollection->getCrateDAO().addTracksToCrate( + int tracksAdded = m_crateDAO.addTracksToCrate( trackIDs, m_iCrateId); if (tracksAdded > 0) { select(); @@ -120,58 +119,19 @@ int CrateTableModel::addTracks(const QModelIndex& index, return tracksAdded; } -TrackPointer CrateTableModel::getTrack(const QModelIndex& index) const { - int trackId = getTrackId(index); - return m_pTrackCollection->getTrackDAO().getTrack(trackId); -} - void CrateTableModel::removeTracks(const QModelIndexList& indices) { - CrateDAO& crateDao = m_pTrackCollection->getCrateDAO(); - bool locked = crateDao.isCrateLocked(m_iCrateId); + bool locked = m_crateDAO.isCrateLocked(m_iCrateId); if (!locked) { QList trackIds; foreach (QModelIndex index, indices) { trackIds.append(getTrackId(index)); } - crateDao.removeTracksFromCrate(trackIds, m_iCrateId); + m_crateDAO.removeTracksFromCrate(trackIds, m_iCrateId); select(); } } -void CrateTableModel::removeTrack(const QModelIndex& index) { - CrateDAO& crateDao = m_pTrackCollection->getCrateDAO(); - bool locked = crateDao.isCrateLocked(m_iCrateId); - - if (!locked) { - int trackId = getTrackId(index); - if (m_pTrackCollection->getCrateDAO(). - removeTrackFromCrate(trackId, m_iCrateId)) { - select(); - } else { - // TODO(XXX) feedback - } - } -} - -void CrateTableModel::moveTrack(const QModelIndex& sourceIndex, - const QModelIndex& destIndex) { - Q_UNUSED(sourceIndex); - Q_UNUSED(destIndex); - return; -} - -void CrateTableModel::search(const QString& searchText) { - // qDebug() << "CrateTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void CrateTableModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search( - searchText, LibraryTableModel::DEFAULT_LIBRARYFILTER); -} - bool CrateTableModel::isColumnInternal(int column) { if (column == fieldIndex(LIBRARYTABLE_ID) || column == fieldIndex(CRATETRACKSTABLE_TRACKID) || @@ -206,9 +166,7 @@ TrackModel::CapabilitiesFlags CrateTableModel::getCapabilities() const { | TRACKMODELCAPS_CLEAR_BEATS | TRACKMODELCAPS_RESETPLAYED; - CrateDAO& crateDao = m_pTrackCollection->getCrateDAO(); - bool locked = crateDao.isCrateLocked(m_iCrateId); - + bool locked = m_crateDAO.isCrateLocked(m_iCrateId); if (locked) { caps |= TRACKMODELCAPS_LOCKED; } diff --git a/mixxx/src/library/cratetablemodel.h b/mixxx/src/library/cratetablemodel.h index 0fbd8a0a849..80b57572756 100644 --- a/mixxx/src/library/cratetablemodel.h +++ b/mixxx/src/library/cratetablemodel.h @@ -4,12 +4,8 @@ #ifndef CRATETABLEMODEL_H #define CRATETABLEMODEL_H -#include -#include - #include "library/basesqltablemodel.h" - -class TrackCollection; +#include "library/dao/cratedao.h" class CrateTableModel : public BaseSqlTableModel { Q_OBJECT @@ -17,35 +13,23 @@ class CrateTableModel : public BaseSqlTableModel { CrateTableModel(QObject* parent, TrackCollection* pTrackCollection); virtual ~CrateTableModel(); - void setCrate(int crateId); + void setTableModel(int crateId=-1); int getCrate() const { return m_iCrateId; } // From TrackModel - TrackPointer getTrack(const QModelIndex& index) const; - void search(const QString& searchText); bool isColumnInternal(int column); bool isColumnHiddenByDefault(int column); - void removeTrack(const QModelIndex& index); void removeTracks(const QModelIndexList& indices); - bool addTrack(const QModelIndex& index, QString location); + bool addTrack(const QModelIndex &index, QString location); // Returns the number of unsuccessful track additions - int addTracks(const QModelIndex& index, - const QList &locations); - void moveTrack(const QModelIndex& sourceIndex, - const QModelIndex& destIndex); + int addTracks(const QModelIndex& index,const QList &locations); TrackModel::CapabilitiesFlags getCapabilities() const; - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); - private: - TrackCollection* m_pTrackCollection; int m_iCrateId; + CrateDAO& m_crateDAO; }; #endif /* CRATETABLEMODEL_H */ diff --git a/mixxx/src/library/hiddentablemodel.cpp b/mixxx/src/library/hiddentablemodel.cpp index c2dd7ce9b7f..8c952ac7d64 100644 --- a/mixxx/src/library/hiddentablemodel.cpp +++ b/mixxx/src/library/hiddentablemodel.cpp @@ -1,28 +1,22 @@ -#include -#include -#include -#include "library/trackcollection.h" #include "library/hiddentablemodel.h" -#include "library/librarytablemodel.h" -#include "mixxxutils.cpp" - HiddenTableModel::HiddenTableModel(QObject* parent, TrackCollection* pTrackCollection) - : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), - "mixxx.db.model.missing"), - m_pTrackCollection(pTrackCollection), - m_trackDao(m_pTrackCollection->getTrackDAO()) { + : BaseSqlTableModel(parent,pTrackCollection,"mixxx.db.model.missing") { + setTableModel(); +} + +HiddenTableModel::~HiddenTableModel() { +} +void HiddenTableModel::setTableModel(int id){ + Q_UNUSED(id); QSqlQuery query; QString tableName("hidden_songs"); QStringList columns; columns << "library." + LIBRARYTABLE_ID; - - QString filter("mixxx_deleted"); - + QString filter("mixxx_deleted=1"); query.prepare("CREATE TEMPORARY VIEW IF NOT EXISTS " + tableName + " AS " "SELECT " + columns.join(",") + @@ -36,7 +30,7 @@ HiddenTableModel::HiddenTableModel(QObject* parent, //Print out any SQL error, if there was one. if (query.lastError().isValid()) { - qDebug() << __FILE__ << __LINE__ << query.lastError(); + qDebug() << __FILE__ << __LINE__ << query.lastError(); } QStringList tableColumns; @@ -48,26 +42,6 @@ HiddenTableModel::HiddenTableModel(QObject* parent, setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder); setSearch(""); - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); -} - -HiddenTableModel::~HiddenTableModel() { -} - -bool HiddenTableModel::addTrack(const QModelIndex& index, QString location) { - Q_UNUSED(index); - Q_UNUSED(location); - return false; -} - -TrackPointer HiddenTableModel::getTrack(const QModelIndex& index) const { - //FIXME: use position instead of location for playlist tracks? - - //const int locationColumnIndex = this->fieldIndex(LIBRARYTABLE_LOCATION); - //QString location = index.sibling(index.row(), locationColumnIndex).data().toString(); - int trackId = getTrackId(index); - return m_trackDao.getTrack(trackId); } void HiddenTableModel::purgeTracks(const QModelIndexList& indices) { @@ -78,7 +52,7 @@ void HiddenTableModel::purgeTracks(const QModelIndexList& indices) { trackIds.append(trackId); } - m_trackDao.purgeTracks(trackIds); + m_trackDAO.purgeTracks(trackIds); // TODO(rryan) : do not select, instead route event to BTC and notify from // there. @@ -93,24 +67,13 @@ void HiddenTableModel::unhideTracks(const QModelIndexList& indices) { trackIds.append(trackId); } - m_trackDao.unhideTracks(trackIds); + m_trackDAO.unhideTracks(trackIds); // TODO(rryan) : do not select, instead route event to BTC and notify from // there. select(); //Repopulate the data model. } - -void HiddenTableModel::search(const QString& searchText) { - // qDebug() << "HiddenTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void HiddenTableModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search(searchText); -} - bool HiddenTableModel::isColumnInternal(int column) { if (column == fieldIndex(LIBRARYTABLE_ID) || column == fieldIndex(LIBRARYTABLE_PLAYED) || diff --git a/mixxx/src/library/hiddentablemodel.h b/mixxx/src/library/hiddentablemodel.h index 51d8b37fcbd..4ca9ff55355 100644 --- a/mixxx/src/library/hiddentablemodel.h +++ b/mixxx/src/library/hiddentablemodel.h @@ -3,33 +3,19 @@ #include "library/basesqltablemodel.h" -class TrackCollection; - class HiddenTableModel : public BaseSqlTableModel { Q_OBJECT public: HiddenTableModel(QObject* parent, TrackCollection* pTrackCollection); virtual ~HiddenTableModel(); - TrackPointer getTrack(const QModelIndex& index) const; - void search(const QString& searchText); + + void setTableModel(int id = -1); bool isColumnInternal(int column); bool isColumnHiddenByDefault(int column); void purgeTracks(const QModelIndexList& indices); void unhideTracks(const QModelIndexList& indices); - bool addTrack(const QModelIndex& index, QString location); - Qt::ItemFlags flags(const QModelIndex &index) const; TrackModel::CapabilitiesFlags getCapabilities() const; - - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); - - private: - TrackCollection* m_pTrackCollection; - TrackDAO& m_trackDao; }; #endif diff --git a/mixxx/src/library/library.cpp b/mixxx/src/library/library.cpp index e06decbb579..99ae05def3e 100644 --- a/mixxx/src/library/library.cpp +++ b/mixxx/src/library/library.cpp @@ -60,9 +60,9 @@ Library::Library(QObject* parent, ConfigObject* pConfig, bool first #endif addFeature(new AutoDJFeature(this, pConfig, m_pTrackCollection)); - m_pPlaylistFeature = new PlaylistFeature(this, m_pTrackCollection, pConfig); + m_pPlaylistFeature = new PlaylistFeature(this, m_pTrackCollection, m_pConfig); addFeature(m_pPlaylistFeature); - m_pCrateFeature = new CrateFeature(this, m_pTrackCollection, pConfig); + m_pCrateFeature = new CrateFeature(this, m_pTrackCollection, m_pConfig); addFeature(m_pCrateFeature); addFeature(new BrowseFeature(this, pConfig, m_pTrackCollection, m_pRecordingManager)); addFeature(new RecordingFeature(this, pConfig, m_pTrackCollection, m_pRecordingManager)); diff --git a/mixxx/src/library/librarytablemodel.cpp b/mixxx/src/library/librarytablemodel.cpp index 141124975ed..c68ac5428ca 100644 --- a/mixxx/src/library/librarytablemodel.cpp +++ b/mixxx/src/library/librarytablemodel.cpp @@ -1,30 +1,32 @@ -#include -#include -#include -#include "library/trackcollection.h" #include "library/librarytablemodel.h" #include "library/queryutil.h" #include "mixxxutils.cpp" #include "playermanager.h" const QString LibraryTableModel::DEFAULT_LIBRARYFILTER = - "mixxx_deleted=0 AND fs_deleted=0"; + "mixxx_deleted=0 AND fs_deleted=0"; LibraryTableModel::LibraryTableModel(QObject* parent, TrackCollection* pTrackCollection, QString settingsNamespace) - : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), - settingsNamespace), - m_trackDao(pTrackCollection->getTrackDAO()) { + : BaseSqlTableModel(parent, pTrackCollection, settingsNamespace){ + setTableModel(); +} + +LibraryTableModel::~LibraryTableModel() { +} + +void LibraryTableModel::setTableModel(int id){ + Q_UNUSED(id); QStringList columns; - columns << "library." + LIBRARYTABLE_ID; - columns << "'' as preview"; + columns << "library."+LIBRARYTABLE_ID << "'' as preview"; + + QString tableName = "library_view"; - QSqlQuery query(pTrackCollection->getDatabase()); - QString queryString = "CREATE TEMPORARY VIEW IF NOT EXISTS library_view AS " - "SELECT " + columns.join(",") + + QSqlQuery query(m_pTrackCollection->getDatabase()); + QString queryString = "CREATE TEMPORARY VIEW IF NOT EXISTS "+tableName+" AS " + "SELECT " + columns.join(", ") + " FROM library INNER JOIN track_locations " "ON library.location = track_locations.id " "WHERE (" + LibraryTableModel::DEFAULT_LIBRARYFILTER + ")"; @@ -36,36 +38,16 @@ LibraryTableModel::LibraryTableModel(QObject* parent, QStringList tableColumns; tableColumns << LIBRARYTABLE_ID; tableColumns << "preview"; - setTable("library_view", LIBRARYTABLE_ID, tableColumns, - pTrackCollection->getTrackSource("default")); + setTable(tableName, LIBRARYTABLE_ID, tableColumns, + m_pTrackCollection->getTrackSource("default")); // BaseSqlTabelModel will setup the header info initHeaderData(); setSearch(""); setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder); - - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); } -LibraryTableModel::~LibraryTableModel() { -} - -bool LibraryTableModel::addTrack(const QModelIndex& index, QString location) { - Q_UNUSED(index); - QFileInfo fileInfo(location); - - // Adds track, does not insert duplicates, handles unremoving logic. - int trackId = m_trackDao.addTrack(fileInfo, true); - if (trackId >= 0) { - // TODO(rryan) do not select since we will get a signal. instead, do - // something nice UI wise and select the track they dropped. - select(); //Repopulate the data model. - return true; - } - return false; -} int LibraryTableModel::addTracks(const QModelIndex& index, QList locations) { Q_UNUSED(index); @@ -73,35 +55,11 @@ int LibraryTableModel::addTracks(const QModelIndex& index, QList locati foreach (QString fileLocation, locations) { fileInfoList.append(QFileInfo(fileLocation)); } - QList trackIds = m_trackDao.addTracks(fileInfoList, true); + QList trackIds = m_trackDAO.addTracks(fileInfoList, true); select(); return trackIds.size(); } -TrackPointer LibraryTableModel::getTrack(const QModelIndex& index) const { - int trackId = getTrackId(index); - return m_trackDao.getTrack(trackId); -} - -void LibraryTableModel::moveTrack(const QModelIndex& sourceIndex, - const QModelIndex& destIndex) { - Q_UNUSED(sourceIndex); - Q_UNUSED(destIndex); - // Does nothing because we don't support reordering tracks in the library, - // and getCapabilities() reports that. -} - -void LibraryTableModel::search(const QString& searchText) { - // qDebug() << "LibraryTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void LibraryTableModel::slotSearch(const QString& searchText) { - // qDebug() << "slotSearch()" << searchText << QThread::currentThread(); - BaseSqlTableModel::search(searchText); -} - bool LibraryTableModel::isColumnInternal(int column) { if ((column == fieldIndex(LIBRARYTABLE_ID)) || (column == fieldIndex(LIBRARYTABLE_URL)) || diff --git a/mixxx/src/library/librarytablemodel.h b/mixxx/src/library/librarytablemodel.h index 654b680030b..726e4bda834 100644 --- a/mixxx/src/library/librarytablemodel.h +++ b/mixxx/src/library/librarytablemodel.h @@ -1,14 +1,7 @@ #ifndef LIBRARYTABLEMODEL_H #define LIBRARYTABLEMODEL_H -#include -#include - #include "library/basesqltablemodel.h" -#include "library/trackmodel.h" -#include "library/dao/trackdao.h" - -class TrackCollection; class LibraryTableModel : public BaseSqlTableModel { Q_OBJECT @@ -16,28 +9,14 @@ class LibraryTableModel : public BaseSqlTableModel { LibraryTableModel(QObject* parent, TrackCollection* pTrackCollection, QString settingsNamespace="mixxx.db.model.library"); virtual ~LibraryTableModel(); - - TrackPointer getTrack(const QModelIndex& index) const; - void search(const QString& searchText); + void setTableModel(int id=-1); bool isColumnInternal(int column); bool isColumnHiddenByDefault(int column); - bool addTrack(const QModelIndex& index, QString location); // Takes a list of locations and add the tracks to the library. Returns the // number of successful additions. int addTracks(const QModelIndex& index, QList locations); - void moveTrack(const QModelIndex& sourceIndex, - const QModelIndex& destIndex); TrackModel::CapabilitiesFlags getCapabilities() const; static const QString DEFAULT_LIBRARYFILTER; - - private: - TrackDAO& m_trackDao; - - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); }; #endif diff --git a/mixxx/src/library/missingtablemodel.cpp b/mixxx/src/library/missingtablemodel.cpp index 4e30a06ca21..f704127bede 100644 --- a/mixxx/src/library/missingtablemodel.cpp +++ b/mixxx/src/library/missingtablemodel.cpp @@ -11,12 +11,12 @@ const QString MissingTableModel::MISSINGFILTER = "mixxx_deleted=0 AND fs_deleted MissingTableModel::MissingTableModel(QObject* parent, TrackCollection* pTrackCollection) : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), - "mixxx.db.model.missing"), - m_pTrackCollection(pTrackCollection), - m_trackDao(m_pTrackCollection->getTrackDAO()) { + "mixxx.db.model.missing") { + setTableModel(); +} - QSqlQuery query(pTrackCollection->getDatabase()); +void MissingTableModel::setTableModel(int id) { + QSqlQuery query(m_database); //query.prepare("DROP VIEW " + playlistTableName); //query.exec(); QString tableName("missing_songs"); @@ -49,27 +49,11 @@ MissingTableModel::MissingTableModel(QObject* parent, setDefaultSort(fieldIndex("artist"), Qt::AscendingOrder); setSearch(""); - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); } MissingTableModel::~MissingTableModel() { } -bool MissingTableModel::addTrack(const QModelIndex& index, QString location) { - Q_UNUSED(index); - Q_UNUSED(location); - return false; -} - -TrackPointer MissingTableModel::getTrack(const QModelIndex& index) const { - //FIXME: use position instead of location for playlist tracks? - - //const int locationColumnIndex = this->fieldIndex(LIBRARYTABLE_LOCATION); - //QString location = index.sibling(index.row(), locationColumnIndex).data().toString(); - int trackId = getTrackId(index); - return m_trackDao.getTrack(trackId); -} void MissingTableModel::purgeTracks(const QModelIndexList& indices) { QList trackIds; @@ -79,7 +63,7 @@ void MissingTableModel::purgeTracks(const QModelIndexList& indices) { trackIds.append(trackId); } - m_trackDao.purgeTracks(trackIds); + m_trackDAO.purgeTracks(trackIds); // TODO(rryan) : do not select, instead route event to BTC and notify from // there. @@ -87,16 +71,6 @@ void MissingTableModel::purgeTracks(const QModelIndexList& indices) { } -void MissingTableModel::search(const QString& searchText) { - // qDebug() << "MissingTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void MissingTableModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search(searchText); -} - bool MissingTableModel::isColumnInternal(int column) { if (column == fieldIndex(LIBRARYTABLE_ID) || column == fieldIndex(LIBRARYTABLE_PLAYED) || @@ -114,12 +88,11 @@ bool MissingTableModel::isColumnHiddenByDefault(int column) { return false; } -/** Override flags from BaseSqlModel since we don't want edit this model */ +// Override flags from BaseSqlModel since we don't want edit this model Qt::ItemFlags MissingTableModel::flags(const QModelIndex &index) const { return readOnlyFlags(index); } TrackModel::CapabilitiesFlags MissingTableModel::getCapabilities() const { - return TRACKMODELCAPS_NONE - | TRACKMODELCAPS_PURGE; + return TRACKMODELCAPS_NONE | TRACKMODELCAPS_PURGE; } diff --git a/mixxx/src/library/missingtablemodel.h b/mixxx/src/library/missingtablemodel.h index de55c0bf78e..cb06c672e90 100644 --- a/mixxx/src/library/missingtablemodel.h +++ b/mixxx/src/library/missingtablemodel.h @@ -16,25 +16,15 @@ class MissingTableModel : public BaseSqlTableModel { public: MissingTableModel(QObject* parent, TrackCollection* pTrackCollection); virtual ~MissingTableModel(); - virtual TrackPointer getTrack(const QModelIndex& index) const; - virtual void search(const QString& searchText); - virtual bool isColumnInternal(int column); - virtual bool isColumnHiddenByDefault(int column); - virtual void purgeTracks(const QModelIndexList& indices); - virtual bool addTrack(const QModelIndex& index, QString location); + void setTableModel(int id=-1); + bool isColumnInternal(int column); + bool isColumnHiddenByDefault(int column); + void purgeTracks(const QModelIndexList& indices); Qt::ItemFlags flags(const QModelIndex &index) const; TrackModel::CapabilitiesFlags getCapabilities() const; - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); - private: - TrackCollection* m_pTrackCollection; - TrackDAO& m_trackDao; static const QString MISSINGFILTER; }; diff --git a/mixxx/src/library/playlistfeature.cpp b/mixxx/src/library/playlistfeature.cpp index af232c759d4..fa6df2545aa 100644 --- a/mixxx/src/library/playlistfeature.cpp +++ b/mixxx/src/library/playlistfeature.cpp @@ -179,7 +179,7 @@ void PlaylistFeature::slotPlaylistTableChanged(int playlistId) { if (type != PlaylistDAO::PLHT_UNKNOWN) { // Switch the view to the playlist. - m_pPlaylistTableModel->setPlaylist(playlistId); + m_pPlaylistTableModel->setTableModel(playlistId); // Update selection emit(featureSelect(this, m_lastRightClickedIndex)); } diff --git a/mixxx/src/library/playlisttablemodel.cpp b/mixxx/src/library/playlisttablemodel.cpp index e7f8f734373..40d40decb8f 100644 --- a/mixxx/src/library/playlisttablemodel.cpp +++ b/mixxx/src/library/playlisttablemodel.cpp @@ -1,35 +1,23 @@ -#include -#include -#include -#include -#include "library/trackcollection.h" #include "library/playlisttablemodel.h" #include "library/queryutil.h" #include "mixxxutils.cpp" #include "playermanager.h" PlaylistTableModel::PlaylistTableModel(QObject* parent, - TrackCollection* pTrackCollection, - QString settingsNamespace, - bool showAll) - : BaseSqlTableModel(parent, pTrackCollection, - pTrackCollection->getDatabase(), - settingsNamespace), - m_pTrackCollection(pTrackCollection), - m_playlistDao(m_pTrackCollection->getPlaylistDAO()), - m_trackDao(m_pTrackCollection->getTrackDAO()), - m_iPlaylistId(-1) { - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); - m_showAll = showAll; + TrackCollection* pTrackCollection, + QString settingsNamespace, + bool showAll) + : BaseSqlTableModel(parent, pTrackCollection, settingsNamespace), + m_playlistDao(m_pTrackCollection->getPlaylistDAO()), + m_iPlaylistId(-1), + m_showAll(showAll) { } PlaylistTableModel::~PlaylistTableModel() { } -void PlaylistTableModel::setPlaylist(int playlistId) { +void PlaylistTableModel::setTableModel(int playlistId) { //qDebug() << "PlaylistTableModel::setPlaylist" << playlistId; - if (m_iPlaylistId == playlistId) { qDebug() << "Already focused on playlist " << playlistId; return; @@ -37,8 +25,8 @@ void PlaylistTableModel::setPlaylist(int playlistId) { m_iPlaylistId = playlistId; QString playlistTableName = "playlist_" + QString::number(m_iPlaylistId); - QSqlQuery query(m_pTrackCollection->getDatabase()); - FieldEscaper escaper(m_pTrackCollection->getDatabase()); + QSqlQuery query(m_database); + FieldEscaper escaper(m_database); QStringList columns; columns << PLAYLISTTRACKSTABLE_TRACKID + " as " + LIBRARYTABLE_ID @@ -50,14 +38,13 @@ void PlaylistTableModel::setPlaylist(int playlistId) { // (mixxx_deleted=0) from the view. There was a bug in <= 1.9.0 where // removed files were not removed from playlists, so some users will have // libraries where this is the case. - QString queryString = QString( - "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS " - "SELECT %2 FROM PlaylistTracks " - "INNER JOIN library ON library.id = PlaylistTracks.track_id " - "WHERE PlaylistTracks.playlist_id = %3") - .arg(escaper.escapeString(playlistTableName), - columns.join(","), - QString::number(playlistId)); + QString queryString = QString("CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS " + "SELECT %2 FROM PlaylistTracks " + "INNER JOIN library ON library.id = PlaylistTracks.track_id " + "WHERE PlaylistTracks.playlist_id = %3") + .arg(escaper.escapeString(playlistTableName), + columns.join(","), + QString::number(playlistId)); if (!m_showAll) { queryString.append(" AND library.mixxx_deleted = 0"); } @@ -76,45 +63,6 @@ void PlaylistTableModel::setPlaylist(int playlistId) { setSort(defaultSortColumn(), defaultSortOrder()); } -bool PlaylistTableModel::addTrack(const QModelIndex& index, QString location) { - const int positionColumn = fieldIndex(PLAYLISTTRACKSTABLE_POSITION); - int position = index.sibling(index.row(), positionColumn).data().toInt(); - - // Handle weird cases like a drag-and-drop to an invalid index - if (position <= 0) { - position = rowCount() + 1; - } - - // If a track is dropped but it isn't in the library, then add it because - // the user probably dropped a file from outside Mixxx into this playlist. - QFileInfo fileInfo(location); - - // Adds track, does not insert duplicates, handles unremoving logic. - int trackId = m_trackDao.addTrack(fileInfo, true); - - // Do nothing if the location still isn't in the database. - if (trackId < 0) { - return false; - } - - m_playlistDao.insertTrackIntoPlaylist(trackId, m_iPlaylistId, position); - - // TODO(rryan) signal an add to the base, don't select - select(); //Repopulate the data model. - return true; -} - -bool PlaylistTableModel::appendTrack(int trackId) { - if (trackId < 0) { - return false; - } - - bool bSuccess = m_playlistDao.appendTrackToPlaylist(trackId, m_iPlaylistId); - - select(); //Repopulate the data model. - return bSuccess; -} - int PlaylistTableModel::addTracks(const QModelIndex& index, QList locations) { const int positionColumn = fieldIndex(PLAYLISTTRACKSTABLE_POSITION); int position = index.sibling(index.row(), positionColumn).data().toInt(); @@ -129,7 +77,7 @@ int PlaylistTableModel::addTracks(const QModelIndex& index, QList locat fileInfoList.append(QFileInfo(fileLocation)); } - QList trackIds = m_trackDao.addTracks(fileInfoList, true); + QList trackIds = m_trackDAO.addTracks(fileInfoList, true); int tracksAdded = m_playlistDao.insertTracksIntoPlaylist( trackIds, m_iPlaylistId, position); @@ -144,13 +92,15 @@ int PlaylistTableModel::addTracks(const QModelIndex& index, QList locat return tracksAdded; } -TrackPointer PlaylistTableModel::getTrack(const QModelIndex& index) const { - //FIXME: use position instead of location for playlist tracks? +bool PlaylistTableModel::appendTrack(int trackId) { + if (trackId < 0) { + return false; + } + + m_playlistDao.appendTrackToPlaylist(trackId, m_iPlaylistId); - //const int locationColumnIndex = this->fieldIndex(LIBRARYTABLE_LOCATION); - //QString location = index.sibling(index.row(), locationColumnIndex).data().toString(); - int trackId = getTrackId(index); - return m_trackDao.getTrack(trackId); + select(); //Repopulate the data model. + return true; } void PlaylistTableModel::removeTrack(const QModelIndex& index) { @@ -226,18 +176,17 @@ void PlaylistTableModel::moveTrack(const QModelIndex& sourceIndex, //Insert the song into the PlaylistTracks table - /** ALGORITHM for code below - Case 1: destination < source (newPos < oldPos) - 1) Set position = -1 where pos=source -- Gives that track a dummy index to keep stuff simple. - 2) Decrement position where pos > source - 3) increment position where pos > dest - 4) Set position = dest where pos=-1 -- Move track from dummy pos to final destination. + // ALGORITHM for code below + // Case 1: destination < source (newPos < oldPos) + // 1) Set position = -1 where pos=source -- Gives that track a dummy index to keep stuff simple. + // 2) Decrement position where pos > source + // 3) increment position where pos > dest + // 4) Set position = dest where pos=-1 -- Move track from dummy pos to final destination. - Case 2: destination > source (newPos > oldPos) - 1) Set position=-1 where pos=source -- Give track a dummy index again. - 2) Decrement position where pos > source AND pos <= dest - 3) Set postion=dest where pos=-1 -- Move that track from dummy pos to final destination - */ + // Case 2: destination > source (newPos > oldPos) + // 1) Set position=-1 where pos=source -- Give track a dummy index again. + // 2) Decrement position where pos > source AND pos <= dest + // 3) Set postion=dest where pos=-1 -- Move that track from dummy pos to final destination QString queryString; if (newPosition < oldPosition) { @@ -266,9 +215,7 @@ void PlaylistTableModel::moveTrack(const QModelIndex& sourceIndex, "playlist_id=%2").arg(QString::number(newPosition), QString::number(m_iPlaylistId)); query.exec(queryString); - } - else if (newPosition > oldPosition) - { + } else if (newPosition > oldPosition) { queryString = QString("UPDATE PlaylistTracks SET position=-1 " "WHERE position = %1 AND " "playlist_id=%2").arg(QString::number(oldPosition), @@ -311,8 +258,7 @@ void PlaylistTableModel::shuffleTracks(const QModelIndex& shuffleStartIndex) { ScopedTransaction transaction(m_pTrackCollection->getDatabase()); // This is a simple Fisher-Yates shuffling algorithm - for (int i=numOfTracks-1; i >= shuffleStartRow; i--) - { + for (int i = numOfTracks-1; i >= shuffleStartRow; --i) { int oldPosition = index(i, positionColumnIndex).data().toInt(); int random = int(qrand() / (RAND_MAX + 1.0) * (numOfTracks - shuffleStartRow) + shuffleStartRow + 1); qDebug() << "Swapping tracks " << oldPosition << " and " << random; @@ -336,17 +282,6 @@ void PlaylistTableModel::shuffleTracks(const QModelIndex& shuffleStartIndex) { select(); } -void PlaylistTableModel::search(const QString& searchText) { - // qDebug() << "PlaylistTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void PlaylistTableModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search( - searchText, LibraryTableModel::DEFAULT_LIBRARYFILTER); -} - bool PlaylistTableModel::isColumnInternal(int column) { if (column == fieldIndex(LIBRARYTABLE_ID) || column == fieldIndex(PLAYLISTTRACKSTABLE_TRACKID) || @@ -359,11 +294,11 @@ bool PlaylistTableModel::isColumnInternal(int column) { } return false; } + bool PlaylistTableModel::isColumnHiddenByDefault(int column) { if (column == fieldIndex(LIBRARYTABLE_KEY)) { return true; - } - if (column == fieldIndex(PLAYLISTTRACKSTABLE_DATETIMEADDED)) { + } else if (column == fieldIndex(PLAYLISTTRACKSTABLE_DATETIMEADDED)) { return true; } return false; @@ -388,9 +323,7 @@ TrackModel::CapabilitiesFlags PlaylistTableModel::getCapabilities() const { if (m_iPlaylistId != m_playlistDao.getPlaylistIdFromName(AUTODJ_TABLE)) { caps |= TRACKMODELCAPS_ADDTOAUTODJ; } - bool locked = m_playlistDao.isPlaylistLocked(m_iPlaylistId); - if (locked) { caps |= TRACKMODELCAPS_LOCKED; } diff --git a/mixxx/src/library/playlisttablemodel.h b/mixxx/src/library/playlisttablemodel.h index 3e7a39a7160..47954331f49 100644 --- a/mixxx/src/library/playlisttablemodel.h +++ b/mixxx/src/library/playlisttablemodel.h @@ -1,54 +1,37 @@ #ifndef PLAYLISTTABLEMODEL_H #define PLAYLISTTABLEMODEL_H -#include -#include -#include - #include "library/basesqltablemodel.h" #include "library/dao/playlistdao.h" -#include "library/dao/trackdao.h" -#include "library/librarytablemodel.h" - -class TrackCollection; class PlaylistTableModel : public BaseSqlTableModel { Q_OBJECT public: PlaylistTableModel(QObject* parent, TrackCollection* pTrackCollection, - QString settingsNamespace,bool showAll=false); + QString settingsNamespace, bool showAll=false); virtual ~PlaylistTableModel(); - void setPlaylist(int playlistId); + void setTableModel(int playlistId = -1); + int getPlaylist() const { return m_iPlaylistId; } - virtual TrackPointer getTrack(const QModelIndex& index) const; - virtual void search(const QString& searchText); - virtual bool isColumnInternal(int column); - virtual bool isColumnHiddenByDefault(int column); - virtual void removeTrack(const QModelIndex& index); - virtual void removeTracks(const QModelIndexList& indices); - virtual bool addTrack(const QModelIndex& index, QString location); - virtual bool appendTrack(int trackId); + bool isColumnInternal(int column); + bool isColumnHiddenByDefault(int column); + // This function should only be used by AUTODJ + void removeTrack(const QModelIndex& index); + void removeTracks(const QModelIndexList& indices); // Adding multiple tracks at one to a playlist. Returns the number of // successful additions. - virtual int addTracks(const QModelIndex& index, QList locations); - virtual void moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex); - virtual void shuffleTracks(const QModelIndex& shuffleStartIndex); - + int addTracks(const QModelIndex& index, QList locations); + bool appendTrack(int trackId); + void moveTrack(const QModelIndex& sourceIndex, + const QModelIndex& destIndex); + void shuffleTracks(const QModelIndex& shuffleStartIndex); TrackModel::CapabilitiesFlags getCapabilities() const; - private slots: - void slotSearch(const QString& searchText); - - signals: - void doSearch(const QString& searchText); - private: - TrackCollection* m_pTrackCollection; PlaylistDAO& m_playlistDao; - TrackDAO& m_trackDao; int m_iPlaylistId; bool m_showAll; }; diff --git a/mixxx/src/library/preparelibrarytablemodel.cpp b/mixxx/src/library/preparelibrarytablemodel.cpp index 935c7707be9..b567fa21c9f 100644 --- a/mixxx/src/library/preparelibrarytablemodel.cpp +++ b/mixxx/src/library/preparelibrarytablemodel.cpp @@ -12,24 +12,12 @@ PrepareLibraryTableModel::PrepareLibraryTableModel(QObject* parent, m_bShowRecentSongs = true; setSearch("", RECENT_FILTER); - connect(this, SIGNAL(doSearch(const QString&)), - this, SLOT(slotSearch(const QString&))); } PrepareLibraryTableModel::~PrepareLibraryTableModel() { } -void PrepareLibraryTableModel::search(const QString& searchText) { - // qDebug() << "PrepareLibraryTableModel::search()" << searchText - // << QThread::currentThread(); - emit(doSearch(searchText)); -} - -void PrepareLibraryTableModel::slotSearch(const QString& searchText) { - BaseSqlTableModel::search(searchText, - m_bShowRecentSongs ? RECENT_FILTER : QString()); -} void PrepareLibraryTableModel::showRecentSongs() { m_bShowRecentSongs = true; diff --git a/mixxx/src/library/preparelibrarytablemodel.h b/mixxx/src/library/preparelibrarytablemodel.h index 2b53e5ab6e1..2077acc7583 100644 --- a/mixxx/src/library/preparelibrarytablemodel.h +++ b/mixxx/src/library/preparelibrarytablemodel.h @@ -8,18 +8,13 @@ class PrepareLibraryTableModel : public LibraryTableModel { Q_OBJECT public: - PrepareLibraryTableModel(QObject* parent, TrackCollection* pTrackCollection); + PrepareLibraryTableModel(QObject* parent, + TrackCollection* pTrackCollection); virtual ~PrepareLibraryTableModel(); - virtual void search(const QString& searchText); - public slots: void showRecentSongs(); void showAllSongs(); - private slots: - void slotSearch(const QString& searchText); - signals: - void doSearch(const QString& searchText); private: bool m_bShowRecentSongs; }; diff --git a/mixxx/src/library/proxytrackmodel.cpp b/mixxx/src/library/proxytrackmodel.cpp index 468e1280ef5..af7262c051c 100644 --- a/mixxx/src/library/proxytrackmodel.cpp +++ b/mixxx/src/library/proxytrackmodel.cpp @@ -40,7 +40,8 @@ QString ProxyTrackModel::getTrackLocation(const QModelIndex& index) const { return m_pTrackModel->getTrackLocation(indexSource); } -void ProxyTrackModel::search(const QString& searchText) { +void ProxyTrackModel::search(const QString& searchText, const QString& extraFilter) { + Q_UNUSED(extraFilter); if (m_bHandleSearches) { m_currentSearch = searchText; setFilterFixedString(searchText); @@ -64,10 +65,6 @@ bool ProxyTrackModel::isColumnHiddenByDefault(int column) { return m_pTrackModel->isColumnHiddenByDefault(column); } -void ProxyTrackModel::removeTrack(const QModelIndex& index) { - QModelIndex indexSource = mapToSource(index); - m_pTrackModel->removeTrack(indexSource); -} void ProxyTrackModel::removeTracks(const QModelIndexList& indices) { QModelIndexList translatedList; @@ -78,11 +75,6 @@ void ProxyTrackModel::removeTracks(const QModelIndexList& indices) { m_pTrackModel->removeTracks(translatedList); } -bool ProxyTrackModel::addTrack(const QModelIndex& index, QString location) { - QModelIndex indexSource = mapToSource(index); - return m_pTrackModel->addTrack(indexSource, location); -} - void ProxyTrackModel::moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex) { QModelIndex sourceIndexSource = mapToSource(sourceIndex); diff --git a/mixxx/src/library/proxytrackmodel.h b/mixxx/src/library/proxytrackmodel.h index 05d73cca91c..6b7731c62fe 100644 --- a/mixxx/src/library/proxytrackmodel.h +++ b/mixxx/src/library/proxytrackmodel.h @@ -16,7 +16,7 @@ // calling the composed TrackModel. If the bHandleSearches flag is set, the // TrackModel search calls will not be delivered to the composed TrackModel // because filtering is handled by the QSortFilterProxyModel. -class ProxyTrackModel : public QSortFilterProxyModel, public virtual TrackModel { +class ProxyTrackModel : public QSortFilterProxyModel, public TrackModel { public: // Construct a new ProxyTrackModel with pTrackModel as the TrackModel it // composes. If bHandleSearches is true, then search signals will not be @@ -29,15 +29,14 @@ class ProxyTrackModel : public QSortFilterProxyModel, public virtual TrackModel virtual QString getTrackLocation(const QModelIndex& index) const; virtual int getTrackId(const QModelIndex& index) const; virtual const QLinkedList getTrackRows(int trackId) const; - virtual void search(const QString& searchText); + virtual void search(const QString& searchText,const QString& extraFilter=QString()); virtual const QString currentSearch() const; virtual bool isColumnInternal(int column); virtual bool isColumnHiddenByDefault(int column); - virtual void removeTrack(const QModelIndex& index); virtual void removeTracks(const QModelIndexList& indices); - virtual bool addTrack(const QModelIndex& index, QString location); virtual void moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex); + void deleteTracks(const QModelIndexList& indices); virtual QAbstractItemDelegate* delegateForColumn(const int i, QObject* pParent); virtual TrackModel::CapabilitiesFlags getCapabilities() const; diff --git a/mixxx/src/library/setlogfeature.cpp b/mixxx/src/library/setlogfeature.cpp index dea38419ed8..69a78ce2e8e 100644 --- a/mixxx/src/library/setlogfeature.cpp +++ b/mixxx/src/library/setlogfeature.cpp @@ -17,8 +17,7 @@ SetlogFeature::SetlogFeature(QObject* parent, ConfigObject* pConfig, TrackCollection* pTrackCollection) - : BasePlaylistFeature(parent, pConfig, pTrackCollection, - "SETLOGHOME") { + : BasePlaylistFeature(parent, pConfig, pTrackCollection, "SETLOGHOME") { m_pPlaylistTableModel = new PlaylistTableModel(this, pTrackCollection, "mixxx.db.model.setlog", true);//show all tracks @@ -181,7 +180,7 @@ void SetlogFeature::slotJoinWithPrevious() { int previousPlaylistId = m_playlistDao.getPreviousPlaylist(currentPlaylistId, PlaylistDAO::PLHT_SET_LOG); if (previousPlaylistId >= 0) { - m_pPlaylistTableModel->setPlaylist(previousPlaylistId); + m_pPlaylistTableModel->setTableModel(previousPlaylistId); if (currentPlaylistId == m_playlistId) { // mark all the Tracks in the previous Playlist as played @@ -277,7 +276,7 @@ void SetlogFeature::slotPlaylistTableChanged(int playlistId) { if (type != PlaylistDAO::PLHT_UNKNOWN) { // Switch the view to the playlist. - m_pPlaylistTableModel->setPlaylist(playlistId); + m_pPlaylistTableModel->setTableModel(playlistId); // Update selection emit(featureSelect(this, m_lastRightClickedIndex)); } diff --git a/mixxx/src/library/trackmodel.h b/mixxx/src/library/trackmodel.h index 1e002ce398a..8a930f01218 100644 --- a/mixxx/src/library/trackmodel.h +++ b/mixxx/src/library/trackmodel.h @@ -37,15 +37,14 @@ class TrackModel { TRACKMODELCAPS_LOADTOSAMPLER = 0x00100, TRACKMODELCAPS_LOADTOPREVIEWDECK = 0x00200, TRACKMODELCAPS_REMOVE = 0x00400, - TRACKMODELCAPS_RELOCATE = 0x00800, - TRACKMODELCAPS_BPMLOCK = 0x01000, - TRACKMODELCAPS_CLEAR_BEATS = 0x02000, - TRACKMODELCAPS_RESETPLAYED = 0x04000, - TRACKMODELCAPS_HIDE = 0x08000, - TRACKMODELCAPS_UNHIDE = 0x10000, - TRACKMODELCAPS_PURGE = 0x20000 + TRACKMODELCAPS_BPMLOCK = 0x00800, + TRACKMODELCAPS_CLEAR_BEATS = 0x01000, + TRACKMODELCAPS_RESETPLAYED = 0x02000, + TRACKMODELCAPS_HIDE = 0x04000, + TRACKMODELCAPS_UNHIDE = 0x08000, + TRACKMODELCAPS_PURGE = 0x10000, + TRACKMODELCAPS_DELETEFS = 0x20000 }; - typedef int CapabilitiesFlags; /** Enables us to do ORing */ // Deserialize and return the track at the given QModelIndex in this result @@ -63,7 +62,7 @@ class TrackModel { virtual const QLinkedList getTrackRows(int trackId) const = 0; bool isTrackModel() { return true;} - virtual void search(const QString& searchText) = 0; + virtual void search(const QString& searchText, const QString& extraFilter=QString()) = 0; virtual const QString currentSearch() const = 0; virtual bool isColumnInternal(int column) = 0; // if no header state exists, we may hide some columns so that the user can @@ -71,9 +70,7 @@ class TrackModel { virtual bool isColumnHiddenByDefault(int column) = 0; virtual const QList& showableColumns() const { return m_emptyColumns; } virtual const QList& searchColumns() const { return m_emptyColumns; } - virtual void removeTrack(const QModelIndex& index) { - Q_UNUSED(index); - } + virtual void removeTracks(const QModelIndexList& indices) { Q_UNUSED(indices); } @@ -86,11 +83,6 @@ class TrackModel { virtual void purgeTracks(const QModelIndexList& indices) { Q_UNUSED(indices); } - virtual bool addTrack(const QModelIndex& index, QString location) { - Q_UNUSED(index); - Q_UNUSED(location); - return false; - } virtual int addTracks(const QModelIndex& index, QList locations) { Q_UNUSED(index); Q_UNUSED(locations); @@ -136,7 +128,10 @@ class TrackModel { virtual int fieldIndex(const QString& fieldName) const { Q_UNUSED(fieldName); - return 0; + return -1; + } + + virtual void select() { } private: