summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-01-14 10:08:28 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-01-14 10:26:32 +0200
commit2d31d2416643598b15664c766326f18c5b698c79 (patch)
tree5ec572bca5dc2a9923f3d3578d5c68dbb0596bf1 /src/datavisualization/engine
parent06dd7be52f2bcd23b9a622a17d3d0e8963a7dd17 (diff)
Add series name property
+Don't call updateScene for every render cycle +Fixed item label update when format or name changes +Misc cosmetic fixes Task-number: QTRD-2736 Task-number: QTRD-2571 Change-Id: I43aa6b8e3202b09529b17a22bb24d05fcb545609 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp3
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp8
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h1
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp9
-rw-r--r--src/datavisualization/engine/q3dobject.cpp4
-rw-r--r--src/datavisualization/engine/q3dscene.cpp27
-rw-r--r--src/datavisualization/engine/q3dscene.h1
-rw-r--r--src/datavisualization/engine/q3dscene_p.h1
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp7
-rw-r--r--src/datavisualization/engine/seriesrendercache.cpp5
-rw-r--r--src/datavisualization/engine/seriesrendercache_p.h3
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp12
12 files changed, 68 insertions, 13 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 14585679..919db22c 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -136,7 +136,8 @@ void Abstract3DController::synchDataToRenderer()
if (!m_renderer)
return;
- m_renderer->updateScene(m_scene);
+ if (m_scene->d_ptr->m_sceneDirty)
+ m_renderer->updateScene(m_scene);
m_renderer->updateTheme(m_themeManager->activeTheme());
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 19b9a8c8..e812496c 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -354,8 +354,14 @@ void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesLi
visibleCount = 0;
}
foreach (QAbstract3DSeries *current, seriesList) {
- if (current->isVisible())
+ if (current->isVisible()) {
+ // Item selection label may need update
+ if (current->d_ptr->m_changeTracker.nameChanged
+ || current->d_ptr->m_changeTracker.itemLabelFormatChanged) {
+ m_selectionLabelDirty = true;
+ }
m_visibleSeriesList[visibleCount++].populate(current, this);
+ }
}
}
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 068ee0ef..c375b0b8 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -137,6 +137,7 @@ protected:
QRect m_primarySubViewport;
QRect m_secondarySubViewport;
float m_devicePixelRatio;
+ bool m_selectionLabelDirty;
#ifdef DISPLAY_RENDER_SPEED
bool m_isFirstFrame;
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 0a477d53..66a18e17 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -1756,9 +1756,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
glDisable(GL_DEPTH_TEST);
// Draw the selection label
LabelItem &labelItem = selectedBar->selectionLabelItem();
- if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId()) {
+ if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId()
+ || m_selectionLabelDirty) {
QString labelText = selectedBar->selectionLabel();
- if (labelText.isNull()) {
+ if (labelText.isNull() || m_selectionLabelDirty) {
static const QString rowIndexTag(QStringLiteral("@rowIdx"));
static const QString rowLabelTag(QStringLiteral("@rowLabel"));
static const QString rowTitleTag(QStringLiteral("@rowTitle"));
@@ -1767,6 +1768,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
static const QString colTitleTag(QStringLiteral("@colTitle"));
static const QString valueTitleTag(QStringLiteral("@valueTitle"));
static const QString valueLabelTag(QStringLiteral("@valueLabel"));
+ static const QString seriesNameTag(QStringLiteral("@seriesName"));
// Custom format expects printf format specifier. There is no tag for it.
labelText = generateValueLabel(
@@ -1797,7 +1799,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
labelText.replace(valueLabelTag, valueLabelText);
}
+ labelText.replace(seriesNameTag, m_visibleSeriesList[m_visualSelectedBarSeriesIndex].name());
+
selectedBar->setSelectionLabel(labelText);
+ m_selectionLabelDirty = false;
}
m_drawer->generateLabelItem(labelItem, labelText);
m_selectedBar = selectedBar;
diff --git a/src/datavisualization/engine/q3dobject.cpp b/src/datavisualization/engine/q3dobject.cpp
index c4098fd0..89a682e1 100644
--- a/src/datavisualization/engine/q3dobject.cpp
+++ b/src/datavisualization/engine/q3dobject.cpp
@@ -18,7 +18,7 @@
#include "q3dobject.h"
#include "q3dobject_p.h"
-#include "q3dscene.h"
+#include "q3dscene_p.h"
QT_DATAVISUALIZATION_BEGIN_NAMESPACE
@@ -97,6 +97,8 @@ void Q3DObject::setPosition(const QVector3D &position)
void Q3DObject::setDirty(bool dirty)
{
d_ptr->m_isDirty = dirty;
+ if (parentScene())
+ parentScene()->d_ptr->m_sceneDirty = true;
}
/*!
diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp
index ce037b55..6fbfac51 100644
--- a/src/datavisualization/engine/q3dscene.cpp
+++ b/src/datavisualization/engine/q3dscene.cpp
@@ -185,6 +185,8 @@ void Q3DScene::setPrimarySubViewport(const QRect &primarySubViewport)
d_ptr->m_primarySubViewport = intersectedViewport;
d_ptr->updateGLSubViewports();
d_ptr->m_changeTracker.primarySubViewportChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit primarySubViewportChanged(intersectedViewport);
emit d_ptr->needRender();
}
@@ -247,6 +249,8 @@ void Q3DScene::setSecondarySubViewport(const QRect &secondarySubViewport)
d_ptr->m_secondarySubViewport = intersectedViewport;
d_ptr->updateGLSubViewports();
d_ptr->m_changeTracker.secondarySubViewportChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit secondarySubViewportChanged(intersectedViewport);
emit d_ptr->needRender();
}
@@ -265,6 +269,8 @@ void Q3DScene::setSelectionQueryPosition(const QPoint &point)
if (point != d_ptr->m_selectionQueryPosition) {
d_ptr->m_selectionQueryPosition = point;
d_ptr->m_changeTracker.selectionQueryPositionChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit selectionQueryPositionChanged(point);
emit d_ptr->needRender();
}
@@ -300,6 +306,8 @@ void Q3DScene::setSlicingActive(bool isSlicing)
if (d_ptr->m_isSlicingActive != isSlicing) {
d_ptr->m_isSlicingActive = isSlicing;
d_ptr->m_changeTracker.slicingActivatedChanged = true;
+ d_ptr->m_sceneDirty = true;
+
d_ptr->calculateSubViewports();
emit slicingActiveChanged(isSlicing);
emit d_ptr->needRender();
@@ -322,6 +330,8 @@ void Q3DScene::setSecondarySubviewOnTop(bool isSecondaryOnTop)
if (d_ptr->m_isSecondarySubviewOnTop != isSecondaryOnTop) {
d_ptr->m_isSecondarySubviewOnTop = isSecondaryOnTop;
d_ptr->m_changeTracker.subViewportOrderChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit secondarySubviewOnTopChanged(isSecondaryOnTop);
emit d_ptr->needRender();
}
@@ -359,6 +369,8 @@ void Q3DScene::setActiveCamera(Q3DCamera *camera)
d_ptr->m_camera = camera;
d_ptr->m_changeTracker.cameraChanged = true;
+ d_ptr->m_sceneDirty = true;
+
if (camera) {
connect(camera, &Q3DCamera::xRotationChanged, d_ptr.data(),
@@ -397,6 +409,8 @@ void Q3DScene::setActiveLight(Q3DLight *light)
if (light != d_ptr->m_light) {
d_ptr->m_light = light;
d_ptr->m_changeTracker.lightChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit activeLightChanged(light);
}
}
@@ -417,6 +431,8 @@ void Q3DScene::setDevicePixelRatio(float pixelRatio)
if (d_ptr->m_devicePixelRatio != pixelRatio) {
d_ptr->m_devicePixelRatio = pixelRatio;
d_ptr->m_changeTracker.devicePixelRatioChanged = true;
+ d_ptr->m_sceneDirty = true;
+
emit devicePixelRatioChanged(pixelRatio);
d_ptr->updateGLViewport();
emit d_ptr->needRender();
@@ -518,6 +534,9 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other)
m_changeTracker.devicePixelRatioChanged = false;
other.m_changeTracker.devicePixelRatioChanged = false;
}
+
+ m_sceneDirty = false;
+ other.m_sceneDirty = false;
}
void Q3DScenePrivate::setViewport(const QRect &viewport)
@@ -553,6 +572,7 @@ void Q3DScenePrivate::setWindowSize(const QSize &size)
m_windowSize = size;
updateGLViewport();
m_changeTracker.windowSizeChanged = true;
+ m_sceneDirty = true;
emit needRender();
}
}
@@ -568,9 +588,9 @@ void Q3DScenePrivate::calculateSubViewports()
const float smallerViewPortRatio = 0.2f;
if (m_isSlicingActive) {
q_ptr->setPrimarySubViewport(QRect(0,
- 0,
- m_viewport.width() * smallerViewPortRatio,
- m_viewport.height() * smallerViewPortRatio));
+ 0,
+ m_viewport.width() * smallerViewPortRatio,
+ m_viewport.height() * smallerViewPortRatio));
q_ptr->setSecondarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height()));
} else {
q_ptr->setPrimarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height()));
@@ -589,6 +609,7 @@ void Q3DScenePrivate::updateGLViewport()
m_glViewport.setHeight(m_viewport.height() * m_devicePixelRatio);
m_changeTracker.viewportChanged = true;
+ m_sceneDirty = true;
// Do default subviewport changes first, then allow signal listeners to override.
updateGLSubViewports();
diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h
index f57d3351..fb543cdb 100644
--- a/src/datavisualization/engine/q3dscene.h
+++ b/src/datavisualization/engine/q3dscene.h
@@ -104,6 +104,7 @@ private:
friend class Surface3DRenderer;
friend class Scatter3DRenderer;
friend class Q3DCameraPrivate;
+ friend class Q3DObject;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h
index c9d9d1f6..94265568 100644
--- a/src/datavisualization/engine/q3dscene_p.h
+++ b/src/datavisualization/engine/q3dscene_p.h
@@ -107,6 +107,7 @@ public:
QRect m_glViewport;
QRect m_glPrimarySubViewport;
QRect m_glSecondarySubViewport;
+ bool m_sceneDirty;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 9973069b..3eee8ff0 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -1471,15 +1471,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Draw the selection label
LabelItem &labelItem = selectedItem->selectionLabelItem();
if (m_selectedItem != selectedItem || m_updateLabels
- || !labelItem.textureId()) {
+ || !labelItem.textureId() || m_selectionLabelDirty) {
QString labelText = selectedItem->selectionLabel();
- if (labelText.isNull()) {
+ if (labelText.isNull() || m_selectionLabelDirty) {
static const QString xTitleTag(QStringLiteral("@xTitle"));
static const QString yTitleTag(QStringLiteral("@yTitle"));
static const QString zTitleTag(QStringLiteral("@zTitle"));
static const QString xLabelTag(QStringLiteral("@xLabel"));
static const QString yLabelTag(QStringLiteral("@yLabel"));
static const QString zLabelTag(QStringLiteral("@zLabel"));
+ static const QString seriesNameTag(QStringLiteral("@seriesName"));
labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat();
@@ -1511,8 +1512,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
selectedItem->position().z());
labelText.replace(zLabelTag, valueLabelText);
}
+ labelText.replace(seriesNameTag, m_visibleSeriesList[m_selectedItemSeriesIndex].name());
selectedItem->setSelectionLabel(labelText);
+ m_selectionLabelDirty = false;
}
m_drawer->generateLabelItem(labelItem, labelText);
m_selectedItem = selectedItem;
diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp
index 7526ac03..cea0f7b1 100644
--- a/src/datavisualization/engine/seriesrendercache.cpp
+++ b/src/datavisualization/engine/seriesrendercache.cpp
@@ -164,6 +164,11 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *
renderer->fixGradientAndGenerateTexture(&gradient, &m_multiHighlightGradientTexture);
changeTracker.multiHighlightGradientChanged = false;
}
+
+ if (seriesChanged || changeTracker.nameChanged) {
+ m_name = series->name();
+ changeTracker.nameChanged = false;
+ }
}
void SeriesRenderCache::cleanup(TextureHelper *texHelper)
diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h
index 906a6c0d..2bf7a1cc 100644
--- a/src/datavisualization/engine/seriesrendercache_p.h
+++ b/src/datavisualization/engine/seriesrendercache_p.h
@@ -61,6 +61,7 @@ public:
inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; }
inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; }
inline const GLuint &multiHighlightGradientTexture() const { return m_multiHighlightGradientTexture; }
+ inline const QString &name() const { return m_name; }
protected:
QAbstract3DSeries *m_series;
@@ -75,6 +76,8 @@ protected:
GLuint m_singleHighlightGradientTexture;
QVector3D m_multiHighlightColor;
GLuint m_multiHighlightGradientTexture;
+
+ QString m_name;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index b08558b2..f89233be 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -538,8 +538,8 @@ void Surface3DRenderer::updateScene(Q3DScene *scene)
Abstract3DRenderer::updateScene(scene);
- if (m_selectionPointer) {
- m_selectionPointer->updateScene(m_cachedScene);
+ if (m_selectionPointer && m_selectionActive
+ && m_cachedSelectionMode.testFlag(QDataVis::SelectionItem)) {
m_selectionDirty = true; // Ball may need repositioning if scene changes
}
@@ -1692,7 +1692,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
glUseProgram(0);
// Selection handling
- if (m_selectionDirty) {
+ if (m_selectionDirty || m_selectionLabelDirty) {
QPoint visiblePoint = Surface3DController::invalidSelectionPosition();
if (m_selectedPoint != Surface3DController::invalidSelectionPosition()) {
int x = m_selectedPoint.x() - m_sampleSpace.y();
@@ -1956,6 +1956,7 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row
static const QString xLabelTag(QStringLiteral("@xLabel"));
static const QString yLabelTag(QStringLiteral("@yLabel"));
static const QString zLabelTag(QStringLiteral("@zLabel"));
+ static const QString seriesNameTag(QStringLiteral("@seriesName"));
labelText.replace(xTitleTag, m_axisCacheX.title());
labelText.replace(yTitleTag, m_axisCacheY.title());
@@ -1985,6 +1986,11 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row
labelText.replace(zLabelTag, valueLabelText);
}
+ // TODO: Get from correct series once multiple series supported
+ labelText.replace(seriesNameTag, m_visibleSeriesList[0].name());
+
+ m_selectionLabelDirty = false;
+
return labelText;
}