summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/data/surfaceitemmodelhandler.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-13 13:56:22 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-16 09:48:31 +0300
commit73ffd814281d9fa07f5d25b2b3a8ce04a011780c (patch)
tree99cfff8e2cc95b0366b582bf912c0f9ff47f2382 /src/datavisualization/data/surfaceitemmodelhandler.cpp
parentcff52478831a7653514fb382c27db0faba395c7c (diff)
Automatic row/col categories for bar and surface item model mappers
Task-number: QTRD-2271 Change-Id: I571e4010f3780722564f06c06bcc346d5803c646 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/data/surfaceitemmodelhandler.cpp')
-rw-r--r--src/datavisualization/data/surfaceitemmodelhandler.cpp45
1 files changed, 35 insertions, 10 deletions
diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp
index 911e2995..124fe640 100644
--- a/src/datavisualization/data/surfaceitemmodelhandler.cpp
+++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp
@@ -17,7 +17,7 @@
****************************************************************************/
#include "surfaceitemmodelhandler_p.h"
-#include <QTimer>
+#include "qitemmodelsurfacedatamapping_p.h"
QT_DATAVISUALIZATION_BEGIN_NAMESPACE
@@ -40,22 +40,21 @@ void SurfaceItemModelHandler::resolveModel()
return;
}
- bool useModelRows(false);
- if (!mapping->rowCategories().size() || !mapping->columnCategories().size()) {
- useModelRows = true;
- } else if (mapping->rowRole().isEmpty() || mapping->columnRole().isEmpty()) {
+ if (!mapping->useModelCategories()
+ && (mapping->rowRole().isEmpty() || mapping->columnRole().isEmpty())) {
m_proxy->resetArray(0);
return;
}
QSurfaceDataArray *newProxyArray = new QSurfaceDataArray;
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) {
+ if (mapping->useModelCategories()) {
for (int i = 0; i < rowCount; i++) {
QSurfaceDataRow *newProxyRow = new QSurfaceDataRow(columnCount);
for (int j = 0; j < columnCount; j++)
@@ -65,8 +64,15 @@ void SurfaceItemModelHandler::resolveModel()
} 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();
+
+ bool generateRows = mapping->autoRowCategories();
+ bool generateColumns = mapping->autoColumnCategories();
+ QStringList rowList;
+ QStringList columnList;
+ // For detecting duplicates in categories generation, using QHashes should be faster than
+ // simple QStringList::contains() check.
+ QHash<QString, bool> rowListHash;
+ QHash<QString, bool> columnListHash;
// Sort values into rows and columns
typedef QHash<QString, qreal> ColumnValueMap;
@@ -74,11 +80,30 @@ void SurfaceItemModelHandler::resolveModel()
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();
+ QString rowRoleStr = index.data(rowRole).toString();
+ QString columnRoleStr = index.data(columnRole).toString();
+ itemValueMap[rowRoleStr][columnRoleStr] = index.data(valueRole).toReal();
+ if (generateRows && !rowListHash.value(rowRoleStr, false)) {
+ rowListHash.insert(rowRoleStr, true);
+ rowList << rowRoleStr;
+ }
+ if (generateColumns && !columnListHash.value(columnRoleStr, false)) {
+ columnListHash.insert(columnRoleStr, true);
+ columnList << columnRoleStr;
+ }
}
}
+ if (generateRows)
+ mapping->dptr()->m_rowCategories = rowList;
+ else
+ rowList = mapping->rowCategories();
+
+ if (generateColumns)
+ mapping->dptr()->m_columnCategories = columnList;
+ else
+ columnList = mapping->columnCategories();
+
// Create new data array from itemValueMap
foreach (QString rowKey, rowList) {
QSurfaceDataRow *newProxyRow = new QSurfaceDataRow(columnList.size());