diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-05-13 12:37:06 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-05-13 12:57:45 +0300 |
commit | 576050ff96cbf67014313bd7c1f2b475b00dd80c (patch) | |
tree | 01e9f6d2abaef6e535d8433ed23821d77cac10ac /src/datavisualization/data/baritemmodelhandler.cpp | |
parent | 200031404f12422b78e9220aeb4fa12ba8f358a7 (diff) |
Multi-match behavior implementation for bar item model proxy
Task-number: QTRD-3074
Change-Id: I8e34d2546198a743e0132f0ce201dd38daf7ce7a
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/data/baritemmodelhandler.cpp')
-rw-r--r-- | src/datavisualization/data/baritemmodelhandler.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index 4685be44..3d1ce82f 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "baritemmodelhandler_p.h" +#include <QTime> QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -176,8 +177,17 @@ void BarItemModelHandler::resolveModel() // Sort values into rows and columns typedef QHash<QString, float> ColumnValueMap; - QHash <QString, ColumnValueMap> itemValueMap; - QHash <QString, ColumnValueMap> itemRotationMap; + QHash<QString, ColumnValueMap> itemValueMap; + QHash<QString, ColumnValueMap> itemRotationMap; + + bool cumulative = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBAverage + || m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBCumulative; + bool countMatches = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBAverage; + bool takeFirst = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBFirst; + QHash<QString, QHash<QString, int> > *matchCountMap = 0; + if (countMatches) + matchCountMap = new QHash<QString, QHash<QString, int> >; + for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { QModelIndex index = m_itemModel->index(i, j); @@ -193,7 +203,19 @@ void BarItemModelHandler::resolveModel() value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); else value = valueVar.toFloat(); - itemValueMap[rowRoleStr][columnRoleStr] = value; + if (countMatches) + (*matchCountMap)[rowRoleStr][columnRoleStr]++; + + if (cumulative) { + itemValueMap[rowRoleStr][columnRoleStr] += value; + } 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] = value; + } + if (m_rotationRole != noRoleIndex) { QVariant rotationVar = index.data(m_rotationRole); float rotation; @@ -203,7 +225,13 @@ void BarItemModelHandler::resolveModel() } else { rotation = rotationVar.toFloat(); } - itemRotationMap[rowRoleStr][columnRoleStr] = rotation; + if (cumulative) { + itemRotationMap[rowRoleStr][columnRoleStr] += rotation; + } else { + // We know we are in take last mode if we get here, + // as take first mode skips to next loop already earlier + itemRotationMap[rowRoleStr][columnRoleStr] = rotation; + } } if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); @@ -239,9 +267,16 @@ void BarItemModelHandler::resolveModel() QString rowKey = rowList.at(i); QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnList.size(); j++) { - newProxyRow[j].setValue(itemValueMap[rowKey][columnList.at(j)]); - if (m_rotationRole != noRoleIndex) - newProxyRow[j].setRotation(itemRotationMap[rowKey][columnList.at(j)]); + float value = itemValueMap[rowKey][columnList.at(j)]; + if (countMatches) + value /= float((*matchCountMap)[rowKey][columnList.at(j)]); + newProxyRow[j].setValue(value); + if (m_rotationRole != noRoleIndex) { + float angle = itemRotationMap[rowKey][columnList.at(j)]; + if (countMatches) + angle /= float((*matchCountMap)[rowKey][columnList.at(j)]); + newProxyRow[j].setRotation(angle); + } } } |