diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-04 09:39:07 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-04 10:33:15 +0200 |
commit | 01407a145ceb172727a27254108f9728a9537a3c (patch) | |
tree | 6b16507e319d7479fa19056e8ae7db40df38a4d0 /src | |
parent | 5864e78bd10a4d3d1aa60ec7fd282186bb004ad6 (diff) |
Swap row and column axis orientations in bars around
Now axis orientations are a logical match for surface axes.
Change-Id: Ib04436c5e83a59bf47f152b60b51b6e8559d681a
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy.cpp | 11 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 48 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 79 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 8 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars.cpp | 8 |
6 files changed, 79 insertions, 77 deletions
diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 4c6c85f7..49553036 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -41,9 +41,14 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * If you use QSurfaceDataRow pointers to directly modify data after adding the array to the proxy, * you must also emit proper signal to make the graph update. * - * When determining what rows and columns are visible, the first item in each row and the first item in - * each column determine if the whole row or column is visible, even if other items in the row or column - * individually have different X- or Z-coordinates. + * To make a sensible surface, the X-value of each successive item in the same row must be greater than the + * previous item in that row, and the the Z-value of each successive item in a column must be greater than + * the previous item in that column. + * + * \note In the initial release, only surfaces with straight rows and columns are fully supported. Any row + * with items that do not have the exact same Z-value or any columns with items that do not have the exact + * same X-value may get clipped incorrectly if the whole surface doesn't fit to the visible X or Z axis + * ranges. * * \note Surfaces with less than two rows or columns are not considered valid surfaces and will * not get rendered. diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 7c3eff09..a315e6b0 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -159,12 +159,12 @@ void Bars3DController::handleDataRowLabelsChanged() QBar3DSeries *firstSeries = 0; if (m_seriesList.size()) firstSeries = static_cast<QBar3DSeries *>(m_seriesList.at(0)); - if (m_axisX && firstSeries && firstSeries->dataProxy()) { + if (m_axisZ && firstSeries && firstSeries->dataProxy()) { // Grab a sublist equal to data window (no need to have more labels in axis) - int min = int(m_axisX->min()); - int count = int(m_axisX->max()) - min + 1; + int min = int(m_axisZ->min()); + int count = int(m_axisZ->max()) - min + 1; QStringList subList = firstSeries->dataProxy()->rowLabels().mid(min, count); - static_cast<Q3DCategoryAxis *>(m_axisX)->dptr()->setDataLabels(subList); + static_cast<Q3DCategoryAxis *>(m_axisZ)->dptr()->setDataLabels(subList); } } @@ -173,13 +173,13 @@ void Bars3DController::handleDataColumnLabelsChanged() QBar3DSeries *firstSeries = 0; if (m_seriesList.size()) firstSeries = static_cast<QBar3DSeries *>(m_seriesList.at(0)); - if (m_axisZ && firstSeries && firstSeries->dataProxy()) { + if (m_axisX && firstSeries && firstSeries->dataProxy()) { // Grab a sublist equal to data window (no need to have more labels in axis) - int min = int(m_axisZ->min()); - int count = int(m_axisZ->max()) - min + 1; + int min = int(m_axisX->min()); + int count = int(m_axisX->max()) - min + 1; QStringList subList = static_cast<QBarDataProxy *>(firstSeries->dataProxy()) ->columnLabels().mid(min, count); - static_cast<Q3DCategoryAxis *>(m_axisZ)->dptr()->setDataLabels(subList); + static_cast<Q3DCategoryAxis *>(m_axisX)->dptr()->setDataLabels(subList); } } @@ -217,13 +217,13 @@ QPoint Bars3DController::invalidSelectionPosition() void Bars3DController::setAxisX(Q3DAbstractAxis *axis) { Abstract3DController::setAxisX(axis); - handleDataRowLabelsChanged(); + handleDataColumnLabelsChanged(); } void Bars3DController::setAxisZ(Q3DAbstractAxis *axis) { Abstract3DController::setAxisZ(axis); - handleDataColumnLabelsChanged(); + handleDataRowLabelsChanged(); } void Bars3DController::addSeries(QAbstract3DSeries *series) @@ -281,9 +281,9 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender) // Data window changed if (sender == m_axisX || sender == m_axisZ) { if (sender == m_axisX) - handleDataRowLabelsChanged(); - if (sender == m_axisZ) handleDataColumnLabelsChanged(); + if (sender == m_axisZ) + handleDataRowLabelsChanged(); } Abstract3DController::handleAxisRangeChangedBySender(sender); @@ -355,8 +355,8 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri if (selectionMode().testFlag(QDataVis::SelectionSlice)) { // If the selected bar is outside data window, or there is no visible selected bar, disable slicing - if (pos.x() < m_axisX->min() || pos.x() > m_axisX->max() - || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max() + if (pos.x() < m_axisZ->min() || pos.x() > m_axisZ->max() + || pos.y() < m_axisX->min() || pos.y() > m_axisX->max() || !series->isVisible()) { scene()->setSlicingActive(false); } else { @@ -389,16 +389,16 @@ void Bars3DController::adjustAxisRanges() const QBarDataProxy *proxy = static_cast<QBar3DSeries *>(m_seriesList.at(0))->dataProxy(); const QBarDataArray *array = proxy->array(); - Q3DCategoryAxis *categoryAxisX = static_cast<Q3DCategoryAxis *>(m_axisX); - if (categoryAxisX && categoryAxisX->isAutoAdjustRange() && proxy) { + Q3DCategoryAxis *categoryAxisZ = static_cast<Q3DCategoryAxis *>(m_axisZ); + if (categoryAxisZ && categoryAxisZ->isAutoAdjustRange() && proxy) { int rowCount = proxy->rowCount(); if (rowCount) rowCount--; - categoryAxisX->dptr()->setRange(0.0f, float(rowCount)); + categoryAxisZ->dptr()->setRange(0.0f, float(rowCount)); } - Q3DCategoryAxis *categoryAxisZ = static_cast<Q3DCategoryAxis *>(m_axisZ); - if (categoryAxisZ && categoryAxisZ->isAutoAdjustRange() && proxy) { + 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()) @@ -406,15 +406,15 @@ void Bars3DController::adjustAxisRanges() } if (columnCount) columnCount--; - categoryAxisZ->dptr()->setRange(0.0f, float(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(categoryAxisX->min(), - categoryAxisX->max(), - categoryAxisZ->min(), - categoryAxisZ->max()); + 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); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 03612b87..5b582273 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -152,10 +152,10 @@ void Bars3DRenderer::initializeOpenGL() void Bars3DRenderer::updateData() { int seriesCount = m_visibleSeriesList.size(); - int minRow = m_axisCacheX.min(); - int maxRow = m_axisCacheX.max(); - int minCol = m_axisCacheZ.min(); - int maxCol = m_axisCacheZ.max(); + int minRow = m_axisCacheZ.min(); + int maxRow = m_axisCacheZ.max(); + int minCol = m_axisCacheX.min(); + int maxCol = m_axisCacheX.max(); int newRows = maxRow - minRow + 1; int newColumns = maxCol - minCol + 1; int updateSize = 0; @@ -296,12 +296,10 @@ void Bars3DRenderer::render(GLuint defaultFboHandle) drawScene(defaultFboHandle); if (m_cachedIsSlicingActivated) - drawSlicedScene(m_axisCacheX.titleItem(), m_axisCacheY.titleItem(), m_axisCacheZ.titleItem()); + drawSlicedScene(); } -void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, - const LabelItem &yLabel, - const LabelItem &zLabel) +void Bars3DRenderer::drawSlicedScene() { GLfloat barPosX = 0; QVector3D lightPos; @@ -639,12 +637,12 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, m_labelObj, activeCamera, false, false, Drawer::LabelTop, Qt::AlignCenter, true); } - m_drawer->drawLabel(*dummyItem, zLabel, viewMatrix, projectionMatrix, + m_drawer->drawLabel(*dummyItem, m_axisCacheX.titleItem(), viewMatrix, projectionMatrix, positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); } else { - m_drawer->drawLabel(*dummyItem, xLabel, viewMatrix, projectionMatrix, + m_drawer->drawLabel(*dummyItem, m_axisCacheZ.titleItem(), viewMatrix, projectionMatrix, positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); @@ -655,7 +653,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, Qt::AlignCenter, true); } } - m_drawer->drawLabel(*dummyItem, yLabel, viewMatrix, projectionMatrix, + m_drawer->drawLabel(*dummyItem, m_axisCacheY.titleItem(), viewMatrix, projectionMatrix, positionComp, QVector3D(0.0f, 0.0f, 90.0f), 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelLeft, Qt::AlignCenter, true); @@ -1023,9 +1021,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } // Set slice cache, i.e. axis cache from where slice labels are taken if (rowMode) - m_sliceCache = &m_axisCacheZ; - else m_sliceCache = &m_axisCacheX; + else + m_sliceCache = &m_axisCacheZ; m_sliceTitleItem = 0; } } @@ -1134,8 +1132,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setPosition(QPoint(row, bar)); if (m_selectionDirty && bar < m_renderColumns) { item.setSeriesIndex(series); - if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > row) - m_sliceTitleItem = m_axisCacheX.labelItems().at(row); + if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > row) + m_sliceTitleItem = m_axisCacheZ.labelItems().at(row); m_sliceSelection->append(&item); } } @@ -1161,8 +1159,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setPosition(QPoint(row, bar)); if (m_selectionDirty && row < m_renderRows) { item.setSeriesIndex(series); - if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > bar) - m_sliceTitleItem = m_axisCacheZ.labelItems().at(bar); + if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > bar) + m_sliceTitleItem = m_axisCacheX.labelItems().at(bar); m_sliceSelection->append(&item); } } @@ -1586,7 +1584,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) Qt::AlignmentFlag alignment = m_xFlipped ? Qt::AlignLeft : Qt::AlignRight; for (int row = 0; row != m_cachedRowCount; row++) { - if (m_axisCacheX.labelItems().size() > row) { + if (m_axisCacheZ.labelItems().size() > row) { // Go through all rows and get position of max+1 or min-1 column, depending on x flip // We need only positions for them, labels have already been generated at QDataSetPrivate. Just add LabelItems rowPos = (row + 0.5f) * m_cachedBarSpacing.height(); @@ -1602,8 +1600,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) (m_columnDepth - rowPos) / m_scaleFactor); m_dummyBarRenderItem.setTranslation(labelPos); - const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(row); - //qDebug() << "labelPos, row" << row + 1 << ":" << labelPos << m_axisCacheX.labels().at(row); + const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(row); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotation, 0, m_cachedSelectionMode, @@ -1624,7 +1621,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) alignment = m_zFlipped ? Qt::AlignRight : Qt::AlignLeft; for (int column = 0; column != m_cachedColumnCount; column++) { - if (m_axisCacheZ.labelItems().size() > column) { + if (m_axisCacheX.labelItems().size() > column) { // Go through all columns and get position of max+1 or min-1 row, depending on z flip // We need only positions for them, labels have already been generated at QDataSetPrivate. Just add LabelItems colPos = (column + 0.5f) * m_cachedBarSpacing.width(); @@ -1640,7 +1637,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) rowPos); m_dummyBarRenderItem.setTranslation(labelPos); - const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(column); + const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(column); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotation, 0, m_cachedSelectionMode, @@ -1745,20 +1742,20 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat(), selectedBar->value()); - int selBarPosX = selectedBar->position().x(); - int selBarPosY = selectedBar->position().y(); - labelText.replace(rowIndexTag, QString::number(selBarPosX)); - if (m_axisCacheX.labels().size() > selBarPosX) - labelText.replace(rowLabelTag, m_axisCacheX.labels().at(selBarPosX)); + int selBarPosRow = selectedBar->position().x(); + int selBarPosCol = selectedBar->position().y(); + labelText.replace(rowIndexTag, QString::number(selBarPosRow)); + if (m_axisCacheZ.labels().size() > selBarPosRow) + labelText.replace(rowLabelTag, m_axisCacheZ.labels().at(selBarPosRow)); else labelText.replace(rowLabelTag, QString()); - labelText.replace(rowTitleTag, m_axisCacheX.title()); - labelText.replace(colIndexTag, QString::number(selBarPosY)); - if (m_axisCacheZ.labels().size() > selBarPosY) - labelText.replace(colLabelTag, m_axisCacheZ.labels().at(selBarPosY)); + labelText.replace(rowTitleTag, m_axisCacheZ.title()); + labelText.replace(colIndexTag, QString::number(selBarPosCol)); + if (m_axisCacheX.labels().size() > selBarPosCol) + labelText.replace(colLabelTag, m_axisCacheX.labels().at(selBarPosCol)); else labelText.replace(colLabelTag, QString()); - labelText.replace(colTitleTag, m_axisCacheZ.title()); + labelText.replace(colTitleTag, m_axisCacheX.title()); labelText.replace(valueTitleTag, m_axisCacheY.title()); if (labelText.contains(valueLabelTag)) { @@ -1864,10 +1861,10 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSerie return; } - int adjustedX = m_selectedBarPos.x() - int(m_axisCacheX.min()); - int adjustedZ = m_selectedBarPos.y() - int(m_axisCacheZ.min()); - int maxX = m_renderingArrays.at(0).size() - 1; - int maxZ = maxX >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1; + int adjustedZ = m_selectedBarPos.x() - int(m_axisCacheZ.min()); + int adjustedX = m_selectedBarPos.y() - int(m_axisCacheX.min()); + int maxZ = m_renderingArrays.at(0).size() - 1; + int maxX = maxZ >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1; for (int i = 0; i < m_visibleSeriesList.size(); i++) { if (m_visibleSeriesList.at(i).series() == series) { @@ -1877,11 +1874,11 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSerie } if (m_selectedBarPos == Bars3DController::invalidSelectionPosition() - || adjustedX < 0 || adjustedX > maxX - || adjustedZ < 0 || adjustedZ > maxZ) { + || adjustedZ < 0 || adjustedZ > maxZ + || adjustedX < 0 || adjustedX > maxX) { m_visualSelectedBarPos = Bars3DController::invalidSelectionPosition(); } else { - m_visualSelectedBarPos = QPoint(adjustedX, adjustedZ); + m_visualSelectedBarPos = QPoint(adjustedZ, adjustedX); } } @@ -2041,8 +2038,8 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector3D &selectionC if (selectionColor == selectionSkipColor) { position = Bars3DController::invalidSelectionPosition(); } else { - position = QPoint(int(selectionColor.x() + int(m_axisCacheX.min())), - int(selectionColor.y()) + int(m_axisCacheZ.min())); + position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), + int(selectionColor.y()) + int(m_axisCacheX.min())); } return position; } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 0707dd6f..e3f8af4f 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -139,7 +139,7 @@ private: virtual void updateTextures(); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); - void drawSlicedScene(const LabelItem &xLabel, const LabelItem &yLabel, const LabelItem &zLabel); + void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); void handleResize(); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 1d297f1b..1eece537 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -500,7 +500,7 @@ QLinearGradient Q3DBars::multiHighlightGradient() const */ void Q3DBars::setRowAxis(Q3DCategoryAxis *axis) { - d_ptr->m_shared->setAxisX(axis); + d_ptr->m_shared->setAxisZ(axis); } /*! @@ -508,7 +508,7 @@ void Q3DBars::setRowAxis(Q3DCategoryAxis *axis) */ Q3DCategoryAxis *Q3DBars::rowAxis() const { - return static_cast<Q3DCategoryAxis *>(d_ptr->m_shared->axisX()); + return static_cast<Q3DCategoryAxis *>(d_ptr->m_shared->axisZ()); } /*! @@ -522,7 +522,7 @@ Q3DCategoryAxis *Q3DBars::rowAxis() const */ void Q3DBars::setColumnAxis(Q3DCategoryAxis *axis) { - d_ptr->m_shared->setAxisZ(axis); + d_ptr->m_shared->setAxisX(axis); } /*! @@ -530,7 +530,7 @@ void Q3DBars::setColumnAxis(Q3DCategoryAxis *axis) */ Q3DCategoryAxis *Q3DBars::columnAxis() const { - return static_cast<Q3DCategoryAxis *>(d_ptr->m_shared->axisZ()); + return static_cast<Q3DCategoryAxis *>(d_ptr->m_shared->axisX()); } /*! diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 905a842e..4c7bccd7 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -51,12 +51,12 @@ void DeclarativeBars::setBarColor(const QColor &baseColor) Q3DCategoryAxis *DeclarativeBars::rowAxis() const { - return static_cast<Q3DCategoryAxis *>(m_barsController->axisX()); + return static_cast<Q3DCategoryAxis *>(m_barsController->axisZ()); } void DeclarativeBars::setRowAxis(Q3DCategoryAxis *axis) { - m_barsController->setAxisX(axis); + m_barsController->setAxisZ(axis); } Q3DValueAxis *DeclarativeBars::valueAxis() const @@ -71,12 +71,12 @@ void DeclarativeBars::setValueAxis(Q3DValueAxis *axis) Q3DCategoryAxis *DeclarativeBars::columnAxis() const { - return static_cast<Q3DCategoryAxis *>(m_barsController->axisZ()); + return static_cast<Q3DCategoryAxis *>(m_barsController->axisX()); } void DeclarativeBars::setColumnAxis(Q3DCategoryAxis *axis) { - m_barsController->setAxisZ(axis); + m_barsController->setAxisX(axis); } void DeclarativeBars::setBarThickness(float thicknessRatio) |