diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-13 13:56:22 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-16 09:48:31 +0300 |
commit | 73ffd814281d9fa07f5d25b2b3a8ce04a011780c (patch) | |
tree | 99cfff8e2cc95b0366b582bf912c0f9ff47f2382 /src/datavisualization/data/surfaceitemmodelhandler.cpp | |
parent | cff52478831a7653514fb382c27db0faba395c7c (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.cpp | 45 |
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()); |