11
#include "library/basetrackcache.h"
12
#include "library/dao/trackdao.h"
11
13
#include "library/trackcollection.h"
12
#include "library/dao/trackdao.h"
14
#include "library/trackmodel.h"
14
18
// BaseSqlTableModel is a custom-written SQL-backed table which aggressively
15
19
// caches the contents of the table and supports lightweight updates.
16
class BaseSqlTableModel : public QAbstractTableModel {
20
class BaseSqlTableModel : public QAbstractTableModel, public TrackModel {
19
23
BaseSqlTableModel(QObject* pParent,
20
24
TrackCollection* pTrackCollection,
25
QSqlDatabase db, QString settingsNamespace);
22
26
virtual ~BaseSqlTableModel();
24
28
////////////////////////////////////////////////////////////////////////////
34
38
const QVariant &value, int role=Qt::EditRole);
35
39
virtual QVariant headerData(int section, Qt::Orientation orientation,
36
40
int role=Qt::DisplayRole) const;
41
virtual QMimeData* mimeData(const QModelIndexList &indexes) const;
38
43
////////////////////////////////////////////////////////////////////////////
39
44
// Other public methods
40
45
////////////////////////////////////////////////////////////////////////////
42
47
virtual void search(const QString& searchText, const QString extraFilter=QString());
43
virtual QString currentSearch() const;
48
virtual void setSearch(const QString& searchText, const QString extraFilter=QString());
49
virtual const QString currentSearch() const;
44
50
virtual void setSort(int column, Qt::SortOrder order);
45
51
virtual int fieldIndex(const QString& fieldName) const;
46
52
virtual void select();
53
virtual int getTrackId(const QModelIndex& index) const;
54
virtual QString getTrackLocation(const QModelIndex& index) const;
49
57
// Returns the row of trackId in this result set. If trackId is not present,
51
59
virtual const QLinkedList<int> getTrackRows(int trackId) const;
53
61
virtual void setTable(const QString& tableName,
54
const QStringList& columnNames,
55
const QString& idColumn,
56
const QStringList tableColumns = QStringList());
58
virtual void buildIndex();
62
const QString& trackIdColumn,
63
const QStringList& tableColumns,
64
QSharedPointer<BaseTrackCache> trackSource);
59
65
QSqlDatabase database() const;
61
67
/** Use this if you want a model that is read-only. */
68
74
// Set the columns used for searching. Names must correspond to the column
69
75
// names in the table provided to setTable. Must be called after setTable is
71
virtual void setSearchColumns(const QStringList& searchColumns);
72
77
virtual QString orderByClause() const;
73
virtual QString filterClause() const;
74
78
virtual void initHeaderData();
75
void setCaching(bool isActive);
76
virtual void initDefaultSearchColumns();
78
virtual void updateTrackInIndex(int trackId);
79
virtual void updateTracksInIndex(QList<int> trackIds);
82
void trackChanged(int trackId);
83
void trackClean(int trackId);
81
void tracksChanged(QSet<int> trackIds);
86
inline TrackPointer lookupCachedTrack(int trackId) const;
87
inline QVariant getTrackValueForColumn(TrackPointer pTrack, int column) const;
88
inline QVariant getTrackValueForColumn(int trackId, int column,
89
TrackPointer pTrack=TrackPointer()) const;
90
84
inline void setTrackValueForColumn(TrackPointer pTrack, int column, QVariant value);
91
85
QVariant getBaseValue(const QModelIndex& index, int role = Qt::DisplayRole) const;
93
virtual int compareColumnValues(int iColumnNumber, Qt::SortOrder eSortOrder, QVariant val1, QVariant val2);
94
virtual int findSortInsertionPoint(int trackId, TrackPointer pTrack,
95
const QVector<QPair<int, QHash<int, QVariant> > >& rowInfo);
90
QHash<int, QVariant> metadata;
92
bool operator<(const RowInfo& other) const {
93
// -1 is greater than anything
96
} else if (other.order == -1) {
99
return order < other.order;
97
103
QString m_tableName;
98
QStringList m_columnNames;
99
QString m_columnNamesJoined;
100
QHash<QString, int> m_columnIndex;
101
QSet<QString> m_tableColumns;
105
QSharedPointer<BaseTrackCache> m_trackSource;
106
QStringList m_tableColumns;
102
107
QString m_tableColumnsJoined;
103
QSet<int> m_tableColumnIndices;
105
QStringList m_searchColumns;
106
QVector<int> m_searchColumnIndices;
108
QHash<QString, int> m_tableColumnIndex;
109
110
int m_iSortColumn;
110
111
Qt::SortOrder m_eSortOrder;
112
113
bool m_bInitialized;
114
115
QSqlRecord m_queryRecord;
115
QHash<int, QVector<QVariant> > m_recordCache;
116
QVector<QPair<int, QHash<int, QVariant> > > m_rowInfo;
116
QVector<RowInfo> m_rowInfo;
117
QHash<int, int> m_trackSortOrder;
117
118
QHash<int, QLinkedList<int> > m_trackIdToRows;
118
QSet<int> m_trackOverrides;
120
120
QString m_currentSearch;
121
121
QString m_currentSearchFilter;