summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/data/surfaceitemmodelhandler.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-14 09:06:06 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-05-14 09:26:37 +0300
commit5f9be2bd06a3f0f8286325ad1eb323aa692126eb (patch)
treedb6240e2768d000f43df0a80023e80077e889baa /src/datavisualization/data/surfaceitemmodelhandler.cpp
parentc5e993ad507cc0d56d0e2a62076584d020086ad7 (diff)
Multi-match behavior implementation for surface item model proxy
Task-number: QTRD-3074 Change-Id: I2dc67f0c524bce87498129bbc462bd8f014b8d2c Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/data/surfaceitemmodelhandler.cpp')
-rw-r--r--src/datavisualization/data/surfaceitemmodelhandler.cpp38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp
index fad02464..e3d50a80 100644
--- a/src/datavisualization/data/surfaceitemmodelhandler.cpp
+++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp
@@ -212,6 +212,14 @@ void SurfaceItemModelHandler::resolveModel()
QHash<QString, bool> rowListHash;
QHash<QString, bool> columnListHash;
+ bool cumulative = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBAverage
+ || m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBCumulativeY;
+ bool average = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBAverage;
+ bool takeFirst = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBFirst;
+ QHash<QString, QHash<QString, int> > *matchCountMap = 0;
+ if (cumulative)
+ matchCountMap = new QHash<QString, QHash<QString, int> >;
+
// Sort values into rows and columns
typedef QHash<QString, QVector3D> ColumnValueMap;
QHash <QString, ColumnValueMap> itemValueMap;
@@ -244,7 +252,20 @@ void SurfaceItemModelHandler::resolveModel()
zPos = zValueVar.toFloat();
QVector3D itemPos(xPos, yPos, zPos);
- itemValueMap[rowRoleStr][columnRoleStr] = itemPos;
+
+ if (cumulative)
+ (*matchCountMap)[rowRoleStr][columnRoleStr]++;
+
+ if (cumulative) {
+ itemValueMap[rowRoleStr][columnRoleStr] += itemPos;
+ } else {
+ if (takeFirst && itemValueMap.contains(rowRoleStr)) {
+ if (itemValueMap.value(rowRoleStr).contains(columnRoleStr))
+ continue; // We already have a value for this row/column combo
+ }
+ itemValueMap[rowRoleStr][columnRoleStr] = itemPos;
+ }
+
if (generateRows && !rowListHash.value(rowRoleStr, false)) {
rowListHash.insert(rowRoleStr, true);
rowList << rowRoleStr;
@@ -278,8 +299,19 @@ void SurfaceItemModelHandler::resolveModel()
for (int i = 0; i < rowList.size(); i++) {
QString rowKey = rowList.at(i);
QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i);
- for (int j = 0; j < columnList.size(); j++)
- newProxyRow[j].setPosition(itemValueMap[rowKey][columnList.at(j)]);
+ for (int j = 0; j < columnList.size(); j++) {
+ QVector3D &itemPos = itemValueMap[rowKey][columnList.at(j)];
+ if (cumulative) {
+ if (average) {
+ itemPos /= float((*matchCountMap)[rowKey][columnList.at(j)]);
+ } else { // cumulativeY
+ float divisor = float((*matchCountMap)[rowKey][columnList.at(j)]);
+ itemPos.setX(itemPos.x() / divisor);
+ itemPos.setZ(itemPos.z() / divisor);
+ }
+ }
+ newProxyRow[j].setPosition(itemPos);
+ }
}
}