![]() |
Mixxx
|
00001 // basesqltablemodel.h 00002 // Created by RJ Ryan (rryan@mit.edu) 1/29/2010 00003 #ifndef BASESQLTABLEMODEL_H 00004 #define BASESQLTABLEMODEL_H 00005 00006 #include <QtCore> 00007 #include <QHash> 00008 #include <QtGui> 00009 #include <QtSql> 00010 00011 #include "library/basetrackcache.h" 00012 #include "library/dao/trackdao.h" 00013 #include "library/trackcollection.h" 00014 #include "library/trackmodel.h" 00015 00016 #include "util.h" 00017 00018 // BaseSqlTableModel is a custom-written SQL-backed table which aggressively 00019 // caches the contents of the table and supports lightweight updates. 00020 class BaseSqlTableModel : public QAbstractTableModel, public TrackModel { 00021 Q_OBJECT 00022 public: 00023 BaseSqlTableModel(QObject* pParent, 00024 TrackCollection* pTrackCollection, 00025 QSqlDatabase db, QString settingsNamespace); 00026 virtual ~BaseSqlTableModel(); 00027 00029 // Methods implemented from QAbstractItemModel 00031 00032 virtual void sort(int column, Qt::SortOrder order); 00033 virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; 00034 virtual bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); 00035 virtual int columnCount(const QModelIndex& parent=QModelIndex()) const; 00036 virtual int rowCount(const QModelIndex& parent=QModelIndex()) const; 00037 virtual bool setHeaderData(int section, Qt::Orientation orientation, 00038 const QVariant &value, int role=Qt::EditRole); 00039 virtual QVariant headerData(int section, Qt::Orientation orientation, 00040 int role=Qt::DisplayRole) const; 00041 virtual QMimeData* mimeData(const QModelIndexList &indexes) const; 00042 00044 // Other public methods 00046 00047 virtual void search(const QString& searchText, const QString extraFilter=QString()); 00048 virtual void setSearch(const QString& searchText, const QString extraFilter=QString()); 00049 virtual const QString currentSearch() const; 00050 virtual void setSort(int column, Qt::SortOrder order); 00051 virtual int fieldIndex(const QString& fieldName) const; 00052 virtual void select(); 00053 virtual int getTrackId(const QModelIndex& index) const; 00054 virtual QString getTrackLocation(const QModelIndex& index) const; 00055 00056 protected: 00057 // Returns the row of trackId in this result set. If trackId is not present, 00058 // returns -1. 00059 virtual const QLinkedList<int> getTrackRows(int trackId) const; 00060 00061 virtual void setTable(const QString& tableName, 00062 const QString& trackIdColumn, 00063 const QStringList& tableColumns, 00064 QSharedPointer<BaseTrackCache> trackSource); 00065 QSqlDatabase database() const; 00066 00068 virtual Qt::ItemFlags readOnlyFlags(const QModelIndex &index) const; 00070 virtual Qt::ItemFlags readWriteFlags(const QModelIndex &index) const; 00072 virtual Qt::ItemFlags flags(const QModelIndex &index) const; 00073 00074 // Set the columns used for searching. Names must correspond to the column 00075 // names in the table provided to setTable. Must be called after setTable is 00076 // called. 00077 virtual QString orderByClause() const; 00078 virtual void initHeaderData(); 00079 00080 private slots: 00081 void tracksChanged(QSet<int> trackIds); 00082 00083 private: 00084 inline void setTrackValueForColumn(TrackPointer pTrack, int column, QVariant value); 00085 QVariant getBaseValue(const QModelIndex& index, int role = Qt::DisplayRole) const; 00086 00087 struct RowInfo { 00088 int trackId; 00089 int order; 00090 QHash<int, QVariant> metadata; 00091 00092 bool operator<(const RowInfo& other) const { 00093 // -1 is greater than anything 00094 if (order == -1) { 00095 return false; 00096 } else if (other.order == -1) { 00097 return true; 00098 } 00099 return order < other.order; 00100 } 00101 }; 00102 00103 QString m_tableName; 00104 QString m_idColumn; 00105 QSharedPointer<BaseTrackCache> m_trackSource; 00106 QStringList m_tableColumns; 00107 QString m_tableColumnsJoined; 00108 QHash<QString, int> m_tableColumnIndex; 00109 00110 int m_iSortColumn; 00111 Qt::SortOrder m_eSortOrder; 00112 00113 bool m_bInitialized; 00114 bool m_bDirty; 00115 QSqlRecord m_queryRecord; 00116 QVector<RowInfo> m_rowInfo; 00117 QHash<int, int> m_trackSortOrder; 00118 QHash<int, QLinkedList<int> > m_trackIdToRows; 00119 00120 QString m_currentSearch; 00121 QString m_currentSearchFilter; 00122 00123 QVector<QHash<int, QVariant> > m_headerInfo; 00124 00125 TrackCollection* m_pTrackCollection; 00126 TrackDAO& m_trackDAO; 00127 QSqlDatabase m_database; 00128 00129 DISALLOW_COPY_AND_ASSIGN(BaseSqlTableModel); 00130 }; 00131 00132 #endif /* BASESQLTABLEMODEL_H */