summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/data/qitemmodelbardataproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3d/data/qitemmodelbardataproxy.cpp')
-rw-r--r--src/datavis3d/data/qitemmodelbardataproxy.cpp282
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()