summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-12-04 09:39:07 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-12-04 10:33:15 +0200
commit01407a145ceb172727a27254108f9728a9537a3c (patch)
tree6b16507e319d7479fa19056e8ae7db40df38a4d0 /src
parent5864e78bd10a4d3d1aa60ec7fd282186bb004ad6 (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.cpp11
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp48
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp79
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/q3dbars.cpp8
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp8
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)