diff options
Diffstat (limited to 'src/datavis3d/data/qitemmodelbardataproxy.cpp')
-rw-r--r-- | src/datavis3d/data/qitemmodelbardataproxy.cpp | 282 |
1 files changed, 37 insertions, 245 deletions
diff --git a/src/datavis3d/data/qitemmodelbardataproxy.cpp b/src/datavis3d/data/qitemmodelbardataproxy.cpp index 28f9e84a..6cd3b027 100644 --- a/src/datavis3d/data/qitemmodelbardataproxy.cpp +++ b/src/datavis3d/data/qitemmodelbardataproxy.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "qitemmodelbardataproxy_p.h" +#include "baritemmodelhandler_p.h" #include <QTimer> QT_DATAVIS3D_BEGIN_NAMESPACE @@ -40,15 +41,16 @@ QItemModelBarDataProxy::QItemModelBarDataProxy() : } /*! - * Constructs QItemModelBarDataProxy with \a itemModel and \a mapping. Does not take ownership of - * the model or the mapping, but does connect to them to listen for changes. + * Constructs QItemModelBarDataProxy with \a itemModel and \a mapping. Proxy takes ownership of the + * \a mapping, but doesn't take ownership of the \a itemModel, as typically item models are owned + * by other controls. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QItemModelBarDataMapping *mapping) : QBarDataProxy(new QItemModelBarDataProxyPrivate(this)) { - dptr()->setItemModel(itemModel); - dptr()->setMapping(mapping); + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_itemModelHandler->setActiveMapping(mapping); } /*! @@ -64,14 +66,14 @@ QItemModelBarDataProxy::~QItemModelBarDataProxy() * Defines item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelBarDataProxy::setItemModel(QAbstractItemModel *itemModel) +void QItemModelBarDataProxy::setItemModel(const QAbstractItemModel *itemModel) { - dptr()->setItemModel(itemModel); + dptr()->m_itemModelHandler->setItemModel(itemModel); } -QAbstractItemModel *QItemModelBarDataProxy::itemModel() +const QAbstractItemModel *QItemModelBarDataProxy::itemModel() const { - return dptr()->m_itemModel.data(); + return dptrc()->m_itemModelHandler->itemModel(); } /*! @@ -80,269 +82,59 @@ QAbstractItemModel *QItemModelBarDataProxy::itemModel() * Defines data mapping. Does not take ownership of the mapping, but does connect to it to listen * for changes. Modifying a mapping that is set to the proxy will trigger data set re-resolving. */ -void QItemModelBarDataProxy::setMapping(QItemModelBarDataMapping *mapping) +void QItemModelBarDataProxy::setActiveMapping(QItemModelBarDataMapping *mapping) { - dptr()->setMapping(mapping); + dptr()->m_itemModelHandler->setActiveMapping(mapping); } -QItemModelBarDataMapping *QItemModelBarDataProxy::mapping() +QItemModelBarDataMapping *QItemModelBarDataProxy::activeMapping() const { - return dptr()->m_mapping.data(); + return static_cast<QItemModelBarDataMapping *>(dptrc()->m_itemModelHandler->activeMapping()); } -/*! - * \internal - */ -QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptr() -{ - return static_cast<QItemModelBarDataProxyPrivate *>(d_ptr.data()); -} - -// QItemModelBarDataProxyPrivate - -QItemModelBarDataProxyPrivate::QItemModelBarDataProxyPrivate(QItemModelBarDataProxy *q) - : QBarDataProxyPrivate(q), - resolvePending(0) -{ - m_resolveTimer.setSingleShot(true); - QObject::connect(&m_resolveTimer, &QTimer::timeout, - this, &QItemModelBarDataProxyPrivate::handlePendingResolve); -} - -QItemModelBarDataProxyPrivate::~QItemModelBarDataProxyPrivate() -{ -} - -void QItemModelBarDataProxyPrivate::setItemModel(QAbstractItemModel *itemModel) -{ - if (!m_itemModel.isNull()) - QObject::disconnect(m_itemModel, 0, this, 0); - - m_itemModel = itemModel; - - if (!m_itemModel.isNull()) { - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsInserted, - this, &QItemModelBarDataProxyPrivate::handleColumnsInserted); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsMoved, - this, &QItemModelBarDataProxyPrivate::handleColumnsMoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsRemoved, - this, &QItemModelBarDataProxyPrivate::handleColumnsRemoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::dataChanged, - this, &QItemModelBarDataProxyPrivate::handleDataChanged); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::layoutChanged, - this, &QItemModelBarDataProxyPrivate::handleLayoutChanged); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::modelReset, - this, &QItemModelBarDataProxyPrivate::handleModelReset); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsInserted, - this, &QItemModelBarDataProxyPrivate::handleRowsInserted); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsMoved, - this, &QItemModelBarDataProxyPrivate::handleRowsMoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsRemoved, - this, &QItemModelBarDataProxyPrivate::handleRowsRemoved); - } - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); -} - -void QItemModelBarDataProxyPrivate::setMapping(QItemModelBarDataMapping *mapping) -{ - if (!m_mapping.isNull()) { - QObject::disconnect(m_mapping.data(), &QItemModelBarDataMapping::mappingChanged, - this, &QItemModelBarDataProxyPrivate::handleMappingChanged); - } - - m_mapping = mapping; - - if (!m_mapping.isNull()) { - QObject::connect(m_mapping.data(), &QItemModelBarDataMapping::mappingChanged, - this, &QItemModelBarDataProxyPrivate::handleMappingChanged); - } - - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); -} - -void QItemModelBarDataProxyPrivate::handleColumnsInserted(const QModelIndex &parent, - int start, int end) -{ - Q_UNUSED(parent) - Q_UNUSED(start) - Q_UNUSED(end) - - // Resolve new items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient -} - -void QItemModelBarDataProxyPrivate::handleColumnsMoved(const QModelIndex &sourceParent, - int sourceStart, - int sourceEnd, - const QModelIndex &destinationParent, - int destinationColumn) +void QItemModelBarDataProxy::addMapping(QItemModelBarDataMapping *mapping) { - Q_UNUSED(sourceParent) - Q_UNUSED(sourceStart) - Q_UNUSED(sourceEnd) - Q_UNUSED(destinationParent) - Q_UNUSED(destinationColumn) - - // Resolve moved items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient + dptr()->m_itemModelHandler->addMapping(mapping); } -void QItemModelBarDataProxyPrivate::handleColumnsRemoved(const QModelIndex &parent, - int start, int end) +void QItemModelBarDataProxy::releaseMapping(QItemModelBarDataMapping *mapping) { - Q_UNUSED(parent) - Q_UNUSED(start) - Q_UNUSED(end) - - // Remove old items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient + dptr()->m_itemModelHandler->releaseMapping(mapping); } -void QItemModelBarDataProxyPrivate::handleDataChanged(const QModelIndex &topLeft, - const QModelIndex &bottomRight, - const QVector<int> &roles) +QList<QItemModelBarDataMapping *> QItemModelBarDataProxy::mappings() const { - Q_UNUSED(topLeft) - Q_UNUSED(bottomRight) - Q_UNUSED(roles) + QList<QItemModelBarDataMapping *> retList; + QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings(); + foreach (QAbstractDataMapping *mapping, abstractList) + retList.append(static_cast<QItemModelBarDataMapping *>(mapping)); - // Resolve changed items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient + return retList; } -void QItemModelBarDataProxyPrivate::handleLayoutChanged(const QList<QPersistentModelIndex> &parents, - QAbstractItemModel::LayoutChangeHint hint) -{ - Q_UNUSED(parents) - Q_UNUSED(hint) - - // Resolve moved items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient -} - -void QItemModelBarDataProxyPrivate::handleModelReset() -{ - // Data cleared, reset array - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient -} - -void QItemModelBarDataProxyPrivate::handleRowsInserted(const QModelIndex &parent, int start, int end) -{ - Q_UNUSED(parent) - Q_UNUSED(start) - Q_UNUSED(end) - - // Resolve new items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient -} - -void QItemModelBarDataProxyPrivate::handleRowsMoved(const QModelIndex &sourceParent, - int sourceStart, - int sourceEnd, - const QModelIndex &destinationParent, - int destinationRow) +/*! + * \internal + */ +QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptr() { - Q_UNUSED(sourceParent) - Q_UNUSED(sourceStart) - Q_UNUSED(sourceEnd) - Q_UNUSED(destinationParent) - Q_UNUSED(destinationRow) - - // Resolve moved items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient + return static_cast<QItemModelBarDataProxyPrivate *>(d_ptr.data()); } -void QItemModelBarDataProxyPrivate::handleRowsRemoved(const QModelIndex &parent, int start, int end) +const QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptrc() const { - Q_UNUSED(parent) - Q_UNUSED(start) - Q_UNUSED(end) - - // Resolve removed items - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); // TODO Resolving entire model is inefficient + return static_cast<const QItemModelBarDataProxyPrivate *>(d_ptr.data()); } -void QItemModelBarDataProxyPrivate::handleMappingChanged() -{ - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); -} +// QItemModelBarDataProxyPrivate -void QItemModelBarDataProxyPrivate::handlePendingResolve() +QItemModelBarDataProxyPrivate::QItemModelBarDataProxyPrivate(QItemModelBarDataProxy *q) + : QBarDataProxyPrivate(q), + m_itemModelHandler(new BarItemModelHandler(q)) { - resolveModel(); } -// Resolve entire item model into QBarDataArray. -void QItemModelBarDataProxyPrivate::resolveModel() +QItemModelBarDataProxyPrivate::~QItemModelBarDataProxyPrivate() { - if (m_itemModel.isNull() || m_mapping.isNull()) { - qptr()->resetArray(0); - return; - } - - bool useModelRows(false); - if (!m_mapping->rowCategories().size() || !m_mapping->columnCategories().size()) { - useModelRows = true; - } else if (m_mapping->rowRole().isEmpty() || m_mapping->columnRole().isEmpty()) { - qptr()->resetArray(0); - return; - } - - QBarDataArray *newProxyArray = new QBarDataArray; - QHash<int, QByteArray> roleHash = m_itemModel->roleNames(); - // Default to display role if no mapping - int valueRole = roleHash.key(m_mapping->valueRole().toLatin1(), Qt::DisplayRole); - int rowCount = m_itemModel->rowCount(); - int columnCount = m_itemModel->columnCount(); - - if (useModelRows) { - for (int i = 0; i < rowCount; i++) { - QBarDataRow *newProxyRow = new QBarDataRow(columnCount); - for (int j = 0; j < columnCount; j++) - (*newProxyRow)[j].setValue(m_itemModel->index(i, j).data(valueRole).toReal()); - newProxyArray->append(newProxyRow); - } - } else { - int rowRole = roleHash.key(m_mapping->rowRole().toLatin1()); - int columnRole = roleHash.key(m_mapping->columnRole().toLatin1()); - const QStringList &rowList = m_mapping->rowCategories(); - const QStringList &columnList = m_mapping->columnCategories(); - - // Sort values into rows and columns - typedef QHash<QString, qreal> ColumnValueMap; - QHash <QString, ColumnValueMap> itemValueMap; - for (int i = 0; i < rowCount; i++) { - for (int j = 0; j < columnCount; j++) { - QModelIndex index = m_itemModel->index(i, j); - itemValueMap[index.data(rowRole).toString()][index.data(columnRole).toString()] - = index.data(valueRole).toReal(); - } - } - - // Create new data array from itemValueMap - foreach (QString rowKey, rowList) { - QBarDataRow *newProxyRow = new QBarDataRow(columnList.size()); - for (int i = 0; i < columnList.size(); i++) - (*newProxyRow)[i].setValue(itemValueMap[rowKey][columnList.at(i)]); - newProxyArray->append(newProxyRow); - } - } - qDebug() << __FUNCTION__ << "RowCount:" << newProxyArray->size() << "Column count:" - << (newProxyArray->size() ? newProxyArray->at(0)->size() : 0); - - qptr()->resetArray(newProxyArray); } QItemModelBarDataProxy *QItemModelBarDataProxyPrivate::qptr() |