12 #include "kdganttsummaryhandlingproxymodel_p.h"
38 bool SummaryHandlingProxyModel::Private::cacheLookup(
const QModelIndex &idx,
39 QPair<QDateTime, QDateTime> *result)
const
42 QHash<QModelIndex, QPair<QDateTime, QDateTime>>::const_iterator it =
43 cached_summary_items.constFind(idx);
44 if (it != cached_summary_items.constEnd()) {
53 const QModelIndex &sourceIdx)
const
55 QAbstractItemModel *sourceModel = model->sourceModel();
56 const QModelIndex &mainIdx = sourceIdx;
60 for (
int r = 0; r < sourceModel->rowCount(mainIdx); ++r) {
61 QModelIndex pdIdx = model->
mapFromSource(sourceModel->index(r, 0, mainIdx));
65 if (!tmpsv.canConvert(QVariant::DateTime) || !tmpev.canConvert(QVariant::DateTime)) {
66 qDebug() <<
"Skipping item " << sourceIdx <<
" because it doesn't contain QDateTime";
71 if (tmpsv.type() == QVariant::DateTime && !tmpsv.value<QDateTime>().isValid())
73 if (tmpev.type() == QVariant::DateTime && !tmpev.value<QDateTime>().isValid())
78 if (tmpsv.type() == QVariant::String && tmpsv.value<QString>().isEmpty())
80 if (tmpev.type() == QVariant::String && tmpev.value<QString>().isEmpty())
82 QDateTime tmpst = tmpsv.toDateTime();
83 QDateTime tmpet = tmpev.toDateTime();
84 if (st.isNull() || st > tmpst)
86 if (et.isNull() || et < tmpet)
90 QVariant tmpsev = sourceModel->data(mainIdx,
EndTimeRole);
91 if (tmpssv.canConvert(QVariant::DateTime)
92 && !(tmpssv.canConvert(QVariant::String) && tmpssv.toString().isEmpty())
93 && tmpssv.toDateTime() != st)
95 if (tmpsev.canConvert(QVariant::DateTime)
96 && !(tmpsev.canConvert(QVariant::String) && tmpsev.toString().isEmpty())
97 && tmpsev.toDateTime() != et)
99 cached_summary_items[sourceIdx] = qMakePair(st, et);
102 void SummaryHandlingProxyModel::Private::removeFromCache(
const QModelIndex &idx)
const
104 cached_summary_items.remove(idx);
107 void SummaryHandlingProxyModel::Private::clearCache()
const
109 cached_summary_items.clear();
128 void SummaryHandlingProxyModel::init()
135 struct KDPrivateModelIndex
139 const QAbstractItemModel *m;
149 BASE::setSourceModel(model);
156 BASE::sourceModelReset();
162 BASE::sourceLayoutChanged();
167 QAbstractItemModel *model = sourceModel();
168 QModelIndex parentIdx = from;
170 const QModelIndex &dataIdx = parentIdx;
173 d->removeFromCache(dataIdx);
175 Q_EMIT dataChanged(proxyDataIdx, proxyDataIdx);
177 }
while ((parentIdx = model->parent(parentIdx)) != QModelIndex());
179 BASE::sourceDataChanged(from, to);
186 BASE::sourceColumnsAboutToBeInserted(parentIdx, start, end);
194 BASE::sourceColumnsAboutToBeRemoved(parentIdx, start, end);
200 BASE::sourceRowsAboutToBeInserted(parentIdx, start, end);
206 BASE::sourceRowsAboutToBeRemoved(parentIdx, start, end);
214 const QAbstractItemModel *model = sourceModel();
215 Qt::ItemFlags f = model->flags(sidx);
216 if (
d->isSummary(sidx)) {
217 f &= ~Qt::ItemIsEditable;
227 const QAbstractItemModel *model = sourceModel();
230 QPair<QDateTime, QDateTime> result;
231 if (
d->cacheLookup(sidx, &result)) {
237 return result.second;
241 d->insertInCache(
this, sidx);
242 return data(proxyIndex, role);
245 return model->data(sidx, role);
251 QAbstractItemModel *model = sourceModel();
255 if (
d->isSummary(parentIdx)) {
257 d->removeFromCache(parentIdx);
259 Q_EMIT dataChanged(proxyParentIdx, proxyParentIdx);
261 }
while ((parentIdx = model->parent(parentIdx)) != QModelIndex());
263 return BASE::setData(
index, value, role);
268 #ifndef KDAB_NO_UNIT_TESTS
270 #include "unittest/test.h"
272 #include <QStandardItemModel>
274 static std::ostream &
operator<<(std::ostream &os,
const QDateTime &dt)
277 os << dt.toString().toLatin1().constData();
279 os << dt.toString().toStdString();
287 QStandardItemModel sourceModel;
291 auto *topitem =
new QStandardItem(QString::fromLatin1(
"Summary"));
293 sourceModel.appendRow(topitem);
295 auto *task1 =
new QStandardItem(QString::fromLatin1(
"Task1"));
297 auto *task2 =
new QStandardItem(QString::fromLatin1(
"Task2"));
299 topitem->appendRow(task1);
300 topitem->appendRow(task2);
302 QDateTime startdt = QDateTime::currentDateTime();
303 QDateTime enddt = startdt.addDays(1);
310 const QModelIndex topidx = model.
index(0, 0, QModelIndex());
316 assertEqual(task1startdt, startdt);
319 assertEqual(summarystartdt, startdt);
320 assertTrue(model.
flags(model.
index(0, 0, topidx)) & Qt::ItemIsEditable);
321 assertFalse(model.
flags(topidx) & Qt::ItemIsEditable);
326 #include "moc_kdganttsummaryhandlingproxymodel.cpp"
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override
Converts indexes in the source model to indexes in the proxy model.
QModelIndex mapToSource(const QModelIndex &proxyIndex) const override
Converts indexes in the proxy model to indexes in the source model.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
Proxy model that supports summary gantt items.
Qt::ItemFlags flags(const QModelIndex &idx) const override
void sourceDataChanged(const QModelIndex &from, const QModelIndex &to) override
Called when the data in an existing item in the source model changes.
void sourceModelReset() override
Called when the source model is reset.
void sourceRowsAboutToBeInserted(const QModelIndex &idx, int start, int end) override
Called just before rows are inserted into the source model.
void sourceRowsAboutToBeRemoved(const QModelIndex &, int start, int end) override
Called just before rows are removed from the source model.
void sourceColumnsAboutToBeInserted(const QModelIndex &idx, int start, int end) override
Called just before columns are inserted into the source model.
void setSourceModel(QAbstractItemModel *model) override
Sets the model to be used as the source model for this proxy.
SummaryHandlingProxyModel(QObject *parent=nullptr)
Constructor.
~SummaryHandlingProxyModel() override
void sourceLayoutChanged() override
Called when the layout of the source model has changed.
QVariant data(const QModelIndex &proxyIndex, int role=Qt::DisplayRole) const override
void sourceColumnsAboutToBeRemoved(const QModelIndex &idx, int start, int end) override
Called just before columns are removed from the source model.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
KDAB_SCOPED_UNITTEST_SIMPLE(KDGantt, SummaryHandlingProxyModel, "test")
ForwardingProxyModel BASE
static std::ostream & operator<<(std::ostream &os, const QDateTime &dt)