15 #include <KDABLibFakes>
20 : QSortFilterProxyModel(parent)
37 Q_ASSERT_X(sourceModel(),
"DatasetProxyModel::setDatasetRowDescriptionVector",
38 "A source model must be set before the selection can be configured.");
39 initializeDatasetDecriptors(configuration, sourceModel()->rowCount(mRootIndex),
40 mRowSrcToProxyMap, mRowProxyToSrcMap);
47 Q_ASSERT_X(sourceModel(),
"DatasetProxyModel::setDatasetColumnDescriptionVector",
48 "A source model must be set before the selection can be configured.");
49 initializeDatasetDecriptors(configuration, sourceModel()->columnCount(mRootIndex),
50 mColSrcToProxyMap, mColProxyToSrcMap);
63 const QModelIndex &parent)
const
66 mapProxyColumnToSource(column),
78 Q_ASSERT_X(sourceModel(),
"DatasetProxyModel::mapFromSource",
"A source "
79 "model must be set before the selection can be configured.");
81 if (!sourceIndex.isValid())
84 if (mRowSrcToProxyMap.isEmpty() && mColSrcToProxyMap.isEmpty()) {
85 return createIndex(sourceIndex.row(), sourceIndex.column(),
86 sourceIndex.internalPointer());
88 int row = mapSourceRowToProxy(sourceIndex.row());
89 int column = mapSourceColumnToProxy(sourceIndex.column());
90 return createIndex(row, column, sourceIndex.internalPointer());
96 Q_ASSERT_X(sourceModel(),
"DatasetProxyModel::mapToSource",
"A source "
97 "model must be set before the selection can be configured.");
99 if (!proxyIndex.isValid())
101 if (mRowSrcToProxyMap.isEmpty() && mColSrcToProxyMap.isEmpty()) {
102 return sourceModel()->index(proxyIndex.row(), proxyIndex.column(), mRootIndex);
104 int row = mapProxyRowToSource(proxyIndex.row());
105 int column = mapProxyColumnToSource(proxyIndex.column());
106 return sourceModel()->index(row, column, mRootIndex);
111 const QModelIndex &)
const
113 if (mRowSrcToProxyMap.isEmpty()) {
116 Q_ASSERT(sourceModel());
117 Q_ASSERT(mRowSrcToProxyMap.size() == sourceModel()->rowCount(mRootIndex));
118 if (mRowSrcToProxyMap[sourceRow] == -1) {
121 Q_ASSERT(mRowSrcToProxyMap[sourceRow] >= 0
122 && mRowSrcToProxyMap[sourceRow] < mRowSrcToProxyMap.size());
129 const QModelIndex &)
const
131 if (mColSrcToProxyMap.isEmpty()) {
134 Q_ASSERT(sourceModel());
135 Q_ASSERT(mColSrcToProxyMap.size() == sourceModel()->columnCount(mRootIndex));
136 if (mColSrcToProxyMap[sourceColumn] == -1) {
139 Q_ASSERT(mColSrcToProxyMap[sourceColumn] >= 0
140 && mColSrcToProxyMap[sourceColumn] < mColSrcToProxyMap.size());
146 int DatasetProxyModel::mapProxyRowToSource(
const int &proxyRow)
const
148 if (mRowProxyToSrcMap.isEmpty()) {
151 Q_ASSERT(proxyRow >= 0 && proxyRow < mRowProxyToSrcMap.size());
152 return mRowProxyToSrcMap[proxyRow];
156 int DatasetProxyModel::mapProxyColumnToSource(
const int &proxyColumn)
const
158 if (mColProxyToSrcMap.isEmpty()) {
161 Q_ASSERT(proxyColumn >= 0 && proxyColumn < mColProxyToSrcMap.size());
162 return mColProxyToSrcMap[proxyColumn];
166 int DatasetProxyModel::mapSourceRowToProxy(
const int &sourceRow)
const
168 if (mRowSrcToProxyMap.isEmpty()) {
171 Q_ASSERT(sourceRow >= 0 && sourceRow < mRowSrcToProxyMap.size());
172 return mRowSrcToProxyMap[sourceRow];
176 int DatasetProxyModel::mapSourceColumnToProxy(
const int &sourceColumn)
const
178 if (mColSrcToProxyMap.isEmpty()) {
181 Q_ASSERT(sourceColumn >= 0 && sourceColumn < mColSrcToProxyMap.size());
182 return mColSrcToProxyMap.at(sourceColumn);
188 mRowSrcToProxyMap.clear();
189 mRowProxyToSrcMap.clear();
190 mColSrcToProxyMap.clear();
191 mColProxyToSrcMap.clear();
207 if (orientation == Qt::Horizontal) {
208 if (mapProxyColumnToSource(section) == -1) {
211 return sourceModel()->headerData(mapProxyColumnToSource(section), orientation, role);
214 if (mapProxyRowToSource(section) == -1) {
217 return sourceModel()->headerData(mapProxyRowToSource(section), orientation, role);
222 void DatasetProxyModel::initializeDatasetDecriptors(
224 const int sourceCount,
230 outProxyToSourceMap = inConfiguration;
231 outSourceToProxyMap.fill(-1, sourceCount);
237 if (inConfiguration[
index] == -1) {
241 Q_ASSERT_X(inConfiguration[
index] >= 0 && inConfiguration[
index] < sourceCount,
242 "DatasetProxyModel::initializeDatasetDecriptors",
243 "column index outside of source model");
244 Q_ASSERT_X(outSourceToProxyMap[inConfiguration[
index]] == -1,
245 "DatasetProxyModel::initializeDatasetDecriptors",
246 "no duplicates allowed in mapping configuration, mapping has to be reversible");
248 outSourceToProxyMap[inConfiguration[
index]] =
index;
255 disconnect(sourceModel(), &QAbstractItemModel::layoutChanged,
258 QSortFilterProxyModel::setSourceModel(m);
259 mRootIndex = QModelIndex();
261 connect(m, &QAbstractItemModel::layoutChanged,
263 connect(m, &QAbstractItemModel::layoutChanged,
this, &DatasetProxyModel::layoutChanged);
270 mRootIndex = rootIdx;
Qt::ItemFlags flags(const QModelIndex &index) const override
QModelIndex parent(const QModelIndex &child) const override
QVariant data(const QModelIndex &index, int role) const override
void setDatasetRowDescriptionVector(const DatasetDescriptionVector &rowConfig)
QModelIndex mapToSource(const QModelIndex &proxyIndex) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
bool filterAcceptsColumn(int sourceColumn, const QModelIndex &) const override
DatasetProxyModel(QObject *parent=nullptr)
void setSourceRootIndex(const QModelIndex &rootIdx)
void setSourceModel(QAbstractItemModel *sourceModel) override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QModelIndex buddy(const QModelIndex &index) const override
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override
void setDatasetDescriptionVectors(const DatasetDescriptionVector &rowConfig, const DatasetDescriptionVector &columnConfig)
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
void setDatasetColumnDescriptionVector(const DatasetDescriptionVector &columnConfig)
void resetDatasetDescriptions()
QVector< int > DatasetDescriptionVector