From 15f8c86385a055d35b07519e4bf8c8f1aa915ea3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 Aug 2013 11:57:40 +0300 Subject: Refactor item model mapping and proxies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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ää --- examples/barchart/main.cpp | 3 +- examples/qmlbarchart/qml/qmlbarchart/main.qml | 6 +- src/datavis3d/data/abstractitemmodelhandler.cpp | 250 ++++++++++++++++++ src/datavis3d/data/abstractitemmodelhandler_p.h | 90 +++++++ src/datavis3d/data/baritemmodelhandler.cpp | 94 +++++++ src/datavis3d/data/baritemmodelhandler_p.h | 52 ++++ src/datavis3d/data/data.pri | 13 +- src/datavis3d/data/qabstractdatamapping.cpp | 63 +++++ src/datavis3d/data/qabstractdatamapping.h | 54 ++++ src/datavis3d/data/qabstractdatamapping_p.h | 50 ++++ src/datavis3d/data/qitemmodelbardatamapping.cpp | 65 ++--- src/datavis3d/data/qitemmodelbardatamapping.h | 21 +- src/datavis3d/data/qitemmodelbardatamapping_p.h | 5 +- src/datavis3d/data/qitemmodelbardataproxy.cpp | 282 +++------------------ src/datavis3d/data/qitemmodelbardataproxy.h | 19 +- src/datavis3d/data/qitemmodelbardataproxy_p.h | 25 +- src/datavis3d/data/qitemmodelmapdatamapping.h | 1 + src/datavis3d/data/qitemmodelmapdataproxy.cpp | 38 +-- src/datavis3d/data/qitemmodelmapdataproxy.h | 13 +- src/datavis3d/data/qitemmodelmapdataproxy_p.h | 8 +- .../data/qitemmodelscatterdatamapping.cpp | 43 ++-- src/datavis3d/data/qitemmodelscatterdatamapping.h | 18 +- .../data/qitemmodelscatterdatamapping_p.h | 5 +- src/datavis3d/data/qitemmodelscatterdataproxy.cpp | 266 +++---------------- src/datavis3d/data/qitemmodelscatterdataproxy.h | 18 +- src/datavis3d/data/qitemmodelscatterdataproxy_p.h | 29 +-- src/datavis3d/data/scatteritemmodelhandler.cpp | 82 ++++++ src/datavis3d/data/scatteritemmodelhandler_p.h | 52 ++++ src/datavis3dqml2/datavis3dqml2_plugin.cpp | 2 +- src/datavis3dqml2/datavis3dqml2_plugin.h | 2 +- src/datavis3dqml2/declarativebars.cpp | 10 +- src/datavis3dqml2/declarativebars_p.h | 6 +- src/datavis3dqml2/declarativemaps.cpp | 10 +- src/datavis3dqml2/declarativemaps_p.h | 6 +- src/datavis3dqml2/declarativescatter.cpp | 10 +- src/datavis3dqml2/declarativescatter_p.h | 6 +- 36 files changed, 1051 insertions(+), 666 deletions(-) create mode 100644 src/datavis3d/data/abstractitemmodelhandler.cpp create mode 100644 src/datavis3d/data/abstractitemmodelhandler_p.h create mode 100644 src/datavis3d/data/baritemmodelhandler.cpp create mode 100644 src/datavis3d/data/baritemmodelhandler_p.h create mode 100644 src/datavis3d/data/qabstractdatamapping.cpp create mode 100644 src/datavis3d/data/qabstractdatamapping.h create mode 100644 src/datavis3d/data/qabstractdatamapping_p.h create mode 100644 src/datavis3d/data/scatteritemmodelhandler.cpp create mode 100644 src/datavis3d/data/scatteritemmodelhandler_p.h 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 + +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(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 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 &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 &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 +#include +#include + +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 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 &roles = QVector ()); + virtual void handleLayoutChanged(const QList &parents = QList(), + 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 m_itemModel; // Not owned + QAbstractDataMapping *m_activeMapping; + bool resolvePending; + QTimer m_resolveTimer; + QList 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 + +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(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 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 ColumnValueMap; + QHash 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 +#include + +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 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(d_ptr.data()); +} + +const QItemModelBarDataMappingPrivate *QItemModelBarDataMapping::dptrc() const +{ + return static_cast(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 +#include #include 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 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 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(dptrc()->m_itemModelHandler->activeMapping()); } -/*! - * \internal - */ -QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptr() -{ - return static_cast(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 &roles) +QList QItemModelBarDataProxy::mappings() const { - Q_UNUSED(topLeft) - Q_UNUSED(bottomRight) - Q_UNUSED(roles) + QList retList; + QList abstractList = dptrc()->m_itemModelHandler->mappings(); + foreach (QAbstractDataMapping *mapping, abstractList) + retList.append(static_cast(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 &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(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(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 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 ColumnValueMap; - QHash 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 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 & roles = QVector ()); - void handleLayoutChanged(const QList & parents = QList (), 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 m_itemModel; // Not owned - QPointer 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 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(d_ptr.data()); } +const QItemModelMapDataProxyPrivate *QItemModelMapDataProxy::dptrc() const +{ + return static_cast(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 m_itemModel; // Not owned - QPointer m_mapping; // Not owned + QPointer 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(d_ptr.data()); +} + +const QItemModelScatterDataMappingPrivate *QItemModelScatterDataMapping::dptrc() const +{ + return static_cast(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 +#include #include 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 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 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(dptrc()->m_itemModelHandler->activeMapping()); } -/*! - * \internal - */ -QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::dptr() +void QItemModelScatterDataProxy::addMapping(QItemModelScatterDataMapping *mapping) { - return static_cast(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 QItemModelScatterDataProxy::mappings() const { - if (!m_itemModel.isNull()) - QObject::disconnect(m_itemModel, 0, this, 0); + QList retList; + QList abstractList = dptrc()->m_itemModelHandler->mappings(); + foreach (QAbstractDataMapping *mapping, abstractList) + retList.append(static_cast(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 &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 &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(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(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 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 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 &roles = QVector ()); - void handleLayoutChanged(const QList &parents = QList (), - 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 m_itemModel; // Not owned - QPointer 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 + +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(m_activeMapping); + if (m_itemModel.isNull() || !mapping) { + m_proxy->resetArray(0); + return; + } + + static const int noRoleIndex = -1; + + QHash 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(uri, 1, 0, "AbstractItemModel", + qmlRegisterUncreatableType(uri, 1, 0, "AbstractItemModel", QLatin1String("Trying to create uncreatable: AbstractItemModel.")); qmlRegisterUncreatableType(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(m_shared->activeDataProxy())->setItemModel(data); } -QAbstractItemModel *DeclarativeBars::data() +const QAbstractItemModel *DeclarativeBars::data() const { - return static_cast(m_shared->activeDataProxy())->itemModel(); + return static_cast(m_shared->activeDataProxy())->itemModel(); } void DeclarativeBars::setMapping(QItemModelBarDataMapping *mapping) { - static_cast(m_shared->activeDataProxy())->setMapping(mapping); + static_cast(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(m_shared->activeDataProxy())->mapping(); + return static_cast(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(m_shared->dataProxy())->setItemModel(data); } -QAbstractItemModel *DeclarativeMaps::data() +const QAbstractItemModel *DeclarativeMaps::data() const { - return static_cast(m_shared->dataProxy())->itemModel(); + return static_cast(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(m_shared->dataProxy())->mapping(); + return static_cast(m_shared->dataProxy())->activeMapping(); } void DeclarativeMaps::setMapping(QItemModelMapDataMapping *mapping) { - static_cast(m_shared->dataProxy())->setMapping(mapping); + static_cast(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(m_shared->activeDataProxy())->setItemModel(data); } -QAbstractItemModel *DeclarativeScatter::data() +const QAbstractItemModel *DeclarativeScatter::data() const { - return static_cast(m_shared->activeDataProxy())->itemModel(); + return static_cast(m_shared->activeDataProxy())->itemModel(); } void DeclarativeScatter::setMapping(QItemModelScatterDataMapping *mapping) { - static_cast(m_shared->activeDataProxy())->setMapping(mapping); + static_cast(m_shared->activeDataProxy())->setActiveMapping(mapping); } QItemModelScatterDataMapping *DeclarativeScatter::mapping() const { - return static_cast(m_shared->activeDataProxy())->mapping(); + return static_cast(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); -- cgit v1.2.3