summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-08-30 11:57:40 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-02 08:23:27 +0300
commit15f8c86385a055d35b07519e4bf8c8f1aa915ea3 (patch)
tree4b8b91bbd00a15d5b76793f0851f30e8fd196de3
parent6ef39dff1064f60c3f8794c2483c0ef16afaed78 (diff)
Refactor item model mapping and proxies
- Introduced new handler for item models. Instance of this is owned by item model proxies. - Introduced abstract mapping class to enable moving a lot of duplicate code to the new handler. - Changed ownership handling of mapping objects to be in line with proxies and axes, though there is no default mapping at this time. Need to reconsider the default case more. - Made item model const so it is clear that we do not own it. The documentation is not yet up to date. Change-Id: Ie961da29340743fdaa9293d7d4ace9577def9102 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--examples/barchart/main.cpp3
-rw-r--r--examples/qmlbarchart/qml/qmlbarchart/main.qml6
-rw-r--r--src/datavis3d/data/abstractitemmodelhandler.cpp250
-rw-r--r--src/datavis3d/data/abstractitemmodelhandler_p.h90
-rw-r--r--src/datavis3d/data/baritemmodelhandler.cpp94
-rw-r--r--src/datavis3d/data/baritemmodelhandler_p.h52
-rw-r--r--src/datavis3d/data/data.pri13
-rw-r--r--src/datavis3d/data/qabstractdatamapping.cpp63
-rw-r--r--src/datavis3d/data/qabstractdatamapping.h54
-rw-r--r--src/datavis3d/data/qabstractdatamapping_p.h50
-rw-r--r--src/datavis3d/data/qitemmodelbardatamapping.cpp65
-rw-r--r--src/datavis3d/data/qitemmodelbardatamapping.h21
-rw-r--r--src/datavis3d/data/qitemmodelbardatamapping_p.h5
-rw-r--r--src/datavis3d/data/qitemmodelbardataproxy.cpp282
-rw-r--r--src/datavis3d/data/qitemmodelbardataproxy.h19
-rw-r--r--src/datavis3d/data/qitemmodelbardataproxy_p.h25
-rw-r--r--src/datavis3d/data/qitemmodelmapdatamapping.h1
-rw-r--r--src/datavis3d/data/qitemmodelmapdataproxy.cpp38
-rw-r--r--src/datavis3d/data/qitemmodelmapdataproxy.h13
-rw-r--r--src/datavis3d/data/qitemmodelmapdataproxy_p.h8
-rw-r--r--src/datavis3d/data/qitemmodelscatterdatamapping.cpp43
-rw-r--r--src/datavis3d/data/qitemmodelscatterdatamapping.h18
-rw-r--r--src/datavis3d/data/qitemmodelscatterdatamapping_p.h5
-rw-r--r--src/datavis3d/data/qitemmodelscatterdataproxy.cpp266
-rw-r--r--src/datavis3d/data/qitemmodelscatterdataproxy.h18
-rw-r--r--src/datavis3d/data/qitemmodelscatterdataproxy_p.h29
-rw-r--r--src/datavis3d/data/scatteritemmodelhandler.cpp82
-rw-r--r--src/datavis3d/data/scatteritemmodelhandler_p.h52
-rw-r--r--src/datavis3dqml2/datavis3dqml2_plugin.cpp2
-rw-r--r--src/datavis3dqml2/datavis3dqml2_plugin.h2
-rw-r--r--src/datavis3dqml2/declarativebars.cpp10
-rw-r--r--src/datavis3dqml2/declarativebars_p.h6
-rw-r--r--src/datavis3dqml2/declarativemaps.cpp10
-rw-r--r--src/datavis3dqml2/declarativemaps_p.h6
-rw-r--r--src/datavis3dqml2/declarativescatter.cpp10
-rw-r--r--src/datavis3dqml2/declarativescatter_p.h6
36 files changed, 1051 insertions, 666 deletions
diff --git a/examples/barchart/main.cpp b/examples/barchart/main.cpp
index 0f1a8252..ca9c3260 100644
--- a/examples/barchart/main.cpp
+++ b/examples/barchart/main.cpp
@@ -296,8 +296,7 @@ int main(int argc, char **argv)
// We don't need to initialize the mapping object in any way, as it defaults
// to row/column support and uses the Qt::DisplayRole role for value role by default.
- QItemModelBarDataMapping mapping;
- QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model(), &mapping);
+ QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model(), new QItemModelBarDataMapping);
chart->setActiveDataProxy(proxy);
ChartDataGenerator *generator = new ChartDataGenerator(chart, tableWidget);
diff --git a/examples/qmlbarchart/qml/qmlbarchart/main.qml b/examples/qmlbarchart/qml/qmlbarchart/main.qml
index 44ad36ca..781e7517 100644
--- a/examples/qmlbarchart/qml/qmlbarchart/main.qml
+++ b/examples/qmlbarchart/qml/qmlbarchart/main.qml
@@ -27,12 +27,15 @@ Item {
height: 600
visible: true
+
Item {
id: dataView
width: parent.width - tableView.width
height: parent.height
anchors.right: parent.right;
+ property point storedSelection: Qt.point(-1, -1)
+
BarDataMapping {
id: valueMapping
rowRole: "year"
@@ -138,7 +141,7 @@ Item {
onDataResolved: {
// Can't select a bar until data has been resolved from model to proxy
- //selectedBarPos = Qt.point(0, 5)
+ selectedBarPos = dataView.storedSelection
}
}
@@ -177,6 +180,7 @@ Item {
text = "Show Income"
testchart.valueAxis = expensesAxis
}
+ dataView.storedSelection = testchart.selectedBarPos
}
}
diff --git a/src/datavis3d/data/abstractitemmodelhandler.cpp b/src/datavis3d/data/abstractitemmodelhandler.cpp
new file mode 100644
index 00000000..c441f0d8
--- /dev/null
+++ b/src/datavis3d/data/abstractitemmodelhandler.cpp
@@ -0,0 +1,250 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "abstractitemmodelhandler_p.h"
+#include "qabstractdatamapping.h"
+#include <QTimer>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+AbstractItemModelHandler::AbstractItemModelHandler(QObject *parent)
+ : QObject(parent),
+ m_activeMapping(0),
+ resolvePending(0)
+{
+ m_resolveTimer.setSingleShot(true);
+ QObject::connect(&m_resolveTimer, &QTimer::timeout,
+ this, &AbstractItemModelHandler::handlePendingResolve);
+}
+
+AbstractItemModelHandler::~AbstractItemModelHandler()
+{
+}
+
+void AbstractItemModelHandler::setItemModel(const 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, &AbstractItemModelHandler::handleColumnsInserted);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsMoved,
+ this, &AbstractItemModelHandler::handleColumnsMoved);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsRemoved,
+ this, &AbstractItemModelHandler::handleColumnsRemoved);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::dataChanged,
+ this, &AbstractItemModelHandler::handleDataChanged);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::layoutChanged,
+ this, &AbstractItemModelHandler::handleLayoutChanged);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::modelReset,
+ this, &AbstractItemModelHandler::handleModelReset);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsInserted,
+ this, &AbstractItemModelHandler::handleRowsInserted);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsMoved,
+ this, &AbstractItemModelHandler::handleRowsMoved);
+ QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsRemoved,
+ this, &AbstractItemModelHandler::handleRowsRemoved);
+ }
+ if (!m_resolveTimer.isActive())
+ m_resolveTimer.start(0);
+}
+
+const QAbstractItemModel *AbstractItemModelHandler::itemModel() const
+{
+ return m_itemModel.data();
+}
+
+void AbstractItemModelHandler::setActiveMapping(QAbstractDataMapping *mapping)
+{
+ if (m_activeMapping)
+ QObject::disconnect(m_activeMapping, 0, this, 0);
+
+ if (mapping)
+ addMapping(mapping);
+
+ m_activeMapping = mapping;
+
+ if (m_activeMapping) {
+ QObject::connect(m_activeMapping, &QAbstractDataMapping::mappingChanged,
+ this, &AbstractItemModelHandler::handleMappingChanged);
+ }
+
+ if (!m_resolveTimer.isActive())
+ m_resolveTimer.start(0);
+}
+
+QAbstractDataMapping *AbstractItemModelHandler::activeMapping() const
+{
+ return m_activeMapping;
+}
+
+void AbstractItemModelHandler::addMapping(QAbstractDataMapping *mapping)
+{
+ Q_ASSERT(mapping);
+ AbstractItemModelHandler *owner = qobject_cast<AbstractItemModelHandler *>(mapping->parent());
+ if (owner != this) {
+ Q_ASSERT_X(!owner, "addMapping", "Mapping already attached to a proxy.");
+ mapping->setParent(this);
+ }
+ if (!m_mappings.contains(mapping))
+ m_mappings.append(mapping);
+}
+
+void AbstractItemModelHandler::releaseMapping(QAbstractDataMapping *mapping)
+{
+ if (mapping && m_mappings.contains(mapping)) {
+ // If the mapping is in use, clear the existing mapping
+ if (m_activeMapping == mapping)
+ setActiveMapping(0);
+
+ m_mappings.removeAll(mapping);
+ mapping->setParent(0);
+ }
+}
+
+QList<QAbstractDataMapping *> AbstractItemModelHandler::mappings() const
+{
+ return m_mappings;
+}
+
+void AbstractItemModelHandler::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 AbstractItemModelHandler::handleColumnsMoved(const QModelIndex &sourceParent,
+ int sourceStart,
+ int sourceEnd,
+ const QModelIndex &destinationParent,
+ int destinationColumn)
+{
+ 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
+}
+
+void AbstractItemModelHandler::handleColumnsRemoved(const QModelIndex &parent,
+ int start, int end)
+{
+ 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
+}
+
+void AbstractItemModelHandler::handleDataChanged(const QModelIndex &topLeft,
+ const QModelIndex &bottomRight,
+ const QVector<int> &roles)
+{
+ Q_UNUSED(topLeft)
+ Q_UNUSED(bottomRight)
+ Q_UNUSED(roles)
+
+ // Resolve changed items
+ if (!m_resolveTimer.isActive())
+ m_resolveTimer.start(0); // TODO Resolving entire model is inefficient
+}
+
+void AbstractItemModelHandler::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 AbstractItemModelHandler::handleModelReset()
+{
+ // Data cleared, reset array
+ if (!m_resolveTimer.isActive())
+ m_resolveTimer.start(0); // TODO Resolving entire model is inefficient
+}
+
+void AbstractItemModelHandler::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 AbstractItemModelHandler::handleRowsMoved(const QModelIndex &sourceParent,
+ int sourceStart,
+ int sourceEnd,
+ const QModelIndex &destinationParent,
+ int destinationRow)
+{
+ 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
+}
+
+void AbstractItemModelHandler::handleRowsRemoved(const QModelIndex &parent, int start, int end)
+{
+ 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
+}
+
+void AbstractItemModelHandler::handleMappingChanged()
+{
+ if (!m_resolveTimer.isActive())
+ m_resolveTimer.start(0);
+}
+
+void AbstractItemModelHandler::handlePendingResolve()
+{
+ resolveModel();
+}
+
+QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/abstractitemmodelhandler_p.h b/src/datavis3d/data/abstractitemmodelhandler_p.h
new file mode 100644
index 00000000..aa49faeb
--- /dev/null
+++ b/src/datavis3d/data/abstractitemmodelhandler_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVis3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef ABSTRACTITEMMODELHANDLER_P_H
+#define ABSTRACTITEMMODELHANDLER_P_H
+
+#include "datavis3dglobal_p.h"
+#include <QAbstractItemModel>
+#include <QPointer>
+#include <QTimer>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class QAbstractDataMapping;
+
+class AbstractItemModelHandler : public QObject
+{
+ Q_OBJECT
+public:
+ AbstractItemModelHandler(QObject *parent = 0);
+ virtual ~AbstractItemModelHandler();
+
+ virtual void setItemModel(const QAbstractItemModel *itemModel);
+ virtual const QAbstractItemModel *itemModel() const;
+ virtual void setActiveMapping(QAbstractDataMapping *mapping);
+ virtual QAbstractDataMapping *activeMapping() const;
+ virtual void addMapping(QAbstractDataMapping *mapping);
+ virtual void releaseMapping(QAbstractDataMapping *mapping);
+ virtual QList<QAbstractDataMapping *> mappings() const;
+
+public slots:
+ virtual void handleColumnsInserted(const QModelIndex &parent, int start, int end);
+ virtual void handleColumnsMoved(const QModelIndex &sourceParent, int sourceStart,
+ int sourceEnd, const QModelIndex &destinationParent,
+ int destinationColumn);
+ virtual void handleColumnsRemoved(const QModelIndex &parent, int start, int end);
+ virtual void handleDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
+ const QVector<int> &roles = QVector<int> ());
+ virtual void handleLayoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(),
+ QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
+ virtual void handleModelReset();
+ virtual void handleRowsInserted(const QModelIndex &parent, int start, int end);
+ virtual void handleRowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
+ const QModelIndex &destinationParent, int destinationRow);
+ virtual void handleRowsRemoved(const QModelIndex &parent, int start, int end);
+
+ virtual void handleMappingChanged();
+ virtual void handlePendingResolve();
+
+protected:
+ virtual void resolveModel() = 0;
+
+ QPointer<const QAbstractItemModel> m_itemModel; // Not owned
+ QAbstractDataMapping *m_activeMapping;
+ bool resolvePending;
+ QTimer m_resolveTimer;
+ QList<QAbstractDataMapping *> m_mappings;
+
+private:
+ Q_DISABLE_COPY(AbstractItemModelHandler)
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/data/baritemmodelhandler.cpp b/src/datavis3d/data/baritemmodelhandler.cpp
new file mode 100644
index 00000000..57f8d7d0
--- /dev/null
+++ b/src/datavis3d/data/baritemmodelhandler.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "baritemmodelhandler_p.h"
+#include <QTimer>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+BarItemModelHandler::BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject *parent)
+ : AbstractItemModelHandler(parent),
+ m_proxy(proxy)
+{
+}
+
+BarItemModelHandler::~BarItemModelHandler()
+{
+}
+
+// Resolve entire item model into QBarDataArray.
+void BarItemModelHandler::resolveModel()
+{
+ QItemModelBarDataMapping *mapping = static_cast<QItemModelBarDataMapping *>(m_activeMapping);
+ if (m_itemModel.isNull() || !mapping) {
+ m_proxy->resetArray(0);
+ return;
+ }
+
+ bool useModelRows(false);
+ if (!mapping->rowCategories().size() || !mapping->columnCategories().size()) {
+ useModelRows = true;
+ } else if (mapping->rowRole().isEmpty() || mapping->columnRole().isEmpty()) {
+ m_proxy->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(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(mapping->rowRole().toLatin1());
+ int columnRole = roleHash.key(mapping->columnRole().toLatin1());
+ const QStringList &rowList = mapping->rowCategories();
+ const QStringList &columnList = 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);
+ }
+ }
+
+ m_proxy->resetArray(newProxyArray);
+}
+
+QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/baritemmodelhandler_p.h b/src/datavis3d/data/baritemmodelhandler_p.h
new file mode 100644
index 00000000..0124e56e
--- /dev/null
+++ b/src/datavis3d/data/baritemmodelhandler_p.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVis3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef BARITEMMODELHANDLER_P_H
+#define BARITEMMODELHANDLER_P_H
+
+#include "abstractitemmodelhandler_p.h"
+#include "qitemmodelbardataproxy.h"
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class BarItemModelHandler : public AbstractItemModelHandler
+{
+ Q_OBJECT
+public:
+ BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject *parent = 0);
+ virtual ~BarItemModelHandler();
+
+protected:
+ void virtual resolveModel();
+
+ QItemModelBarDataProxy *m_proxy; // Not owned
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/data/data.pri b/src/datavis3d/data/data.pri
index a3b28e6e..873b9a0e 100644
--- a/src/datavis3d/data/data.pri
+++ b/src/datavis3d/data/data.pri
@@ -29,7 +29,12 @@ HEADERS += \
$$PWD/qitemmodelscatterdatamapping.h \
$$PWD/qitemmodelscatterdatamapping_p.h \
$$PWD/qitemmodelscatterdataproxy.h \
- $$PWD/qitemmodelscatterdataproxy_p.h
+ $$PWD/qitemmodelscatterdataproxy_p.h \
+ $$PWD/abstractitemmodelhandler_p.h \
+ $$PWD/baritemmodelhandler_p.h \
+ $$PWD/qabstractdatamapping.h \
+ $$PWD/qabstractdatamapping_p.h \
+ $$PWD/scatteritemmodelhandler_p.h
SOURCES += \
$$PWD/labelitem.cpp \
@@ -49,4 +54,8 @@ SOURCES += \
$$PWD/qitemmodelmapdatamapping.cpp \
$$PWD/qitemmodelmapdataproxy.cpp \
$$PWD/qitemmodelscatterdatamapping.cpp \
- $$PWD/qitemmodelscatterdataproxy.cpp
+ $$PWD/qitemmodelscatterdataproxy.cpp \
+ $$PWD/abstractitemmodelhandler.cpp \
+ $$PWD/baritemmodelhandler.cpp \
+ $$PWD/qabstractdatamapping.cpp \
+ $$PWD/scatteritemmodelhandler.cpp
diff --git a/src/datavis3d/data/qabstractdatamapping.cpp b/src/datavis3d/data/qabstractdatamapping.cpp
new file mode 100644
index 00000000..ab5bdf5b
--- /dev/null
+++ b/src/datavis3d/data/qabstractdatamapping.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "qabstractdatamapping_p.h"
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+/*!
+ * \class QAbstractDataMapping
+ * \inmodule QtDataVis3D
+ * \brief Abstract base class for data mappings
+ * \since 1.0.0
+ *
+ * Data mapping classes provide a way to map data from one data source to another.
+ */
+
+/*!
+ * \internal
+ */
+QAbstractDataMapping::QAbstractDataMapping(QAbstractDataMappingPrivate *d, QObject *parent)
+ : QObject(parent),
+ d_ptr(d)
+{
+}
+
+/*!
+ * Destroys QAbstractDataMapping.
+ */
+QAbstractDataMapping::~QAbstractDataMapping()
+{
+}
+
+// QItemModelBarDataMappingPrivate
+
+QAbstractDataMappingPrivate::QAbstractDataMappingPrivate(QAbstractDataMapping *q,
+ QAbstractDataProxy::DataType type)
+ : QObject(0),
+ q_ptr(q),
+ m_type(type)
+{
+}
+
+QAbstractDataMappingPrivate::~QAbstractDataMappingPrivate()
+{
+}
+
+QT_DATAVIS3D_END_NAMESPACE
+
diff --git a/src/datavis3d/data/qabstractdatamapping.h b/src/datavis3d/data/qabstractdatamapping.h
new file mode 100644
index 00000000..edc4b8ee
--- /dev/null
+++ b/src/datavis3d/data/qabstractdatamapping.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#ifndef QABSTRACTDATAMAPPING_H
+#define QABSTRACTDATAMAPPING_H
+
+#include <QtDataVis3D/qdatavis3denums.h>
+#include <QtDataVis3D/qabstractdataproxy.h>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class QAbstractDataMappingPrivate;
+
+class QT_DATAVIS3D_EXPORT QAbstractDataMapping : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QAbstractDataMapping(QAbstractDataMappingPrivate *d, QObject *parent = 0);
+ virtual ~QAbstractDataMapping();
+
+ QAbstractDataProxy::DataType type() const;
+
+signals:
+ void mappingChanged();
+
+private:
+ QScopedPointer<QAbstractDataMappingPrivate> d_ptr;
+
+ Q_DISABLE_COPY(QAbstractDataMapping)
+
+ friend class QItemModelBarDataMapping;
+ friend class QItemModelScatterDataMapping;
+};
+
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/data/qabstractdatamapping_p.h b/src/datavis3d/data/qabstractdatamapping_p.h
new file mode 100644
index 00000000..4b16d7a4
--- /dev/null
+++ b/src/datavis3d/data/qabstractdatamapping_p.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVis3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#include "qabstractdatamapping.h"
+
+#ifndef QABSTRACTDATAMAPPING_P_H
+#define QABSTRACTDATAMAPPING_P_H
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class QAbstractDataMappingPrivate : public QObject
+{
+ Q_OBJECT
+public:
+ QAbstractDataMappingPrivate(QAbstractDataMapping *q, QAbstractDataProxy::DataType type);
+ virtual ~QAbstractDataMappingPrivate();
+
+private:
+ QAbstractDataMapping *q_ptr;
+ QAbstractDataProxy::DataType m_type;
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/data/qitemmodelbardatamapping.cpp b/src/datavis3d/data/qitemmodelbardatamapping.cpp
index 87018662..6bc92f2c 100644
--- a/src/datavis3d/data/qitemmodelbardatamapping.cpp
+++ b/src/datavis3d/data/qitemmodelbardatamapping.cpp
@@ -38,8 +38,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
* Constructs QItemModelBarDataMapping with the given \a parent.
*/
QItemModelBarDataMapping::QItemModelBarDataMapping(QObject *parent)
- : QObject(parent),
- d_ptr(new QItemModelBarDataMappingPrivate(this))
+ : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent)
{
}
@@ -47,10 +46,9 @@ QItemModelBarDataMapping::QItemModelBarDataMapping(QObject *parent)
* Constructs QItemModelBarDataMapping with \a valueRole and the given \a parent.
*/
QItemModelBarDataMapping::QItemModelBarDataMapping(const QString &valueRole, QObject *parent)
- : QObject(parent),
- d_ptr(new QItemModelBarDataMappingPrivate(this))
+ : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent)
{
- d_ptr->m_valueRole = valueRole;
+ dptr()->m_valueRole = valueRole;
}
/*!
@@ -63,14 +61,13 @@ QItemModelBarDataMapping::QItemModelBarDataMapping(const QString &rowRole,
const QStringList &rowCategories,
const QStringList &columnCategories,
QObject *parent)
- : QObject(parent),
- d_ptr(new QItemModelBarDataMappingPrivate(this))
+ : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent)
{
- d_ptr->m_rowRole = rowRole;
- d_ptr->m_columnRole = columnRole;
- d_ptr->m_valueRole = valueRole;
- d_ptr->m_rowCategories = rowCategories;
- d_ptr->m_columnCategories = columnCategories;
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_valueRole = valueRole;
+ dptr()->m_rowCategories = rowCategories;
+ dptr()->m_columnCategories = columnCategories;
}
/*!
@@ -87,13 +84,13 @@ QItemModelBarDataMapping::~QItemModelBarDataMapping()
*/
void QItemModelBarDataMapping::setRowRole(const QString &role)
{
- d_ptr->m_rowRole = role;
+ dptr()->m_rowRole = role;
emit mappingChanged();
}
QString QItemModelBarDataMapping::rowRole() const
{
- return d_ptr->m_rowRole;
+ return dptrc()->m_rowRole;
}
/*!
@@ -103,13 +100,13 @@ QString QItemModelBarDataMapping::rowRole() const
*/
void QItemModelBarDataMapping::setColumnRole(const QString &role)
{
- d_ptr->m_columnRole = role;
+ dptr()->m_columnRole = role;
emit mappingChanged();
}
QString QItemModelBarDataMapping::columnRole() const
{
- return d_ptr->m_columnRole;
+ return dptrc()->m_columnRole;
}
/*!
@@ -119,13 +116,13 @@ QString QItemModelBarDataMapping::columnRole() const
*/
void QItemModelBarDataMapping::setValueRole(const QString &role)
{
- d_ptr->m_valueRole = role;
+ dptr()->m_valueRole = role;
emit mappingChanged();
}
QString QItemModelBarDataMapping::valueRole() const
{
- return d_ptr->m_valueRole;
+ return dptrc()->m_valueRole;
}
/*!
@@ -135,13 +132,13 @@ QString QItemModelBarDataMapping::valueRole() const
*/
void QItemModelBarDataMapping::setRowCategories(const QStringList &categories)
{
- d_ptr->m_rowCategories = categories;
+ dptr()->m_rowCategories = categories;
emit mappingChanged();
}
QStringList QItemModelBarDataMapping::rowCategories() const
{
- return d_ptr->m_rowCategories;
+ return dptrc()->m_rowCategories;
}
/*!
@@ -151,13 +148,13 @@ QStringList QItemModelBarDataMapping::rowCategories() const
*/
void QItemModelBarDataMapping::setColumnCategories(const QStringList &categories)
{
- d_ptr->m_columnCategories = categories;
+ dptr()->m_columnCategories = categories;
emit mappingChanged();
}
QStringList QItemModelBarDataMapping::columnCategories() const
{
- return d_ptr->m_columnCategories;
+ return dptrc()->m_columnCategories;
}
/*!
@@ -172,20 +169,29 @@ void QItemModelBarDataMapping::remap(const QString &rowRole,
const QStringList &rowCategories,
const QStringList &columnCategories)
{
- d_ptr->m_rowRole = rowRole;
- d_ptr->m_columnRole = columnRole;
- d_ptr->m_valueRole = valueRole;
- d_ptr->m_rowCategories = rowCategories;
- d_ptr->m_columnCategories = columnCategories;
+ dptr()->m_rowRole = rowRole;
+ dptr()->m_columnRole = columnRole;
+ dptr()->m_valueRole = valueRole;
+ dptr()->m_rowCategories = rowCategories;
+ dptr()->m_columnCategories = columnCategories;
emit mappingChanged();
}
+QItemModelBarDataMappingPrivate *QItemModelBarDataMapping::dptr()
+{
+ return static_cast<QItemModelBarDataMappingPrivate *>(d_ptr.data());
+}
+
+const QItemModelBarDataMappingPrivate *QItemModelBarDataMapping::dptrc() const
+{
+ return static_cast<const QItemModelBarDataMappingPrivate *>(d_ptr.data());
+}
+
// QItemModelBarDataMappingPrivate
QItemModelBarDataMappingPrivate::QItemModelBarDataMappingPrivate(QItemModelBarDataMapping *q)
- : QObject(0),
- q_ptr(q)
+ : QAbstractDataMappingPrivate(q, QAbstractDataProxy::DataTypeBar)
{
}
@@ -193,5 +199,6 @@ QItemModelBarDataMappingPrivate::~QItemModelBarDataMappingPrivate()
{
}
+
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/qitemmodelbardatamapping.h b/src/datavis3d/data/qitemmodelbardatamapping.h
index 7ca3b64b..377cd1e7 100644
--- a/src/datavis3d/data/qitemmodelbardatamapping.h
+++ b/src/datavis3d/data/qitemmodelbardatamapping.h
@@ -20,20 +20,21 @@
#define QITEMMODELBARDATAMAPPING_H
#include <QtDataVis3D/qdatavis3denums.h>
+#include <QtDataVis3D/qabstractdatamapping.h>
#include <QStringList>
QT_DATAVIS3D_BEGIN_NAMESPACE
class QItemModelBarDataMappingPrivate;
-class QT_DATAVIS3D_EXPORT QItemModelBarDataMapping : public QObject
+class QT_DATAVIS3D_EXPORT QItemModelBarDataMapping : public QAbstractDataMapping
{
Q_OBJECT
- Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY mappingChanged)
- Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY mappingChanged)
- Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY mappingChanged)
- Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY mappingChanged)
- Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY mappingChanged)
+ Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole)
+ Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole)
+ Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole)
+ Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories)
+ Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories)
public:
explicit QItemModelBarDataMapping(QObject *parent = 0);
@@ -63,14 +64,14 @@ public:
const QString &valueRole, const QStringList &rowCategories,
const QStringList &columnCategories);
-signals:
- void mappingChanged();
+protected:
+ QItemModelBarDataMappingPrivate *dptr();
+ const QItemModelBarDataMappingPrivate *dptrc() const;
private:
- QScopedPointer<QItemModelBarDataMappingPrivate> d_ptr;
+ Q_DISABLE_COPY(QItemModelBarDataMapping)
};
-
QT_DATAVIS3D_END_NAMESPACE
#endif
diff --git a/src/datavis3d/data/qitemmodelbardatamapping_p.h b/src/datavis3d/data/qitemmodelbardatamapping_p.h
index fa1728e0..d7db8e62 100644
--- a/src/datavis3d/data/qitemmodelbardatamapping_p.h
+++ b/src/datavis3d/data/qitemmodelbardatamapping_p.h
@@ -27,13 +27,14 @@
// We mean it.
#include "qitemmodelbardatamapping.h"
+#include "qabstractdatamapping_p.h"
#ifndef QITEMMODELBARDATAMAPPING_P_H
#define QITEMMODELBARDATAMAPPING_P_H
QT_DATAVIS3D_BEGIN_NAMESPACE
-class QItemModelBarDataMappingPrivate : public QObject
+class QItemModelBarDataMappingPrivate : public QAbstractDataMappingPrivate
{
Q_OBJECT
public:
@@ -49,8 +50,6 @@ private:
QStringList m_rowCategories;
QStringList m_columnCategories;
- QItemModelBarDataMapping *q_ptr;
-
friend class QItemModelBarDataMapping;
};
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()
diff --git a/src/datavis3d/data/qitemmodelbardataproxy.h b/src/datavis3d/data/qitemmodelbardataproxy.h
index 660ed37d..dd9d8353 100644
--- a/src/datavis3d/data/qitemmodelbardataproxy.h
+++ b/src/datavis3d/data/qitemmodelbardataproxy.h
@@ -31,22 +31,27 @@ class QItemModelBarDataProxyPrivate;
class QT_DATAVIS3D_EXPORT QItemModelBarDataProxy : public QBarDataProxy
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
- Q_PROPERTY(QItemModelBarDataMapping* mapping READ mapping WRITE setMapping)
+ Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
+ Q_PROPERTY(QItemModelBarDataMapping* activeMapping READ activeMapping WRITE setActiveMapping)
public:
explicit QItemModelBarDataProxy();
- explicit QItemModelBarDataProxy(QAbstractItemModel *itemModel, QItemModelBarDataMapping *mapping);
+ explicit QItemModelBarDataProxy(const QAbstractItemModel *itemModel,
+ QItemModelBarDataMapping *mapping);
virtual ~QItemModelBarDataProxy();
- void setItemModel(QAbstractItemModel *itemModel);
- QAbstractItemModel *itemModel();
+ void setItemModel(const QAbstractItemModel *itemModel);
+ const QAbstractItemModel *itemModel() const;
- void setMapping(QItemModelBarDataMapping *mapping);
- QItemModelBarDataMapping *mapping();
+ void setActiveMapping(QItemModelBarDataMapping *mapping);
+ QItemModelBarDataMapping *activeMapping() const;
+ void addMapping(QItemModelBarDataMapping *mapping);
+ void releaseMapping(QItemModelBarDataMapping *mapping);
+ QList<QItemModelBarDataMapping *> mappings() const;
protected:
QItemModelBarDataProxyPrivate *dptr();
+ const QItemModelBarDataProxyPrivate *dptrc() const;
private:
Q_DISABLE_COPY(QItemModelBarDataProxy)
diff --git a/src/datavis3d/data/qitemmodelbardataproxy_p.h b/src/datavis3d/data/qitemmodelbardataproxy_p.h
index c69b1679..34ca128b 100644
--- a/src/datavis3d/data/qitemmodelbardataproxy_p.h
+++ b/src/datavis3d/data/qitemmodelbardataproxy_p.h
@@ -36,6 +36,8 @@
QT_DATAVIS3D_BEGIN_NAMESPACE
+class BarItemModelHandler;
+
class QItemModelBarDataProxyPrivate : public QBarDataProxyPrivate
{
Q_OBJECT
@@ -43,31 +45,10 @@ public:
QItemModelBarDataProxyPrivate(QItemModelBarDataProxy *q);
virtual ~QItemModelBarDataProxyPrivate();
- void setItemModel(QAbstractItemModel *itemModel);
- void setMapping(QItemModelBarDataMapping *mapping);
-
-public slots:
- void handleColumnsInserted(const QModelIndex & parent, int start, int end);
- void handleColumnsMoved(const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationColumn);
- void handleColumnsRemoved(const QModelIndex & parent, int start, int end);
- void handleDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector<int> & roles = QVector<int> ());
- void handleLayoutChanged(const QList<QPersistentModelIndex> & parents = QList<QPersistentModelIndex> (), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
- void handleModelReset();
- void handleRowsInserted(const QModelIndex & parent, int start, int end);
- void handleRowsMoved(const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationRow);
- void handleRowsRemoved(const QModelIndex & parent, int start, int end);
-
- void handleMappingChanged();
- void handlePendingResolve();
-
private:
- void resolveModel();
QItemModelBarDataProxy *qptr();
- QPointer<QAbstractItemModel> m_itemModel; // Not owned
- QPointer<QItemModelBarDataMapping> m_mapping; // Not owned
- bool resolvePending;
- QTimer m_resolveTimer;
+ BarItemModelHandler *m_itemModelHandler;
friend class QItemModelBarDataProxy;
};
diff --git a/src/datavis3d/data/qitemmodelmapdatamapping.h b/src/datavis3d/data/qitemmodelmapdatamapping.h
index 7587290c..6c6acdae 100644
--- a/src/datavis3d/data/qitemmodelmapdatamapping.h
+++ b/src/datavis3d/data/qitemmodelmapdatamapping.h
@@ -57,6 +57,7 @@ signals:
void mappingChanged();
private:
+ Q_DISABLE_COPY(QItemModelMapDataMapping)
QScopedPointer<QItemModelMapDataMappingPrivate> d_ptr;
};
diff --git a/src/datavis3d/data/qitemmodelmapdataproxy.cpp b/src/datavis3d/data/qitemmodelmapdataproxy.cpp
index 5a4e5a05..9d607645 100644
--- a/src/datavis3d/data/qitemmodelmapdataproxy.cpp
+++ b/src/datavis3d/data/qitemmodelmapdataproxy.cpp
@@ -48,7 +48,7 @@ QItemModelMapDataProxy::QItemModelMapDataProxy(QAbstractItemModel *itemModel,
QMapDataProxy(new QItemModelMapDataProxyPrivate(this))
{
dptr()->setItemModel(itemModel);
- dptr()->setMapping(mapping);
+ dptr()->setActiveMapping(mapping);
}
/*!
@@ -64,30 +64,30 @@ QItemModelMapDataProxy::~QItemModelMapDataProxy()
* Defines item model. Does not take ownership of the model, but does connect to it to listen for
* changes.
*/
-void QItemModelMapDataProxy::setItemModel(QAbstractItemModel *itemModel)
+void QItemModelMapDataProxy::setItemModel(const QAbstractItemModel *itemModel)
{
dptr()->setItemModel(itemModel);
}
-QAbstractItemModel *QItemModelMapDataProxy::itemModel()
+const QAbstractItemModel *QItemModelMapDataProxy::itemModel() const
{
- return dptr()->m_itemModel.data();
+ return dptrc()->m_itemModel.data();
}
/*!
- * \property QItemModelMapDataProxy::mapping
+ * \property QItemModelMapDataProxy::activeMapping
*
* 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 QItemModelMapDataProxy::setMapping(QItemModelMapDataMapping *mapping)
+void QItemModelMapDataProxy::setActiveMapping(QItemModelMapDataMapping *mapping)
{
- dptr()->setMapping(mapping);
+ dptr()->setActiveMapping(mapping);
}
-QItemModelMapDataMapping *QItemModelMapDataProxy::mapping()
+QItemModelMapDataMapping *QItemModelMapDataProxy::activeMapping() const
{
- return dptr()->m_mapping.data();
+ return dptrc()->m_mapping;
}
/*!
@@ -98,10 +98,16 @@ QItemModelMapDataProxyPrivate *QItemModelMapDataProxy::dptr()
return static_cast<QItemModelMapDataProxyPrivate *>(d_ptr.data());
}
+const QItemModelMapDataProxyPrivate *QItemModelMapDataProxy::dptrc() const
+{
+ return static_cast<const QItemModelMapDataProxyPrivate *>(d_ptr.data());
+}
+
// QItemModelMapDataProxyPrivate
QItemModelMapDataProxyPrivate::QItemModelMapDataProxyPrivate(QItemModelMapDataProxy *q)
: QMapDataProxyPrivate(q),
+ m_mapping(0),
resolvePending(0)
{
m_resolveTimer.setSingleShot(true);
@@ -113,7 +119,7 @@ QItemModelMapDataProxyPrivate::~QItemModelMapDataProxyPrivate()
{
}
-void QItemModelMapDataProxyPrivate::setItemModel(QAbstractItemModel *itemModel)
+void QItemModelMapDataProxyPrivate::setItemModel(const QAbstractItemModel *itemModel)
{
if (!m_itemModel.isNull())
QObject::disconnect(m_itemModel, 0, this, 0);
@@ -144,17 +150,17 @@ void QItemModelMapDataProxyPrivate::setItemModel(QAbstractItemModel *itemModel)
m_resolveTimer.start(0);
}
-void QItemModelMapDataProxyPrivate::setMapping(QItemModelMapDataMapping *mapping)
+void QItemModelMapDataProxyPrivate::setActiveMapping(QItemModelMapDataMapping *mapping)
{
- if (!m_mapping.isNull()) {
- QObject::disconnect(m_mapping.data(), &QItemModelMapDataMapping::mappingChanged,
+ if (m_mapping) {
+ QObject::disconnect(m_mapping, &QItemModelMapDataMapping::mappingChanged,
this, &QItemModelMapDataProxyPrivate::handleMappingChanged);
}
m_mapping = mapping;
- if (!m_mapping.isNull()) {
- QObject::connect(m_mapping.data(), &QItemModelMapDataMapping::mappingChanged,
+ if (m_mapping) {
+ QObject::connect(m_mapping, &QItemModelMapDataMapping::mappingChanged,
this, &QItemModelMapDataProxyPrivate::handleMappingChanged);
}
@@ -288,7 +294,7 @@ void QItemModelMapDataProxyPrivate::handlePendingResolve()
// Resolve entire item model into QMapDataArray.
void QItemModelMapDataProxyPrivate::resolveModel()
{
- if (m_itemModel.isNull() || m_mapping.isNull()) {
+ if (m_itemModel.isNull() || !m_mapping) {
qptr()->resetArray(0);
return;
}
diff --git a/src/datavis3d/data/qitemmodelmapdataproxy.h b/src/datavis3d/data/qitemmodelmapdataproxy.h
index d5b3cb59..6d817b46 100644
--- a/src/datavis3d/data/qitemmodelmapdataproxy.h
+++ b/src/datavis3d/data/qitemmodelmapdataproxy.h
@@ -31,22 +31,23 @@ class QItemModelMapDataProxyPrivate;
class QT_DATAVIS3D_EXPORT QItemModelMapDataProxy : public QMapDataProxy
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
- Q_PROPERTY(QItemModelMapDataMapping* mapping READ mapping WRITE setMapping)
+ Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
+ Q_PROPERTY(QItemModelMapDataMapping* activeMapping READ activeMapping WRITE setActiveMapping)
public:
explicit QItemModelMapDataProxy();
explicit QItemModelMapDataProxy(QAbstractItemModel *itemModel, QItemModelMapDataMapping *mapping);
virtual ~QItemModelMapDataProxy();
- void setItemModel(QAbstractItemModel *itemModel);
- QAbstractItemModel *itemModel();
+ void setItemModel(const QAbstractItemModel *itemModel);
+ const QAbstractItemModel *itemModel() const;
- void setMapping(QItemModelMapDataMapping *mapping);
- QItemModelMapDataMapping *mapping();
+ void setActiveMapping(QItemModelMapDataMapping *mapping);
+ QItemModelMapDataMapping *activeMapping() const;
protected:
QItemModelMapDataProxyPrivate *dptr();
+ const QItemModelMapDataProxyPrivate *dptrc() const;
private:
Q_DISABLE_COPY(QItemModelMapDataProxy)
diff --git a/src/datavis3d/data/qitemmodelmapdataproxy_p.h b/src/datavis3d/data/qitemmodelmapdataproxy_p.h
index 801cbc03..ce73c54b 100644
--- a/src/datavis3d/data/qitemmodelmapdataproxy_p.h
+++ b/src/datavis3d/data/qitemmodelmapdataproxy_p.h
@@ -43,8 +43,8 @@ public:
QItemModelMapDataProxyPrivate(QItemModelMapDataProxy *q);
virtual ~QItemModelMapDataProxyPrivate();
- void setItemModel(QAbstractItemModel *itemModel);
- void setMapping(QItemModelMapDataMapping *mapping);
+ void setItemModel(const QAbstractItemModel *itemModel);
+ void setActiveMapping(QItemModelMapDataMapping *mapping);
public slots:
void handleColumnsInserted(const QModelIndex &parent, int start, int end);
@@ -68,8 +68,8 @@ private:
void resolveModel();
QItemModelMapDataProxy *qptr();
- QPointer<QAbstractItemModel> m_itemModel; // Not owned
- QPointer<QItemModelMapDataMapping> m_mapping; // Not owned
+ QPointer<const QAbstractItemModel> m_itemModel; // Not owned
+ QItemModelMapDataMapping *m_mapping;
bool resolvePending;
QTimer m_resolveTimer;
diff --git a/src/datavis3d/data/qitemmodelscatterdatamapping.cpp b/src/datavis3d/data/qitemmodelscatterdatamapping.cpp
index b4a8e259..dca02bbf 100644
--- a/src/datavis3d/data/qitemmodelscatterdatamapping.cpp
+++ b/src/datavis3d/data/qitemmodelscatterdatamapping.cpp
@@ -38,8 +38,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
* Constructs QItemModelScatterDataMapping with the given \a parent.
*/
QItemModelScatterDataMapping::QItemModelScatterDataMapping(QObject *parent)
- : QObject(parent),
- d_ptr(new QItemModelScatterDataMappingPrivate(this))
+ : QAbstractDataMapping(new QItemModelScatterDataMappingPrivate(this), parent)
{
}
@@ -52,13 +51,12 @@ QItemModelScatterDataMapping::QItemModelScatterDataMapping(const QString &xPosRo
const QString &zPosRole,
const QString &valueRole,
QObject *parent)
- : QObject(parent),
- d_ptr(new QItemModelScatterDataMappingPrivate(this))
+ : QAbstractDataMapping(new QItemModelScatterDataMappingPrivate(this), parent)
{
Q_UNUSED(valueRole);
- d_ptr->m_xPosRole = xPosRole;
- d_ptr->m_yPosRole = yPosRole;
- d_ptr->m_zPosRole = zPosRole;
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
//d_ptr->m_valueRole = valueRole;
}
@@ -76,13 +74,13 @@ QItemModelScatterDataMapping::~QItemModelScatterDataMapping()
*/
void QItemModelScatterDataMapping::setXPosRole(const QString &role)
{
- d_ptr->m_xPosRole = role;
+ dptr()->m_xPosRole = role;
emit mappingChanged();
}
QString QItemModelScatterDataMapping::xPosRole() const
{
- return d_ptr->m_xPosRole;
+ return dptrc()->m_xPosRole;
}
/*!
@@ -92,13 +90,13 @@ QString QItemModelScatterDataMapping::xPosRole() const
*/
void QItemModelScatterDataMapping::setYPosRole(const QString &role)
{
- d_ptr->m_yPosRole = role;
+ dptr()->m_yPosRole = role;
emit mappingChanged();
}
QString QItemModelScatterDataMapping::yPosRole() const
{
- return d_ptr->m_yPosRole;
+ return dptrc()->m_yPosRole;
}
/*!
@@ -108,13 +106,13 @@ QString QItemModelScatterDataMapping::yPosRole() const
*/
void QItemModelScatterDataMapping::setZPosRole(const QString &role)
{
- d_ptr->m_zPosRole = role;
+ dptr()->m_zPosRole = role;
emit mappingChanged();
}
QString QItemModelScatterDataMapping::zPosRole() const
{
- return d_ptr->m_zPosRole;
+ return dptrc()->m_zPosRole;
}
//void QItemModelScatterDataMapping::setValueRole(const QString &role)
@@ -137,20 +135,29 @@ void QItemModelScatterDataMapping::remap(const QString &xPosRole, const QString
const QString &zPosRole, const QString &valueRole)
{
Q_UNUSED(valueRole);
- d_ptr->m_xPosRole = xPosRole;
- d_ptr->m_yPosRole = yPosRole;
- d_ptr->m_zPosRole = zPosRole;
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
//d_ptr->m_valueRole = valueRole;
emit mappingChanged();
}
+QItemModelScatterDataMappingPrivate *QItemModelScatterDataMapping::dptr()
+{
+ return static_cast<QItemModelScatterDataMappingPrivate *>(d_ptr.data());
+}
+
+const QItemModelScatterDataMappingPrivate *QItemModelScatterDataMapping::dptrc() const
+{
+ return static_cast<const QItemModelScatterDataMappingPrivate *>(d_ptr.data());
+}
+
// QItemModelScatterDataMappingPrivate
QItemModelScatterDataMappingPrivate::QItemModelScatterDataMappingPrivate(
QItemModelScatterDataMapping *q)
- : QObject(0),
- q_ptr(q)
+ : QAbstractDataMappingPrivate(q, QAbstractDataProxy::DataTypeScatter)
{
}
diff --git a/src/datavis3d/data/qitemmodelscatterdatamapping.h b/src/datavis3d/data/qitemmodelscatterdatamapping.h
index 7e5e998a..1a162b57 100644
--- a/src/datavis3d/data/qitemmodelscatterdatamapping.h
+++ b/src/datavis3d/data/qitemmodelscatterdatamapping.h
@@ -20,19 +20,20 @@
#define QITEMMODELSCATTERDATAMAPPING_H
#include <QtDataVis3D/qdatavis3denums.h>
+#include <QtDataVis3D/qabstractdatamapping.h>
#include <QObject>
QT_DATAVIS3D_BEGIN_NAMESPACE
class QItemModelScatterDataMappingPrivate;
-class QT_DATAVIS3D_EXPORT QItemModelScatterDataMapping : public QObject
+class QT_DATAVIS3D_EXPORT QItemModelScatterDataMapping : public QAbstractDataMapping
{
Q_OBJECT
- Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY mappingChanged)
- Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY mappingChanged)
- Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY mappingChanged)
- //Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY mappingChanged)
+ Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole)
+ Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole)
+ Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole)
+ //Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole)
public:
explicit QItemModelScatterDataMapping(QObject *parent = 0);
@@ -54,11 +55,12 @@ public:
void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole,
const QString &valueRole);
-signals:
- void mappingChanged();
+protected:
+ QItemModelScatterDataMappingPrivate *dptr();
+ const QItemModelScatterDataMappingPrivate *dptrc() const;
private:
- QScopedPointer<QItemModelScatterDataMappingPrivate> d_ptr;
+ Q_DISABLE_COPY(QItemModelScatterDataMapping)
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/qitemmodelscatterdatamapping_p.h b/src/datavis3d/data/qitemmodelscatterdatamapping_p.h
index 90a826c0..e88fa9be 100644
--- a/src/datavis3d/data/qitemmodelscatterdatamapping_p.h
+++ b/src/datavis3d/data/qitemmodelscatterdatamapping_p.h
@@ -27,13 +27,14 @@
// We mean it.
#include "qitemmodelscatterdatamapping.h"
+#include "qabstractdatamapping_p.h"
#ifndef QITEMMODELSCATTERDATAMAPPING_P_H
#define QITEMMODELSCATTERDATAMAPPING_P_H
QT_DATAVIS3D_BEGIN_NAMESPACE
-class QItemModelScatterDataMappingPrivate : public QObject
+class QItemModelScatterDataMappingPrivate : public QAbstractDataMappingPrivate
{
Q_OBJECT
public:
@@ -47,8 +48,6 @@ private:
QString m_zPosRole;
//QString m_valueRole;
- QItemModelScatterDataMapping *q_ptr;
-
friend class QItemModelScatterDataMapping;
};
diff --git a/src/datavis3d/data/qitemmodelscatterdataproxy.cpp b/src/datavis3d/data/qitemmodelscatterdataproxy.cpp
index b883f75b..c802d91d 100644
--- a/src/datavis3d/data/qitemmodelscatterdataproxy.cpp
+++ b/src/datavis3d/data/qitemmodelscatterdataproxy.cpp
@@ -17,6 +17,7 @@
****************************************************************************/
#include "qitemmodelscatterdataproxy_p.h"
+#include "scatteritemmodelhandler_p.h"
#include <QTimer>
QT_DATAVIS3D_BEGIN_NAMESPACE
@@ -43,12 +44,12 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy() :
* Constructs QItemModelScatterDataProxy 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.
*/
-QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel,
+QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
QItemModelScatterDataMapping *mapping) :
QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this))
{
- dptr()->setItemModel(itemModel);
- dptr()->setMapping(mapping);
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_itemModelHandler->setActiveMapping(mapping);
}
/*!
@@ -64,272 +65,75 @@ QItemModelScatterDataProxy::~QItemModelScatterDataProxy()
* Defines item model. Does not take ownership of the model, but does connect to it to listen for
* changes.
*/
-void QItemModelScatterDataProxy::setItemModel(QAbstractItemModel *itemModel)
+void QItemModelScatterDataProxy::setItemModel(const QAbstractItemModel *itemModel)
{
- dptr()->setItemModel(itemModel);
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
}
-QAbstractItemModel *QItemModelScatterDataProxy::itemModel()
+const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const
{
- return dptr()->m_itemModel.data();
+ return dptrc()->m_itemModelHandler->itemModel();
}
/*!
- * \property QItemModelScatterDataProxy::mapping
+ * \property QItemModelScatterDataProxy::activeMapping
*
* 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 QItemModelScatterDataProxy::setMapping(QItemModelScatterDataMapping *mapping)
+void QItemModelScatterDataProxy::setActiveMapping(QItemModelScatterDataMapping *mapping)
{
- dptr()->setMapping(mapping);
+ dptr()->m_itemModelHandler->setActiveMapping(mapping);
}
-QItemModelScatterDataMapping *QItemModelScatterDataProxy::mapping()
+QItemModelScatterDataMapping *QItemModelScatterDataProxy::activeMapping() const
{
- return dptr()->m_mapping.data();
+ return static_cast<QItemModelScatterDataMapping *>(dptrc()->m_itemModelHandler->activeMapping());
}
-/*!
- * \internal
- */
-QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::dptr()
+void QItemModelScatterDataProxy::addMapping(QItemModelScatterDataMapping *mapping)
{
- return static_cast<QItemModelScatterDataProxyPrivate *>(d_ptr.data());
+ dptr()->m_itemModelHandler->addMapping(mapping);
}
-// QItemModelScatterDataProxyPrivate
-
-QItemModelScatterDataProxyPrivate::QItemModelScatterDataProxyPrivate(QItemModelScatterDataProxy *q)
- : QScatterDataProxyPrivate(q),
- resolvePending(0)
+void QItemModelScatterDataProxy::releaseMapping(QItemModelScatterDataMapping *mapping)
{
- m_resolveTimer.setSingleShot(true);
- QObject::connect(&m_resolveTimer, &QTimer::timeout, this,
- &QItemModelScatterDataProxyPrivate::handlePendingResolve);
+ dptr()->m_itemModelHandler->releaseMapping(mapping);
}
-QItemModelScatterDataProxyPrivate::~QItemModelScatterDataProxyPrivate()
-{
-}
-
-void QItemModelScatterDataProxyPrivate::setItemModel(QAbstractItemModel *itemModel)
+QList<QItemModelScatterDataMapping *> QItemModelScatterDataProxy::mappings() const
{
- if (!m_itemModel.isNull())
- QObject::disconnect(m_itemModel, 0, this, 0);
+ QList<QItemModelScatterDataMapping *> retList;
+ QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings();
+ foreach (QAbstractDataMapping *mapping, abstractList)
+ retList.append(static_cast<QItemModelScatterDataMapping *>(mapping));
- m_itemModel = itemModel;
-
- if (!m_itemModel.isNull()) {
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsInserted, this,
- &QItemModelScatterDataProxyPrivate::handleColumnsInserted);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsMoved, this,
- &QItemModelScatterDataProxyPrivate::handleColumnsMoved);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsRemoved, this,
- &QItemModelScatterDataProxyPrivate::handleColumnsRemoved);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::dataChanged, this,
- &QItemModelScatterDataProxyPrivate::handleDataChanged);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::layoutChanged, this,
- &QItemModelScatterDataProxyPrivate::handleLayoutChanged);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::modelReset, this,
- &QItemModelScatterDataProxyPrivate::handleModelReset);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsInserted, this,
- &QItemModelScatterDataProxyPrivate::handleRowsInserted);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsMoved, this,
- &QItemModelScatterDataProxyPrivate::handleRowsMoved);
- QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsRemoved, this,
- &QItemModelScatterDataProxyPrivate::handleRowsRemoved);
- }
- if (!m_resolveTimer.isActive())
- m_resolveTimer.start(0);
+ return retList;
}
-void QItemModelScatterDataProxyPrivate::setMapping(QItemModelScatterDataMapping *mapping)
-{
- if (!m_mapping.isNull())
- QObject::disconnect(m_mapping.data(), &QItemModelScatterDataMapping::mappingChanged, this,
- &QItemModelScatterDataProxyPrivate::handleMappingChanged);
-
- m_mapping = mapping;
-
- if (!m_mapping.isNull())
- QObject::connect(m_mapping.data(), &QItemModelScatterDataMapping::mappingChanged, this,
- &QItemModelScatterDataProxyPrivate::handleMappingChanged);
-
- if (!m_resolveTimer.isActive())
- m_resolveTimer.start(0);
-}
-
-void QItemModelScatterDataProxyPrivate::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 QItemModelScatterDataProxyPrivate::handleColumnsMoved(const QModelIndex &sourceParent,
- int sourceStart, int sourceEnd,
- const QModelIndex &destinationParent,
- int destinationColumn)
-{
- 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
-}
-
-void QItemModelScatterDataProxyPrivate::handleColumnsRemoved(const QModelIndex &parent,
- int start, int end)
-{
- 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
-}
-
-void QItemModelScatterDataProxyPrivate::handleDataChanged(const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles)
-{
- Q_UNUSED(topLeft)
- Q_UNUSED(bottomRight)
- Q_UNUSED(roles)
-
- // Resolve changed items
- if (!m_resolveTimer.isActive())
- m_resolveTimer.start(0); // TODO Resolving entire model is inefficient
-}
-
-void QItemModelScatterDataProxyPrivate::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 QItemModelScatterDataProxyPrivate::handleModelReset()
-{
- // Data cleared, reset array
- if (!m_resolveTimer.isActive())
- m_resolveTimer.start(0); // TODO Resolving entire model is inefficient
-}
-
-void QItemModelScatterDataProxyPrivate::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 QItemModelScatterDataProxyPrivate::handleRowsMoved(const QModelIndex &sourceParent,
- int sourceStart, int sourceEnd,
- const QModelIndex &destinationParent,
- int destinationRow)
+/*!
+ * \internal
+ */
+QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::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<QItemModelScatterDataProxyPrivate *>(d_ptr.data());
}
-void QItemModelScatterDataProxyPrivate::handleRowsRemoved(const QModelIndex &parent,
- int start, int end)
+const QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::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 QItemModelScatterDataProxyPrivate *>(d_ptr.data());
}
-void QItemModelScatterDataProxyPrivate::handleMappingChanged()
-{
- if (!m_resolveTimer.isActive())
- m_resolveTimer.start(0);
-}
+// QItemModelScatterDataProxyPrivate
-void QItemModelScatterDataProxyPrivate::handlePendingResolve()
+QItemModelScatterDataProxyPrivate::QItemModelScatterDataProxyPrivate(QItemModelScatterDataProxy *q)
+ : QScatterDataProxyPrivate(q),
+ m_itemModelHandler(new ScatterItemModelHandler(q))
{
- resolveModel();
}
-// Resolve entire item model into QScatterDataArray.
-void QItemModelScatterDataProxyPrivate::resolveModel()
+QItemModelScatterDataProxyPrivate::~QItemModelScatterDataProxyPrivate()
{
- if (m_itemModel.isNull() || m_mapping.isNull()) {
- qptr()->resetArray(0);
- return;
- }
-
- static const int noRoleIndex = -1;
-
- QHash<int, QByteArray> roleHash = m_itemModel->roleNames();
- //const int labelRole = roleHash.key(m_mapping->labelRole().toLatin1(), noRoleIndex);
- const int xPosRole = roleHash.key(m_mapping->xPosRole().toLatin1(), noRoleIndex);
- const int yPosRole = roleHash.key(m_mapping->yPosRole().toLatin1(), noRoleIndex);
- const int zPosRole = roleHash.key(m_mapping->zPosRole().toLatin1(), noRoleIndex);
- // Default valueRole to display role if no mapping
- //const int valueRole = roleHash.key(m_mapping->valueRole().toLatin1(), Qt::DisplayRole);
- const int columnCount = m_itemModel->columnCount();
- const int rowCount = m_itemModel->rowCount();
- const int totalCount = rowCount * columnCount;
- int runningCount = 0;
-
- // Parse data into newProxyArray
- QScatterDataArray *newProxyArray = new QScatterDataArray(totalCount);
- for (int i = 0; i < rowCount; i++) {
- for (int j = 0; j < columnCount; j++) {
- QModelIndex index = m_itemModel->index(i, j);
- //if (labelRole != noRoleIndex)
- // (*newProxyArray)[runningCount].setLabel(index.data(labelRole).toString());
- float xPos(0.0f);
- float yPos(0.0f);
- float zPos(0.0f);
- if (xPosRole != noRoleIndex)
- xPos = index.data(xPosRole).toFloat();
- if (yPosRole != noRoleIndex)
- yPos = index.data(yPosRole).toFloat();
- if (zPosRole != noRoleIndex)
- zPos = index.data(zPosRole).toFloat();
- (*newProxyArray)[runningCount].setPosition(QVector3D(xPos, yPos, zPos));
- //(*newProxyArray)[runningCount].setValue(index.data(valueRole).toReal());
- runningCount++;
- }
- }
-
- qDebug() << __FUNCTION__ << "Total count:" << newProxyArray->size();
-
- qptr()->resetArray(newProxyArray);
}
QItemModelScatterDataProxy *QItemModelScatterDataProxyPrivate::qptr()
diff --git a/src/datavis3d/data/qitemmodelscatterdataproxy.h b/src/datavis3d/data/qitemmodelscatterdataproxy.h
index 3389c874..c5cb73a5 100644
--- a/src/datavis3d/data/qitemmodelscatterdataproxy.h
+++ b/src/datavis3d/data/qitemmodelscatterdataproxy.h
@@ -31,23 +31,27 @@ class QItemModelScatterDataProxyPrivate;
class QT_DATAVIS3D_EXPORT QItemModelScatterDataProxy : public QScatterDataProxy
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
- Q_PROPERTY(QItemModelScatterDataMapping* mapping READ mapping WRITE setMapping)
+ Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel)
+ Q_PROPERTY(QItemModelScatterDataMapping* activeMapping READ activeMapping WRITE setActiveMapping)
public:
explicit QItemModelScatterDataProxy();
- explicit QItemModelScatterDataProxy(QAbstractItemModel *itemModel,
+ explicit QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
QItemModelScatterDataMapping *mapping);
virtual ~QItemModelScatterDataProxy();
- void setItemModel(QAbstractItemModel *itemModel);
- QAbstractItemModel *itemModel();
+ void setItemModel(const QAbstractItemModel *itemModel);
+ const QAbstractItemModel *itemModel() const;
- void setMapping(QItemModelScatterDataMapping *mapping);
- QItemModelScatterDataMapping *mapping();
+ void setActiveMapping(QItemModelScatterDataMapping *mapping);
+ QItemModelScatterDataMapping *activeMapping() const;
+ void addMapping(QItemModelScatterDataMapping *mapping);
+ void releaseMapping(QItemModelScatterDataMapping *mapping);
+ QList<QItemModelScatterDataMapping *> mappings() const;
protected:
QItemModelScatterDataProxyPrivate *dptr();
+ const QItemModelScatterDataProxyPrivate *dptrc() const;
private:
Q_DISABLE_COPY(QItemModelScatterDataProxy)
diff --git a/src/datavis3d/data/qitemmodelscatterdataproxy_p.h b/src/datavis3d/data/qitemmodelscatterdataproxy_p.h
index aed3d974..6fee2f80 100644
--- a/src/datavis3d/data/qitemmodelscatterdataproxy_p.h
+++ b/src/datavis3d/data/qitemmodelscatterdataproxy_p.h
@@ -36,6 +36,8 @@
QT_DATAVIS3D_BEGIN_NAMESPACE
+class ScatterItemModelHandler;
+
class QItemModelScatterDataProxyPrivate : public QScatterDataProxyPrivate
{
Q_OBJECT
@@ -43,35 +45,10 @@ public:
QItemModelScatterDataProxyPrivate(QItemModelScatterDataProxy *q);
virtual ~QItemModelScatterDataProxyPrivate();
- void setItemModel(QAbstractItemModel *itemModel);
- void setMapping(QItemModelScatterDataMapping *mapping);
-
-public slots:
- void handleColumnsInserted(const QModelIndex &parent, int start, int end);
- void handleColumnsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
- const QModelIndex &destinationParent, int destinationColumn);
- void handleColumnsRemoved(const QModelIndex &parent, int start, int end);
- void handleDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
- const QVector<int> &roles = QVector<int> ());
- void handleLayoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex> (),
- QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
- void handleModelReset();
- void handleRowsInserted(const QModelIndex &parent, int start, int end);
- void handleRowsMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd,
- const QModelIndex &destinationParent, int destinationRow);
- void handleRowsRemoved(const QModelIndex &parent, int start, int end);
-
- void handleMappingChanged();
- void handlePendingResolve();
-
private:
- void resolveModel();
QItemModelScatterDataProxy *qptr();
- QPointer<QAbstractItemModel> m_itemModel; // Not owned
- QPointer<QItemModelScatterDataMapping> m_mapping; // Not owned
- bool resolvePending;
- QTimer m_resolveTimer;
+ ScatterItemModelHandler *m_itemModelHandler;
friend class QItemModelScatterDataProxy;
};
diff --git a/src/datavis3d/data/scatteritemmodelhandler.cpp b/src/datavis3d/data/scatteritemmodelhandler.cpp
new file mode 100644
index 00000000..57b83f94
--- /dev/null
+++ b/src/datavis3d/data/scatteritemmodelhandler.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "scatteritemmodelhandler_p.h"
+#include <QTimer>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+ScatterItemModelHandler::ScatterItemModelHandler(QItemModelScatterDataProxy *proxy, QObject *parent)
+ : AbstractItemModelHandler(parent),
+ m_proxy(proxy)
+{
+}
+
+ScatterItemModelHandler::~ScatterItemModelHandler()
+{
+}
+
+// Resolve entire item model into QScatterDataArray.
+void ScatterItemModelHandler::resolveModel()
+{
+ QItemModelScatterDataMapping *mapping = static_cast<QItemModelScatterDataMapping *>(m_activeMapping);
+ if (m_itemModel.isNull() || !mapping) {
+ m_proxy->resetArray(0);
+ return;
+ }
+
+ static const int noRoleIndex = -1;
+
+ QHash<int, QByteArray> roleHash = m_itemModel->roleNames();
+ //const int labelRole = roleHash.key(mapping->labelRole().toLatin1(), noRoleIndex);
+ const int xPosRole = roleHash.key(mapping->xPosRole().toLatin1(), noRoleIndex);
+ const int yPosRole = roleHash.key(mapping->yPosRole().toLatin1(), noRoleIndex);
+ const int zPosRole = roleHash.key(mapping->zPosRole().toLatin1(), noRoleIndex);
+ // Default valueRole to display role if no mapping
+ //const int valueRole = roleHash.key(mapping->valueRole().toLatin1(), Qt::DisplayRole);
+ const int columnCount = m_itemModel->columnCount();
+ const int rowCount = m_itemModel->rowCount();
+ const int totalCount = rowCount * columnCount;
+ int runningCount = 0;
+
+ // Parse data into newProxyArray
+ QScatterDataArray *newProxyArray = new QScatterDataArray(totalCount);
+ for (int i = 0; i < rowCount; i++) {
+ for (int j = 0; j < columnCount; j++) {
+ QModelIndex index = m_itemModel->index(i, j);
+ //if (labelRole != noRoleIndex)
+ // (*newProxyArray)[runningCount].setLabel(index.data(labelRole).toString());
+ float xPos(0.0f);
+ float yPos(0.0f);
+ float zPos(0.0f);
+ if (xPosRole != noRoleIndex)
+ xPos = index.data(xPosRole).toFloat();
+ if (yPosRole != noRoleIndex)
+ yPos = index.data(yPosRole).toFloat();
+ if (zPosRole != noRoleIndex)
+ zPos = index.data(zPosRole).toFloat();
+ (*newProxyArray)[runningCount].setPosition(QVector3D(xPos, yPos, zPos));
+ //(*newProxyArray)[runningCount].setValue(index.data(valueRole).toReal());
+ runningCount++;
+ }
+ }
+
+ m_proxy->resetArray(newProxyArray);
+}
+
+QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/scatteritemmodelhandler_p.h b/src/datavis3d/data/scatteritemmodelhandler_p.h
new file mode 100644
index 00000000..f5b01994
--- /dev/null
+++ b/src/datavis3d/data/scatteritemmodelhandler_p.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVis3D module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVis3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef SCATTERITEMMODELHANDLER_P_H
+#define SCATTERITEMMODELHANDLER_P_H
+
+#include "abstractitemmodelhandler_p.h"
+#include "qitemmodelscatterdataproxy.h"
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class ScatterItemModelHandler : public AbstractItemModelHandler
+{
+ Q_OBJECT
+public:
+ ScatterItemModelHandler(QItemModelScatterDataProxy *proxy, QObject *parent = 0);
+ virtual ~ScatterItemModelHandler();
+
+protected:
+ void virtual resolveModel();
+
+ QItemModelScatterDataProxy *m_proxy; // Not owned
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3dqml2/datavis3dqml2_plugin.cpp b/src/datavis3dqml2/datavis3dqml2_plugin.cpp
index a2e755a9..bfd79806 100644
--- a/src/datavis3dqml2/datavis3dqml2_plugin.cpp
+++ b/src/datavis3dqml2/datavis3dqml2_plugin.cpp
@@ -25,7 +25,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
void Datavis3Dqml2Plugin::registerTypes(const char *uri)
{
// @uri com.digia.QtDataVis3D
- qmlRegisterUncreatableType<QAbstractItemModel>(uri, 1, 0, "AbstractItemModel",
+ qmlRegisterUncreatableType<const QAbstractItemModel>(uri, 1, 0, "AbstractItemModel",
QLatin1String("Trying to create uncreatable: AbstractItemModel."));
qmlRegisterUncreatableType<QDataVis>(uri, 1, 0, "DataVis",
QLatin1String("Trying to create uncreatable: DataVis."));
diff --git a/src/datavis3dqml2/datavis3dqml2_plugin.h b/src/datavis3dqml2/datavis3dqml2_plugin.h
index bb967cf0..57d67680 100644
--- a/src/datavis3dqml2/datavis3dqml2_plugin.h
+++ b/src/datavis3dqml2/datavis3dqml2_plugin.h
@@ -40,7 +40,7 @@ Q_DECLARE_METATYPE(DeclarativeScatter *)
Q_DECLARE_METATYPE(QItemModelBarDataMapping *)
Q_DECLARE_METATYPE(QItemModelMapDataMapping *)
Q_DECLARE_METATYPE(QItemModelScatterDataMapping *)
-Q_DECLARE_METATYPE(QAbstractItemModel *)
+Q_DECLARE_METATYPE(const QAbstractItemModel *)
Q_DECLARE_METATYPE(QDataVis *)
Q_DECLARE_METATYPE(QAbstractAxis *)
diff --git a/src/datavis3dqml2/declarativebars.cpp b/src/datavis3dqml2/declarativebars.cpp
index 5210990d..d1c4d198 100644
--- a/src/datavis3dqml2/declarativebars.cpp
+++ b/src/datavis3dqml2/declarativebars.cpp
@@ -110,19 +110,19 @@ void DeclarativeBars::setCameraPosition(qreal horizontal, qreal vertical, int di
m_shared->setCameraPosition(GLfloat(horizontal), GLfloat(vertical), GLint(distance));
}
-void DeclarativeBars::setData(QAbstractItemModel *data)
+void DeclarativeBars::setData(const QAbstractItemModel *data)
{
static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->setItemModel(data);
}
-QAbstractItemModel *DeclarativeBars::data()
+const QAbstractItemModel *DeclarativeBars::data() const
{
- return static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->itemModel();
+ return static_cast<const QItemModelBarDataProxy *>(m_shared->activeDataProxy())->itemModel();
}
void DeclarativeBars::setMapping(QItemModelBarDataMapping *mapping)
{
- static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->setMapping(mapping);
+ static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->setActiveMapping(mapping);
}
QCategoryAxis *DeclarativeBars::rowAxis() const
@@ -157,7 +157,7 @@ void DeclarativeBars::setColumnAxis(QCategoryAxis *axis)
QItemModelBarDataMapping *DeclarativeBars::mapping() const
{
- return static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->mapping();
+ return static_cast<QItemModelBarDataProxy *>(m_shared->activeDataProxy())->activeMapping();
}
void DeclarativeBars::setBarThickness(qreal thicknessRatio)
diff --git a/src/datavis3dqml2/declarativebars_p.h b/src/datavis3dqml2/declarativebars_p.h
index 9ce15110..877af645 100644
--- a/src/datavis3dqml2/declarativebars_p.h
+++ b/src/datavis3dqml2/declarativebars_p.h
@@ -46,7 +46,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
class DeclarativeBars : public QQuickItem
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel *data READ data WRITE setData)
+ Q_PROPERTY(const QAbstractItemModel *data READ data WRITE setData)
Q_PROPERTY(QItemModelBarDataMapping *mapping READ mapping WRITE setMapping)
Q_PROPERTY(QCategoryAxis *rowAxis READ rowAxis WRITE setRowAxis)
Q_PROPERTY(QValueAxis *valueAxis READ valueAxis WRITE setValueAxis)
@@ -97,8 +97,8 @@ public:
Q_INVOKABLE void setCameraPosition(qreal horizontal, qreal vertical, int distance);
// Add whole data set.
- void setData(QAbstractItemModel *data);
- QAbstractItemModel *data();
+ void setData(const QAbstractItemModel *data);
+ const QAbstractItemModel *data() const;
QItemModelBarDataMapping *mapping() const;
void setMapping(QItemModelBarDataMapping *mapping);
diff --git a/src/datavis3dqml2/declarativemaps.cpp b/src/datavis3dqml2/declarativemaps.cpp
index f90eadd4..a3346a0a 100644
--- a/src/datavis3dqml2/declarativemaps.cpp
+++ b/src/datavis3dqml2/declarativemaps.cpp
@@ -79,14 +79,14 @@ QSGNode *DeclarativeMaps::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData
return node;
}
-void DeclarativeMaps::setData(QAbstractItemModel *data)
+void DeclarativeMaps::setData(const QAbstractItemModel *data)
{
static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->setItemModel(data);
}
-QAbstractItemModel *DeclarativeMaps::data()
+const QAbstractItemModel *DeclarativeMaps::data() const
{
- return static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->itemModel();
+ return static_cast<const QItemModelMapDataProxy *>(m_shared->dataProxy())->itemModel();
}
void DeclarativeMaps::setBarSpecs(const QVector3D &thickness,
@@ -182,12 +182,12 @@ QDataVis::ShadowQuality DeclarativeMaps::shadowQuality()
QItemModelMapDataMapping *DeclarativeMaps::mapping() const
{
- return static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->mapping();
+ return static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->activeMapping();
}
void DeclarativeMaps::setMapping(QItemModelMapDataMapping *mapping)
{
- static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->setMapping(mapping);
+ static_cast<QItemModelMapDataProxy *>(m_shared->dataProxy())->setActiveMapping(mapping);
}
void DeclarativeMaps::mouseDoubleClickEvent(QMouseEvent *event)
diff --git a/src/datavis3dqml2/declarativemaps_p.h b/src/datavis3dqml2/declarativemaps_p.h
index 8cc43b50..86428f51 100644
--- a/src/datavis3dqml2/declarativemaps_p.h
+++ b/src/datavis3dqml2/declarativemaps_p.h
@@ -43,7 +43,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
class DeclarativeMaps : public QQuickItem
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel *data READ data WRITE setData)
+ Q_PROPERTY(const QAbstractItemModel *data READ data WRITE setData)
Q_PROPERTY(QtDataVis3D::QDataVis::SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
Q_PROPERTY(QtDataVis3D::QDataVis::LabelTransparency labelTransparency READ labelTransparency WRITE setLabelTransparency)
Q_PROPERTY(QtDataVis3D::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality)
@@ -60,8 +60,8 @@ public:
void classBegin();
void componentComplete();
- void setData(QAbstractItemModel *data);
- QAbstractItemModel *data();
+ void setData(const QAbstractItemModel *data);
+ const QAbstractItemModel *data() const;
// bar specifications; base thickness in x, y and z, enum to indicate which direction is increased with value
// TODO: Start using thickness also in adjustment direction; use it as a relative value.
diff --git a/src/datavis3dqml2/declarativescatter.cpp b/src/datavis3dqml2/declarativescatter.cpp
index c0a2401b..c6744f17 100644
--- a/src/datavis3dqml2/declarativescatter.cpp
+++ b/src/datavis3dqml2/declarativescatter.cpp
@@ -100,24 +100,24 @@ void DeclarativeScatter::setObjectColor(const QColor &baseColor, const QColor &h
m_shared->setObjectColor(baseColor, heightColor, depthColor, uniform);
}
-void DeclarativeScatter::setData(QAbstractItemModel *data)
+void DeclarativeScatter::setData(const QAbstractItemModel *data)
{
static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->setItemModel(data);
}
-QAbstractItemModel *DeclarativeScatter::data()
+const QAbstractItemModel *DeclarativeScatter::data() const
{
- return static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->itemModel();
+ return static_cast<const QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->itemModel();
}
void DeclarativeScatter::setMapping(QItemModelScatterDataMapping *mapping)
{
- static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->setMapping(mapping);
+ static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->setActiveMapping(mapping);
}
QItemModelScatterDataMapping *DeclarativeScatter::mapping() const
{
- return static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->mapping();
+ return static_cast<QItemModelScatterDataProxy *>(m_shared->activeDataProxy())->activeMapping();
}
QValueAxis *DeclarativeScatter::axisX() const
diff --git a/src/datavis3dqml2/declarativescatter_p.h b/src/datavis3dqml2/declarativescatter_p.h
index dc538add..449e99ad 100644
--- a/src/datavis3dqml2/declarativescatter_p.h
+++ b/src/datavis3dqml2/declarativescatter_p.h
@@ -44,7 +44,7 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
class DeclarativeScatter : public QQuickItem
{
Q_OBJECT
- Q_PROPERTY(QAbstractItemModel *data READ data WRITE setData)
+ Q_PROPERTY(const QAbstractItemModel *data READ data WRITE setData)
Q_PROPERTY(QItemModelScatterDataMapping *mapping READ mapping WRITE setMapping)
Q_PROPERTY(QValueAxis *axisX READ axisX WRITE setAxisX)
Q_PROPERTY(QValueAxis *axisY READ axisY WRITE setAxisY)
@@ -85,8 +85,8 @@ public:
const QColor &depthColor, bool uniform = true);
// Add whole data set.
- void setData(QAbstractItemModel *data);
- QAbstractItemModel *data();
+ void setData(const QAbstractItemModel *data);
+ const QAbstractItemModel *data() const;
QItemModelScatterDataMapping *mapping() const;
void setMapping(QItemModelScatterDataMapping *mapping);