From 603afaebc81b8240657b58a1a349c2027a622ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 19 Apr 2013 13:17:41 +0300 Subject: Crash fix ..when returning from zoom view and there were no label items for rows/columns Change-Id: Ia9b5da595185adf6ef3fff3c8c926f1b36f8eb8e Change-Id: Ia9b5da595185adf6ef3fff3c8c926f1b36f8eb8e Reviewed-by: Miikka Heikkinen Reviewed-by: Mika Salmela --- src/datavis3d/engine/q3dbars.cpp | 88 +++++++++++++++++++++++---------------- src/datavis3d/engine/qdataset.cpp | 12 ++++-- 2 files changed, 59 insertions(+), 41 deletions(-) (limited to 'src/datavis3d/engine') diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp index e5bf1632..175e2902 100644 --- a/src/datavis3d/engine/q3dbars.cpp +++ b/src/datavis3d/engine/q3dbars.cpp @@ -62,7 +62,7 @@ #include -//#define DISPLAY_RENDER_SPEED +#define DISPLAY_RENDER_SPEED #ifdef DISPLAY_RENDER_SPEED #include @@ -352,7 +352,7 @@ void Q3DBars::drawZoomScene() else barPosX = -(item->d_ptr->translation().z() - zComp); // flip z; frontmost bar to the left modelMatrix.translate(barPosX, - item->d_ptr->translation().y() - 0.5f,// TODO: Needs a better system; calculate y position modifier somehow + item->d_ptr->translation().y(), // TODO: Needs a better system; calculate y position modifier somehow (based on highest bar height?) zComp); modelMatrix.scale(QVector3D(d_ptr->m_scaleX, barHeight, d_ptr->m_scaleZ)); @@ -499,9 +499,7 @@ void Q3DBars::drawZoomScene() } } } - // Check if there is a label before drawing - if (labelItem.textureId() > 0) - drawLabel(*item, labelItem, viewMatrix, projectionMatrix, false, -45.0f, LabelBelow); + drawLabel(*item, labelItem, viewMatrix, projectionMatrix, false, -45.0f, LabelBelow); } glDisable(GL_TEXTURE_2D); @@ -826,11 +824,14 @@ void Q3DBars::drawScene() // Insert data to QDataItem. We have no ownership, don't delete the previous one if (!d_ptr->m_zoomActivated) { d_ptr->m_selectedBar = item; - d_ptr->m_selectedBar->d_ptr->setPosition( - QPoint(d_ptr->m_dataSet->d_ptr->rowLabelItems().size() - - row - 1, - d_ptr->m_dataSet->d_ptr->columnLabelItems().size() - - bar - 1)); + if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > row + && d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > bar) { + d_ptr->m_selectedBar->d_ptr->setPosition( + QPoint(d_ptr->m_dataSet->d_ptr->rowLabelItems().size() + - row - 1, + d_ptr->m_dataSet->d_ptr->columnLabelItems().size() + - bar - 1)); + } #ifdef USE_PAINTER_TEXT QSize mousePositionAsSize = QSize(d_ptr->m_mousePos.x(), d_ptr->m_mousePos.y()); @@ -854,10 +855,12 @@ void Q3DBars::drawScene() if (!d_ptr->m_zoomActivated && ZoomRow == d_ptr->m_selectionMode) { item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D()); d_ptr->m_zoomSelection->addItem(item); - d_ptr->m_zoomSelection->d_ptr->setLabelItem( - d_ptr->m_dataSet->d_ptr->rowLabelItems().at( - d_ptr->m_dataSet->d_ptr->rowLabelItems().size() - - row - 1)); + if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > row) { + d_ptr->m_zoomSelection->d_ptr->setLabelItem( + d_ptr->m_dataSet->d_ptr->rowLabelItems().at( + d_ptr->m_dataSet->d_ptr->rowLabelItems().size() + - row - 1)); + } } break; } @@ -869,10 +872,12 @@ void Q3DBars::drawScene() if (!d_ptr->m_zoomActivated && ZoomColumn == d_ptr->m_selectionMode) { item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D()); d_ptr->m_zoomSelection->addItem(item); - d_ptr->m_zoomSelection->d_ptr->setLabelItem( - d_ptr->m_dataSet->d_ptr->columnLabelItems().at( - d_ptr->m_dataSet->d_ptr->columnLabelItems().size() - - bar - 1)); + if (d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > bar) { + d_ptr->m_zoomSelection->d_ptr->setLabelItem( + d_ptr->m_dataSet->d_ptr->columnLabelItems().at( + d_ptr->m_dataSet->d_ptr->columnLabelItems().size() + - bar - 1)); + } } break; } @@ -947,14 +952,19 @@ void Q3DBars::drawScene() LabelItem labelItem = d_ptr->m_selectedBar->d_ptr->selectionLabel(); if (firstSelection || prevItem != d_ptr->m_selectedBar) { QString labelText = d_ptr->m_selectedBar->d_ptr->valueStr(); - labelText.append(QStringLiteral(" (")); - labelText.append(d_ptr->m_dataSet->d_ptr->rowLabels().at( - d_ptr->m_selectedBar->d_ptr->position().x())); - labelText.append(QStringLiteral(", ")); - labelText.append(d_ptr->m_dataSet->d_ptr->columnLabels().at( - d_ptr->m_selectedBar->d_ptr->position().y())); - labelText.append(QStringLiteral(")")); - //qDebug() << labelText; + if ((d_ptr->m_dataSet->d_ptr->columnLabels().size() + > d_ptr->m_selectedBar->d_ptr->position().y()) + && (d_ptr->m_dataSet->d_ptr->rowLabels().size() + > d_ptr->m_selectedBar->d_ptr->position().x())) { + labelText.append(QStringLiteral(" (")); + labelText.append(d_ptr->m_dataSet->d_ptr->rowLabels().at( + d_ptr->m_selectedBar->d_ptr->position().x())); + labelText.append(QStringLiteral(", ")); + labelText.append(d_ptr->m_dataSet->d_ptr->columnLabels().at( + d_ptr->m_selectedBar->d_ptr->position().y())); + labelText.append(QStringLiteral(")")); + //qDebug() << labelText; + } d_ptr->m_drawer->generateLabelItem(&labelItem, labelText); d_ptr->m_selectedBar->d_ptr->setSelectionLabel(labelItem); prevItem = d_ptr->m_selectedBar; @@ -982,19 +992,23 @@ void Q3DBars::drawLabel(const QDataItem &item, const LabelItem &label, bool useDepth, qreal rotation, Q3DBars::LabelPosition position) { // Draw label + LabelItem labelItem = label; + if (!labelItem.textureId()) + return; // No texture, skip + + QSize textureSize = labelItem.size(); QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; GLfloat xPosition; GLfloat yPosition; GLfloat zPosition = zComp; - LabelItem labelItem = label; - QSize textureSize = labelItem.size(); + switch (position) { case Q3DBars::LabelBelow: { - yPosition = -1.5f; - if (!useDepth) - yPosition -= 0.25f; + yPosition = -1.25f; + //if (!useDepth) + // yPosition -= 0.25f; break; } case Q3DBars::LabelLow: @@ -1017,31 +1031,31 @@ void Q3DBars::drawLabel(const QDataItem &item, const LabelItem &label, { yPosition = item.d_ptr->translation().y() + (item.d_ptr->value() / d_ptr->m_heightNormalizer) + 0.1f; - if (!useDepth) - yPosition -= 0.5f; + //if (!useDepth) + // yPosition -= 0.25f; break; } case Q3DBars::LabelBottom: { - yPosition = -2.0f; // TODO: Calculate from scene + yPosition = -1.9f; // TODO: Calculate from scene xPosition = 0.0f; break; } case Q3DBars::LabelTop: { - yPosition = 0.75f; // TODO: Calculate from scene + yPosition = 1.5f; // TODO: Calculate from scene xPosition = 0.0f; break; } case Q3DBars::LabelLeft: { - yPosition = -0.625f; // TODO: Calculate from scene + yPosition = -0.2f; // TODO: Calculate from scene xPosition = -2.5f; // TODO: Calculate from scene break; } case Q3DBars::LabelRight: { - yPosition = -0.625f; // TODO: Calculate from scene + yPosition = -0.2f; // TODO: Calculate from scene xPosition = 2.5f; // TODO: Calculate from scene break; } diff --git a/src/datavis3d/engine/qdataset.cpp b/src/datavis3d/engine/qdataset.cpp index 4a04a39c..effe92d2 100644 --- a/src/datavis3d/engine/qdataset.cpp +++ b/src/datavis3d/engine/qdataset.cpp @@ -51,6 +51,8 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE +const QString empty; + QDataSet::QDataSet() : d_ptr(new QDataSetPrivate(this)) { @@ -68,7 +70,6 @@ void QDataSet::setLabels(const QString &xAxis, const QVector &labelsRow, const QVector &labelsColumn) { - QString empty; // skip empty labels, keep the previous ones if (xAxis != empty && d_ptr->m_xAxis != xAxis) { d_ptr->m_xAxis = xAxis; @@ -247,9 +248,12 @@ float QDataSetPrivate::highestValue() void QDataSetPrivate::updateTextures() { - m_drawer->generateLabelItem(&m_xAxisItem, m_xAxis); - m_drawer->generateLabelItem(&m_zAxisItem, m_zAxis); - m_drawer->generateLabelItem(&m_yAxisItem, m_yAxis); + if (m_xAxis != empty) + m_drawer->generateLabelItem(&m_xAxisItem, m_xAxis); + if (m_zAxis != empty) + m_drawer->generateLabelItem(&m_zAxisItem, m_zAxis); + if (m_yAxis != empty) + m_drawer->generateLabelItem(&m_yAxisItem, m_yAxis); for (int itemCount = 0; itemCount < m_labelsColumn.size(); itemCount++) { if (m_labelItemsColumn.size() < itemCount + 1) m_labelItemsColumn.append(LabelItem()); -- cgit v1.2.3