diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-10 15:34:51 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-11 08:10:01 +0200 |
commit | 647ef62c8bdb1cc11cd93657ad32dd855e50ac79 (patch) | |
tree | 99ae8d707eb456a61f92f7fcd666ab1f981dd10b /src/datavisualization/engine | |
parent | 1579b6f82ae9c5768904fb1c4f50ad315c8f3894 (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')
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 115 |
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); } } } |