Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/basesqltablemodel.h

Go to the documentation of this file.
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 */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines