diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-04-17 13:16:05 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-04-18 06:20:30 +0300 |
commit | f59a0a16e23b416b851e55527bb5ef3e87289794 (patch) | |
tree | 54d98d0a29bea6e7fc4df698947274ee5365473d /src/datavis3d | |
parent | 009d385085992d34a8a30ecb5500303a3b50af41 (diff) |
Axis label drawing added
Fixed some bugs
Change-Id: I6a904ef435cf109a33d9b65a1c8c289864553468
Change-Id: I6a904ef435cf109a33d9b65a1c8c289864553468
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavis3d')
-rw-r--r-- | src/datavis3d/engine/q3dbars.cpp | 116 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.h | 7 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars_p.h | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/qdatarow.cpp | 18 | ||||
-rw-r--r-- | src/datavis3d/engine/qdatarow_p.h | 9 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataset.cpp | 8 |
6 files changed, 128 insertions, 32 deletions
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp index 6f29268e..6affa410 100644 --- a/src/datavis3d/engine/q3dbars.cpp +++ b/src/datavis3d/engine/q3dbars.cpp @@ -451,34 +451,55 @@ void Q3DBars::drawZoomScene() } // Draw labels for axes - // TODO: label of selected row/column above the bars - // TODO: label of selected column/row below the bar labels + QDataItem *dummyItem = NULL; + LabelItem x; + LabelItem z; + LabelItem y; + d_ptr->m_dataSet->d_ptr->axisLabelItems(&x, &z, &y); + LabelItem zoomSelectionLabel = d_ptr->m_zoomSelection->d_ptr->labelItem(); + if (ZoomRow == d_ptr->m_selectionMode) { + drawLabel(*dummyItem, zoomSelectionLabel.textureId(), zoomSelectionLabel.size(), viewMatrix, + projectionMatrix, false, 0.0f, LabelTop); + drawLabel(*dummyItem, z.textureId(), z.size(), viewMatrix, projectionMatrix, false, 0.0f, + LabelBottom); + } else { + drawLabel(*dummyItem, x.textureId(), x.size(), viewMatrix, projectionMatrix, false, 0.0f, + LabelBottom); + drawLabel(*dummyItem, zoomSelectionLabel.textureId(), zoomSelectionLabel.size(), viewMatrix, + projectionMatrix, false, 0.0f, LabelTop); + } + drawLabel(*dummyItem, y.textureId(), y.size(), viewMatrix, projectionMatrix, false, 90.0f, + LabelLeft); // Draw labels for bars for (int col = 0; col < d_ptr->m_zoomSelection->d_ptr->row().size(); col++) { QDataItem *item = d_ptr->m_zoomSelection->d_ptr->getItem(col); // Draw values drawLabel(*item, item->d_ptr->textureId(), item->d_ptr->labelSize(), viewMatrix, - projectionMatrix, false, 0.0f, - LabelOver); + projectionMatrix, false, 0.0f, LabelOver); // Draw labels + // TODO: If there are 0 -valued bars, labeling goes wrong. Fix it. LabelItem labelItem; if (ZoomRow == d_ptr->m_selectionMode) { - // TODO: Testi, piirrä axislabel kokeeksi -// LabelItem x, z, y; -// d_ptr->m_dataSet->d_ptr->axisLabelItems(&x, &z, &y); -// drawLabel(*item, x.textureId(), x.size(), -// viewMatrix, projectionMatrix, false, -45.0f, LabelBelow); - if (d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > col) - labelItem = d_ptr->m_dataSet->d_ptr->columnLabelItems().at(col); + if (d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > col) { + // If draw order of bars is flipped, label draw order should be too + if (d_ptr->m_xFlipped) { + labelItem = d_ptr->m_dataSet->d_ptr->columnLabelItems().at( + d_ptr->m_dataSet->d_ptr->columnLabelItems().size() - col - 1); + } else { + labelItem = d_ptr->m_dataSet->d_ptr->columnLabelItems().at(col); + } + } } else { - // TODO: Testi, piirrä axislabel kokeeksi -// LabelItem x, z, y; -// d_ptr->m_dataSet->d_ptr->axisLabelItems(&x, &z, &y); -// drawLabel(*item, z.textureId(), z.size(), -// viewMatrix, projectionMatrix, false, -45.0f, LabelBelow); - if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > col) - labelItem = d_ptr->m_dataSet->d_ptr->rowLabelItems().at(col); + if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > col) { + // If draw order of bars is flipped, label draw order should be too + if (d_ptr->m_zFlipped) { + labelItem = d_ptr->m_dataSet->d_ptr->rowLabelItems().at( + d_ptr->m_dataSet->d_ptr->rowLabelItems().size() - col - 1); + } else { + labelItem = d_ptr->m_dataSet->d_ptr->rowLabelItems().at(col); + } + } } // Check if there is a label before drawing if (labelItem.textureId() > 0) { @@ -542,19 +563,23 @@ void Q3DBars::drawScene() startRow = 0; stopRow = d_ptr->m_sampleCount.y(); stepRow = 1; + d_ptr->m_zFlipped = false; } else { startRow = d_ptr->m_sampleCount.y() - 1; stopRow = -1; stepRow = -1; + d_ptr->m_zFlipped = true; } if (viewMatrix.row(0).z() < 0) { startBar = 0; stopBar = d_ptr->m_sampleCount.x(); stepBar = 1; + d_ptr->m_xFlipped = false; } else { startBar = d_ptr->m_sampleCount.x() - 1; stopBar = -1; stepBar = -1; + d_ptr->m_xFlipped = true; } // calculate background rotation based on view matrix rotation @@ -801,6 +826,10 @@ 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)); } break; } @@ -812,6 +841,10 @@ 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)); } break; } @@ -900,7 +933,9 @@ void Q3DBars::drawLabel(const QDataItem &item, GLuint textureId, QSize textureSi // Draw label QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; - qreal yPosition = -1.5f; + GLfloat xPosition; + GLfloat yPosition; + GLfloat zPosition = zComp; switch (position) { case Q3DBars::LabelBelow: { @@ -933,14 +968,41 @@ void Q3DBars::drawLabel(const QDataItem &item, GLuint textureId, QSize textureSi yPosition -= 0.5f; break; } + case Q3DBars::LabelBottom: + { + yPosition = -2.0f; // TODO: Calculate from scene + xPosition = 0.0f; + break; + } + case Q3DBars::LabelTop: + { + yPosition = 0.75f; // TODO: Calculate from scene + xPosition = 0.0f; + break; + } + case Q3DBars::LabelLeft: + { + yPosition = -0.625f; // TODO: Calculate from scene + xPosition = -2.5f; // TODO: Calculate from scene + break; + } + case Q3DBars::LabelRight: + { + yPosition = -0.625f; // TODO: Calculate from scene + xPosition = 2.5f; // TODO: Calculate from scene + break; + } + } + + if (position < LabelBottom) { + xPosition = item.d_ptr->translation().x(); + if (useDepth) + zPosition = item.d_ptr->translation().z(); + else if (ZoomColumn == d_ptr->m_selectionMode) + xPosition = -(item.d_ptr->translation().z()) + zComp; // flip first to left } - qreal zPosition = zComp; - qreal xPosition = item.d_ptr->translation().x(); - if (useDepth) - zPosition = item.d_ptr->translation().z(); - else if (ZoomColumn == d_ptr->m_selectionMode) - xPosition = -(item.d_ptr->translation().z()) + zComp; // flip first to left + // Position label modelMatrix.translate(xPosition, yPosition, zPosition); // Rotate @@ -1386,7 +1448,9 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) m_labelTransparency(Q3DBars::TransparencyNone), m_fontSize(10.0f), m_font(QFont(QStringLiteral("Arial"))), - m_drawer(new Drawer(*m_theme, m_font, m_labelTransparency)) + m_drawer(new Drawer(*m_theme, m_font, m_labelTransparency)), + m_xFlipped(false), + m_zFlipped(false) { m_dataSet->d_ptr->setDrawer(m_drawer); } diff --git a/src/datavis3d/engine/q3dbars.h b/src/datavis3d/engine/q3dbars.h index 314e6a03..ef02eee8 100644 --- a/src/datavis3d/engine/q3dbars.h +++ b/src/datavis3d/engine/q3dbars.h @@ -114,12 +114,17 @@ public: ZoomColumn }; + // TODO: Should this be moved to Q3DBarsPrivate? Not for use via API directly? enum LabelPosition { LabelBelow = 0, LabelLow, LabelMid, LabelHigh, - LabelOver + LabelOver, + LabelBottom, // Absolute positions from here onward, used for axes (QDataItem is ignored) + LabelTop, + LabelLeft, + LabelRight }; public: diff --git a/src/datavis3d/engine/q3dbars_p.h b/src/datavis3d/engine/q3dbars_p.h index cb13aea1..bf50367e 100644 --- a/src/datavis3d/engine/q3dbars_p.h +++ b/src/datavis3d/engine/q3dbars_p.h @@ -153,6 +153,8 @@ public: GLfloat m_fontSize; QFont m_font; Drawer *m_drawer; + bool m_xFlipped; + bool m_zFlipped; }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/qdatarow.cpp b/src/datavis3d/engine/qdatarow.cpp index 2146aabe..fee4bdc2 100644 --- a/src/datavis3d/engine/qdatarow.cpp +++ b/src/datavis3d/engine/qdatarow.cpp @@ -71,7 +71,8 @@ void QDataRow::addItem(QDataItem *item) QDataRowPrivate::QDataRowPrivate(QDataRow *q, const QString &label) : q_ptr(q), - m_label(label) + m_label(label), + m_labelItem(LabelItem()) { } @@ -129,4 +130,19 @@ float QDataRowPrivate::highestValue() return max; } +QString QDataRowPrivate::label() +{ + return m_label; +} + +void QDataRowPrivate::setLabelItem(const LabelItem &item) +{ + m_labelItem = item; +} + +LabelItem QDataRowPrivate::labelItem() +{ + return m_labelItem; +} + QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/qdatarow_p.h b/src/datavis3d/engine/qdatarow_p.h index c614af81..50dae99f 100644 --- a/src/datavis3d/engine/qdatarow_p.h +++ b/src/datavis3d/engine/qdatarow_p.h @@ -54,6 +54,7 @@ #include "qdatavis3dglobal.h" #include "qdatarow.h" +#include "labelitem_p.h" #include <QVector> #include <QString> @@ -63,7 +64,7 @@ class QDataItem; class QDataRowPrivate { - public: +public: explicit QDataRowPrivate(QDataRow *q, const QString &label = QString()); ~QDataRowPrivate(); @@ -73,11 +74,15 @@ class QDataRowPrivate QDataItem *getItem(int itemIndex); void verifySize(int size); float highestValue(); + QString label(); + void setLabelItem(const LabelItem &item); + LabelItem labelItem(); - private: +private: QDataRow *q_ptr; QVector<QDataItem*> m_row; QString m_label; + LabelItem m_labelItem; friend class QDataRow; }; diff --git a/src/datavis3d/engine/qdataset.cpp b/src/datavis3d/engine/qdataset.cpp index f32507b6..6a3cafe7 100644 --- a/src/datavis3d/engine/qdataset.cpp +++ b/src/datavis3d/engine/qdataset.cpp @@ -80,13 +80,13 @@ void QDataSet::setLabels(const QString &xAxis, d_ptr->m_zAxis = zAxis; // Generate axis label texture if (d_ptr->m_drawer) - d_ptr->m_drawer->generateLabelItem(d_ptr->m_zAxisItem, xAxis); + d_ptr->m_drawer->generateLabelItem(d_ptr->m_zAxisItem, zAxis); } if (yAxis != empty && d_ptr->m_yAxis != yAxis) { d_ptr->m_yAxis = yAxis; // Generate axis label texture if (d_ptr->m_drawer) - d_ptr->m_drawer->generateLabelItem(d_ptr->m_yAxisItem, xAxis); + d_ptr->m_drawer->generateLabelItem(d_ptr->m_yAxisItem, yAxis); } d_ptr->m_labelsRow = labelsRow; d_ptr->m_labelsColumn = labelsColumn; @@ -251,9 +251,13 @@ void QDataSetPrivate::updateTextures() m_drawer->generateLabelItem(m_zAxisItem, m_zAxis); 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()); m_drawer->generateLabelItem(m_labelItemsColumn[itemCount], m_labelsColumn.at(itemCount)); } for (int itemCount = 0; itemCount < m_labelsRow.size(); itemCount++) { + if (m_labelItemsRow.size() < itemCount + 1) + m_labelItemsRow.append(LabelItem()); m_drawer->generateLabelItem(m_labelItemsRow[itemCount], m_labelsRow.at(itemCount)); } } |