summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/datavisualization/data/qabstract3dseries.cpp21
-rw-r--r--src/datavisualization/data/qabstract3dseries.h6
-rw-r--r--src/datavisualization/data/qabstract3dseries_p.h6
-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
15 files changed, 100 insertions, 14 deletions
diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp
index 81a2f1b8..1aa4a46d 100644
--- a/src/datavisualization/data/qabstract3dseries.cpp
+++ b/src/datavisualization/data/qabstract3dseries.cpp
@@ -488,6 +488,19 @@ QLinearGradient QAbstract3DSeries::multiHighlightGradient() const
return d_ptr->m_multiHighlightGradient;
}
+void QAbstract3DSeries::setName(const QString &name)
+{
+ if (d_ptr->m_name != name) {
+ d_ptr->setName(name);
+ emit nameChanged(name);
+ }
+}
+
+QString QAbstract3DSeries::name() const
+{
+ return d_ptr->m_name;
+}
+
// QAbstract3DSeriesPrivate
QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type)
@@ -629,6 +642,14 @@ void QAbstract3DSeriesPrivate::setMultiHighlightGradient(const QLinearGradient &
m_controller->markSeriesVisualsDirty();
}
+void QAbstract3DSeriesPrivate::setName(const QString &name)
+{
+ m_name = name;
+ m_changeTracker.nameChanged = true;
+ if (m_controller)
+ m_controller->markSeriesVisualsDirty();
+}
+
void QAbstract3DSeriesPrivate::resetToTheme(const Q3DTheme &theme, int seriesIndex, bool force)
{
int themeIndex = seriesIndex;
diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h
index b03b574d..bbcf60ad 100644
--- a/src/datavisualization/data/qabstract3dseries.h
+++ b/src/datavisualization/data/qabstract3dseries.h
@@ -47,6 +47,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject
Q_PROPERTY(QLinearGradient singleHighlightGradient READ singleHighlightGradient WRITE setSingleHighlightGradient NOTIFY singleHighlightGradientChanged)
Q_PROPERTY(QColor multiHighlightColor READ multiHighlightColor WRITE setMultiHighlightColor NOTIFY multiHighlightColorChanged)
Q_PROPERTY(QLinearGradient multiHighlightGradient READ multiHighlightGradient WRITE setMultiHighlightGradient NOTIFY multiHighlightGradientChanged)
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
public:
enum SeriesType {
@@ -109,6 +110,9 @@ public:
void setMultiHighlightGradient(const QLinearGradient &gradient);
QLinearGradient multiHighlightGradient() const;
+ void setName(const QString &name);
+ QString name() const;
+
signals:
void itemLabelFormatChanged(QString format);
void visibilityChanged(bool visible);
@@ -122,6 +126,7 @@ signals:
void singleHighlightGradientChanged(QLinearGradient gradient);
void multiHighlightColorChanged(QColor color);
void multiHighlightGradientChanged(QLinearGradient gradient);
+ void nameChanged(QString name);
protected:
QScopedPointer<QAbstract3DSeriesPrivate> d_ptr;
@@ -135,6 +140,7 @@ private:
friend class Scatter3DController;
friend class QBar3DSeries;
friend class SeriesRenderCache;
+ friend class Abstract3DRenderer;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h
index 7b2ea2e6..8e83ff84 100644
--- a/src/datavisualization/data/qabstract3dseries_p.h
+++ b/src/datavisualization/data/qabstract3dseries_p.h
@@ -50,6 +50,7 @@ struct QAbstract3DSeriesChangeBitField {
bool singleHighlightGradientChanged : 1;
bool multiHighlightColorChanged : 1;
bool multiHighlightGradientChanged : 1;
+ bool nameChanged : 1;
QAbstract3DSeriesChangeBitField()
: itemLabelFormatChanged(true),
@@ -62,7 +63,8 @@ struct QAbstract3DSeriesChangeBitField {
singleHighlightColorChanged(true),
singleHighlightGradientChanged(true),
multiHighlightColorChanged(true),
- multiHighlightGradientChanged(true)
+ multiHighlightGradientChanged(true),
+ nameChanged(true)
{
}
};
@@ -113,6 +115,7 @@ public:
void setSingleHighlightGradient(const QLinearGradient &gradient);
void setMultiHighlightColor(const QColor &color);
void setMultiHighlightGradient(const QLinearGradient &gradient);
+ void setName(const QString &name);
void resetToTheme(const Q3DTheme &theme, int seriesIndex, bool force);
@@ -136,6 +139,7 @@ public:
QColor m_multiHighlightColor;
QLinearGradient m_multiHighlightGradient;
+ QString m_name;
};
QT_DATAVISUALIZATION_END_NAMESPACE
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;
}