summaryrefslogtreecommitdiffstats
path: root/src/datavis3d
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-04-17 13:16:05 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-04-18 06:20:30 +0300
commitf59a0a16e23b416b851e55527bb5ef3e87289794 (patch)
tree54d98d0a29bea6e7fc4df698947274ee5365473d /src/datavis3d
parent009d385085992d34a8a30ecb5500303a3b50af41 (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.cpp116
-rw-r--r--src/datavis3d/engine/q3dbars.h7
-rw-r--r--src/datavis3d/engine/q3dbars_p.h2
-rw-r--r--src/datavis3d/engine/qdatarow.cpp18
-rw-r--r--src/datavis3d/engine/qdatarow_p.h9
-rw-r--r--src/datavis3d/engine/qdataset.cpp8
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));
}
}