diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-11 10:40:02 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-11 11:31:36 +0200 |
commit | e688990f64855434e90029383206a0062892306e (patch) | |
tree | 7f02ae89c6f96cbca96ab2d6ae068f37b61b658b /src | |
parent | 8eedf6096de1eded74c40c4632ab2ad95b6c6f8d (diff) |
Scatter and surface autoadjust ranges to consider all visible series
Task-number: QTRD-2605
Change-Id: I86b843bd478f92a93588394558ba9b983eb8430f
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 148 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3dcontroller.cpp | 125 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller.cpp | 126 |
3 files changed, 275 insertions, 124 deletions
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 88b0730f..5232a566 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -385,92 +385,90 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri void Bars3DController::adjustAxisRanges() { - int seriesCount = m_seriesList.size(); - if (seriesCount) { - Q3DCategoryAxis *categoryAxisZ = static_cast<Q3DCategoryAxis *>(m_axisZ); - Q3DCategoryAxis *categoryAxisX = static_cast<Q3DCategoryAxis *>(m_axisX); - 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); - } + Q3DCategoryAxis *categoryAxisZ = static_cast<Q3DCategoryAxis *>(m_axisZ); + Q3DCategoryAxis *categoryAxisX = static_cast<Q3DCategoryAxis *>(m_axisX); + 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 + int seriesCount = m_seriesList.size(); + 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); + 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)); } + // 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)); + } - // 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); - } + // 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); + 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); } } } diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 6923f26e..0a506f19 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -239,33 +239,110 @@ void Scatter3DController::setSelectedItem(int index, QScatter3DSeries *series) void Scatter3DController::adjustValueAxisRange() { - QVector3D minLimits; - QVector3D maxLimits; - if (m_seriesList.size()) { - const QScatterDataProxy *proxy = static_cast<QScatter3DSeries *>(m_seriesList.at(0))->dataProxy(); - proxy->dptrc()->limitValues(minLimits, maxLimits); - Q3DValueAxis *valueAxis = static_cast<Q3DValueAxis *>(m_axisX); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.x() != maxLimits.x()) - valueAxis->dptr()->setRange(minLimits.x(), maxLimits.x()); - else - valueAxis->dptr()->setRange(minLimits.x() - 1.0f, minLimits.x() + 1.0f); // Default to a valid range + Q3DValueAxis *valueAxisX = static_cast<Q3DValueAxis *>(m_axisX); + Q3DValueAxis *valueAxisY = static_cast<Q3DValueAxis *>(m_axisY); + Q3DValueAxis *valueAxisZ = static_cast<Q3DValueAxis *>(m_axisZ); + bool adjustX = (valueAxisX && valueAxisX->isAutoAdjustRange()); + bool adjustY = (valueAxisY && valueAxisY->isAutoAdjustRange()); + bool adjustZ = (valueAxisZ && valueAxisZ->isAutoAdjustRange()); + + if (adjustX || adjustY || adjustZ) { + float minValueX = 0.0f; + float maxValueX = 0.0f; + float minValueY = 0.0f; + float maxValueY = 0.0f; + float minValueZ = 0.0f; + float maxValueZ = 0.0f; + int seriesCount = m_seriesList.size(); + for (int series = 0; series < seriesCount; series++) { + const QScatter3DSeries *scatterSeries = + static_cast<QScatter3DSeries *>(m_seriesList.at(series)); + const QScatterDataProxy *proxy = scatterSeries->dataProxy(); + if (scatterSeries->isVisible() && proxy) { + QVector3D minLimits; + QVector3D maxLimits; + proxy->dptrc()->limitValues(minLimits, maxLimits); + if (adjustX) { + if (!series) { + // First series initializes the values + minValueX = minLimits.x(); + maxValueX = maxLimits.x(); + } else { + minValueX = qMin(minValueX, minLimits.x()); + maxValueX = qMax(maxValueX, maxLimits.x()); + } + } + if (adjustY) { + if (!series) { + // First series initializes the values + minValueY = minLimits.y(); + maxValueY = maxLimits.y(); + } else { + minValueY = qMin(minValueY, minLimits.y()); + maxValueY = qMax(maxValueY, maxLimits.y()); + } + } + if (adjustZ) { + if (!series) { + // First series initializes the values + minValueZ = minLimits.z(); + maxValueZ = maxLimits.z(); + } else { + minValueZ = qMin(minValueZ, minLimits.z()); + maxValueZ = qMax(maxValueZ, maxLimits.z()); + } + } + } } - valueAxis = static_cast<Q3DValueAxis *>(m_axisY); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.y() != maxLimits.y()) - valueAxis->dptr()->setRange(minLimits.y(), maxLimits.y()); - else - valueAxis->dptr()->setRange(minLimits.y() - 1.0f, minLimits.y() + 1.0f); // Default to a valid range + static const float adjustmentRatio = 20.0f; + static const float defaultAdjustment = 1.0f; + + if (adjustX) { + // If all points at same coordinate, need to default to some valid range + float adjustment = 0.0f; + if (minValueX == maxValueX) { + if (adjustZ) { + // X and Z are linked to have similar unit size, so choose the valid range based on it + if (minValueZ == maxValueZ) + adjustment = defaultAdjustment; + else + adjustment = qAbs(maxValueZ - minValueZ) / adjustmentRatio; + } else { + if (valueAxisZ) + adjustment = qAbs(valueAxisZ->max() - valueAxisZ->min()) / adjustmentRatio; + else + adjustment = defaultAdjustment; + } + } + valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment); } - - valueAxis = static_cast<Q3DValueAxis *>(m_axisZ); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.z() != maxLimits.z()) - valueAxis->dptr()->setRange(minLimits.z(), maxLimits.z()); - else - valueAxis->dptr()->setRange(minLimits.z() - 1.0f, minLimits.z() + 1.0f); // Default to a valid range + if (adjustY) { + // If all points at same coordinate, need to default to some valid range + // Y-axis unit is not dependent on other axes, so simply adjust +-1.0f + float adjustment = 0.0f; + if (minValueY == maxValueY) + adjustment = defaultAdjustment; + valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment); + } + if (adjustZ) { + // If all points at same coordinate, need to default to some valid range + float adjustment = 0.0f; + if (minValueZ == maxValueZ) { + if (adjustX) { + // X and Z are linked to have similar unit size, so choose the valid range based on it + if (minValueX == maxValueX) + adjustment = defaultAdjustment; + else + adjustment = qAbs(maxValueX - minValueX) / adjustmentRatio; + } else { + if (valueAxisX) + adjustment = qAbs(valueAxisX->max() - valueAxisX->min()) / adjustmentRatio; + else + adjustment = defaultAdjustment; + } + } + valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment); } } } diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 1ceb75e2..3cec72d1 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -383,34 +383,110 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count) void Surface3DController::adjustValueAxisRange() { - if (m_seriesList.size()) { - QVector3D minLimits; - QVector3D maxLimits; - QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_seriesList.at(0)); - static_cast<QSurfaceDataProxy *>(series->dataProxy())->dptrc()->limitValues(minLimits, - maxLimits); - Q3DValueAxis *valueAxis = static_cast<Q3DValueAxis *>(m_axisX); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.x() != maxLimits.x()) - valueAxis->dptr()->setRange(minLimits.x(), maxLimits.x()); - else - valueAxis->dptr()->setRange(minLimits.x() - 1.0f, minLimits.x() + 1.0f); // Default to some valid range + Q3DValueAxis *valueAxisX = static_cast<Q3DValueAxis *>(m_axisX); + Q3DValueAxis *valueAxisY = static_cast<Q3DValueAxis *>(m_axisY); + Q3DValueAxis *valueAxisZ = static_cast<Q3DValueAxis *>(m_axisZ); + bool adjustX = (valueAxisX && valueAxisX->isAutoAdjustRange()); + bool adjustY = (valueAxisY && valueAxisY->isAutoAdjustRange()); + bool adjustZ = (valueAxisZ && valueAxisZ->isAutoAdjustRange()); + + if (adjustX || adjustY || adjustZ) { + float minValueX = 0.0f; + float maxValueX = 0.0f; + float minValueY = 0.0f; + float maxValueY = 0.0f; + float minValueZ = 0.0f; + float maxValueZ = 0.0f; + int seriesCount = m_seriesList.size(); + for (int series = 0; series < seriesCount; series++) { + const QSurface3DSeries *surfaceSeries = + static_cast<QSurface3DSeries *>(m_seriesList.at(series)); + const QSurfaceDataProxy *proxy = surfaceSeries->dataProxy(); + if (surfaceSeries->isVisible() && proxy) { + QVector3D minLimits; + QVector3D maxLimits; + proxy->dptrc()->limitValues(minLimits, maxLimits); + if (adjustX) { + if (!series) { + // First series initializes the values + minValueX = minLimits.x(); + maxValueX = maxLimits.x(); + } else { + minValueX = qMin(minValueX, minLimits.x()); + maxValueX = qMax(maxValueX, maxLimits.x()); + } + } + if (adjustY) { + if (!series) { + // First series initializes the values + minValueY = minLimits.y(); + maxValueY = maxLimits.y(); + } else { + minValueY = qMin(minValueY, minLimits.y()); + maxValueY = qMax(maxValueY, maxLimits.y()); + } + } + if (adjustZ) { + if (!series) { + // First series initializes the values + minValueZ = minLimits.z(); + maxValueZ = maxLimits.z(); + } else { + minValueZ = qMin(minValueZ, minLimits.z()); + maxValueZ = qMax(maxValueZ, maxLimits.z()); + } + } + } } - valueAxis = static_cast<Q3DValueAxis *>(m_axisY); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.y() != maxLimits.y()) - valueAxis->dptr()->setRange(minLimits.y(), maxLimits.y()); - else - valueAxis->dptr()->setRange(minLimits.y() - 1.0f, minLimits.y() + 1.0f); // Default to some valid range + static const float adjustmentRatio = 20.0f; + static const float defaultAdjustment = 1.0f; + + if (adjustX) { + // If all points at same coordinate, need to default to some valid range + float adjustment = 0.0f; + if (minValueX == maxValueX) { + if (adjustZ) { + // X and Z are linked to have similar unit size, so choose the valid range based on it + if (minValueZ == maxValueZ) + adjustment = defaultAdjustment; + else + adjustment = qAbs(maxValueZ - minValueZ) / adjustmentRatio; + } else { + if (valueAxisZ) + adjustment = qAbs(valueAxisZ->max() - valueAxisZ->min()) / adjustmentRatio; + else + adjustment = defaultAdjustment; + } + } + valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment); } - - valueAxis = static_cast<Q3DValueAxis *>(m_axisZ); - if (valueAxis && valueAxis->isAutoAdjustRange()) { - if (minLimits.z() != maxLimits.z()) - valueAxis->dptr()->setRange(minLimits.z(), maxLimits.z()); - else - valueAxis->dptr()->setRange(minLimits.z() - 1.0f, minLimits.z() + 1.0f); // Default to some valid range + if (adjustY) { + // If all points at same coordinate, need to default to some valid range + // Y-axis unit is not dependent on other axes, so simply adjust +-1.0f + float adjustment = 0.0f; + if (minValueY == maxValueY) + adjustment = defaultAdjustment; + valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment); + } + if (adjustZ) { + // If all points at same coordinate, need to default to some valid range + float adjustment = 0.0f; + if (minValueZ == maxValueZ) { + if (adjustX) { + // X and Z are linked to have similar unit size, so choose the valid range based on it + if (minValueX == maxValueX) + adjustment = defaultAdjustment; + else + adjustment = qAbs(maxValueX - minValueX) / adjustmentRatio; + } else { + if (valueAxisX) + adjustment = qAbs(valueAxisX->max() - valueAxisX->min()) / adjustmentRatio; + else + adjustment = defaultAdjustment; + } + } + valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment); } } } |