summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/bars3dcontroller.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-12-10 15:34:51 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-12-11 08:10:01 +0200
commit647ef62c8bdb1cc11cd93657ad32dd855e50ac79 (patch)
tree99ae8d707eb456a61f92f7fcd666ab1f981dd10b /src/datavisualization/engine/bars3dcontroller.cpp
parent1579b6f82ae9c5768904fb1c4f50ad315c8f3894 (diff)
Bar autoadjust ranges to consider all visible series
Task-number: QTRD-2605 Change-Id: I3a155d97ec362eb6a912688c4be32ae82166b126 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/bars3dcontroller.cpp')
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp115
1 files changed, 81 insertions, 34 deletions
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp
index a315e6b0..88b0730f 100644
--- a/src/datavisualization/engine/bars3dcontroller.cpp
+++ b/src/datavisualization/engine/bars3dcontroller.cpp
@@ -385,44 +385,91 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri
void Bars3DController::adjustAxisRanges()
{
- if (m_seriesList.size()) {
- const QBarDataProxy *proxy = static_cast<QBar3DSeries *>(m_seriesList.at(0))->dataProxy();
- const QBarDataArray *array = proxy->array();
-
+ int seriesCount = m_seriesList.size();
+ if (seriesCount) {
Q3DCategoryAxis *categoryAxisZ = static_cast<Q3DCategoryAxis *>(m_axisZ);
- if (categoryAxisZ && categoryAxisZ->isAutoAdjustRange() && proxy) {
- int rowCount = proxy->rowCount();
- if (rowCount)
- rowCount--;
- categoryAxisZ->dptr()->setRange(0.0f, float(rowCount));
- }
-
Q3DCategoryAxis *categoryAxisX = static_cast<Q3DCategoryAxis *>(m_axisX);
- if (categoryAxisX && categoryAxisX->isAutoAdjustRange() && proxy) {
- int columnCount = 0;
- for (int i = 0; i < array->size(); i++) {
- if (columnCount < array->at(i)->size())
- columnCount = array->at(i)->size();
+ Q3DValueAxis *valueAxis = static_cast<Q3DValueAxis *>(m_axisY);
+
+ bool adjustZ = (categoryAxisZ && categoryAxisZ->isAutoAdjustRange());
+ bool adjustX = (categoryAxisX && categoryAxisX->isAutoAdjustRange());
+ bool adjustY = (valueAxis && categoryAxisX && categoryAxisZ && valueAxis->isAutoAdjustRange());
+
+ if (adjustZ || adjustX || adjustY) {
+ int maxRowCount = 1;
+ int maxColumnCount = 1;
+ float minValue = 0.0f;
+ float maxValue = 0.0f;
+
+ // First figure out row and column counts
+ if (adjustZ || adjustX) {
+ for (int series = 0; series < seriesCount; series++) {
+ const QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(m_seriesList.at(series));
+ if (barSeries->isVisible()) {
+ const QBarDataProxy *proxy = barSeries->dataProxy();
+
+ if (adjustZ && proxy) {
+ int rowCount = proxy->rowCount();
+ if (rowCount)
+ rowCount--;
+
+ maxRowCount = qMax(maxRowCount, rowCount);
+ }
+
+ if (adjustX && proxy) {
+ const QBarDataArray *array = proxy->array();
+ int columnCount = 0;
+ for (int i = 0; i < array->size(); i++) {
+ if (columnCount < array->at(i)->size())
+ columnCount = array->at(i)->size();
+ }
+ if (columnCount)
+ columnCount--;
+
+ maxColumnCount = qMax(maxColumnCount, columnCount);
+ }
+ }
+ }
+ // Call private implementations of setRange to avoid unsetting auto adjust flag
+ if (adjustZ)
+ categoryAxisZ->dptr()->setRange(0.0f, float(maxRowCount));
+ if (adjustX)
+ categoryAxisX->dptr()->setRange(0.0f, float(maxColumnCount));
}
- if (columnCount)
- columnCount--;
- categoryAxisX->dptr()->setRange(0.0f, float(columnCount));
- }
- Q3DValueAxis *valueAxis = static_cast<Q3DValueAxis *>(m_axisY);
- if (valueAxis && categoryAxisX && categoryAxisZ && valueAxis->isAutoAdjustRange() && proxy) {
- QPair<GLfloat, GLfloat> limits = proxy->dptrc()->limitValues(categoryAxisZ->min(),
- categoryAxisZ->max(),
- categoryAxisX->min(),
- categoryAxisX->max());
- if (limits.first < 0) {
- // Call private implementation to avoid unsetting auto adjust flag
- valueAxis->dptr()->setRange(limits.first, limits.second);
- } else if (limits.second == 0.0f) {
- // Only zero value values in data set, set range to something.
- valueAxis->dptr()->setRange(0.0f, 1.0f);
- } else {
- valueAxis->dptr()->setRange(0.0f, limits.second);
+ // Now that we know the row and column ranges, figure out the value axis range
+ if (adjustY) {
+ for (int series = 0; series < seriesCount; series++) {
+ const QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(m_seriesList.at(series));
+ if (barSeries->isVisible()) {
+ const QBarDataProxy *proxy = barSeries->dataProxy();
+ if (adjustY && proxy) {
+ QPair<GLfloat, GLfloat> limits = proxy->dptrc()->limitValues(categoryAxisZ->min(),
+ categoryAxisZ->max(),
+ categoryAxisX->min(),
+ categoryAxisX->max());
+ if (!series) {
+ // First series initializes the values
+ minValue = limits.first;
+ maxValue = limits.second;
+ } else {
+ minValue = qMin(minValue, limits.first);
+ maxValue = qMax(maxValue, limits.second);
+ }
+ }
+ }
+ }
+
+ if (maxValue < 0.0f)
+ maxValue = 0.0f;
+ if (minValue > 0.0f)
+ minValue = 0.0f;
+ if (minValue == 0.0f && maxValue == 0.0f) {
+ // Only zero value values in data set, set range to something.
+ minValue = 0.0f;
+ maxValue = 1.0f;
+ }
+ valueAxis->dptr()->setRange(minValue, maxValue);
}
}
}