summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/data/qabstract3dseries_p.h1
-rw-r--r--src/datavisualization/data/qbar3dseries.cpp2
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp40
-rw-r--r--src/datavisualization/data/qsurface3dseries.h6
-rw-r--r--src/datavisualization/data/qsurface3dseries_p.h5
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp4
-rw-r--r--src/datavisualization/engine/q3dsurface.cpp25
-rw-r--r--src/datavisualization/engine/q3dsurface.h5
-rw-r--r--src/datavisualization/engine/scatter3dcontroller.cpp4
-rw-r--r--src/datavisualization/engine/surface3dcontroller.cpp103
-rw-r--r--src/datavisualization/engine/surface3dcontroller_p.h12
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp20
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h5
-rw-r--r--src/datavisualizationqml2/declarativeseries.cpp19
-rw-r--r--src/datavisualizationqml2/declarativeseries_p.h8
-rw-r--r--src/datavisualizationqml2/declarativesurface.cpp12
-rw-r--r--src/datavisualizationqml2/declarativesurface_p.h5
-rw-r--r--tests/scattertest/main.cpp6
-rw-r--r--tests/scattertest/scatterchart.cpp12
-rw-r--r--tests/scattertest/scatterchart.h1
-rw-r--r--tests/surfacetest/graphmodifier.cpp4
21 files changed, 191 insertions, 108 deletions
diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h
index a82c3554..a5dbe867 100644
--- a/src/datavisualization/data/qabstract3dseries_p.h
+++ b/src/datavisualization/data/qabstract3dseries_p.h
@@ -68,6 +68,7 @@ private:
friend class Scatter3DController;
friend class QBar3DSeries;
friend class QScatter3DSeries;
+ friend class QSurface3DSeries;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp
index ac292e5e..0e6bdd60 100644
--- a/src/datavisualization/data/qbar3dseries.cpp
+++ b/src/datavisualization/data/qbar3dseries.cpp
@@ -136,7 +136,7 @@ QBarDataProxy *QBar3DSeries::dataProxy() const
}
/*!
- * \property Q3DBars::selectedBar
+ * \property QBar3DSeries::selectedBar
*
* Selects a bar at the \a position. The \a position is the (row, column) position in
* the data array of the series.
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index d17daeb1..98d406c0 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -126,6 +126,35 @@ QSurfaceDataProxy *QSurface3DSeries::dataProxy() const
}
/*!
+ * \property QSurface3DSeries::selectedPoint
+ *
+ * Selects a surface grid point in a \a position. The position is the (row, column) position in
+ * the data array of the series.
+ * Only one point can be selected at a time.
+ * To clear selection, set invalidSelectionPosition() as the \a position.
+ * If this series is added to a graph, the graph can adjust the selection according to user
+ * interaction or if it becomes invalid.
+ */
+void QSurface3DSeries::setSelectedPoint(const QPoint &position)
+{
+ // Don't do this in private to avoid loops, as that is used for callback from controller.
+ if (d_ptr->m_controller)
+ static_cast<Surface3DController *>(d_ptr->m_controller)->setSelectedPoint(position, this);
+ else
+ dptr()->setSelectedPoint(position);
+}
+
+QPoint QSurface3DSeries::selectedPoint() const
+{
+ return dptrc()->m_selectedPoint;
+}
+
+QPoint QSurface3DSeries::invalidSelectionPosition() const
+{
+ return Surface3DController::invalidSelectionPosition();
+}
+
+/*!
* \internal
*/
QSurface3DSeriesPrivate *QSurface3DSeries::dptr()
@@ -144,7 +173,8 @@ const QSurface3DSeriesPrivate *QSurface3DSeries::dptrc() const
// QSurface3DSeriesPrivate
QSurface3DSeriesPrivate::QSurface3DSeriesPrivate(QSurface3DSeries *q)
- : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeSurface)
+ : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeSurface),
+ m_selectedPoint(Surface3DController::invalidSelectionPosition())
{
m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)");
}
@@ -188,4 +218,12 @@ void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne
}
}
+void QSurface3DSeriesPrivate::setSelectedPoint(const QPoint &position)
+{
+ if (position != m_selectedPoint) {
+ m_selectedPoint = position;
+ emit qptr()->selectedPointChanged(m_selectedPoint);
+ }
+}
+
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qsurface3dseries.h b/src/datavisualization/data/qsurface3dseries.h
index db432e41..e449af58 100644
--- a/src/datavisualization/data/qsurface3dseries.h
+++ b/src/datavisualization/data/qsurface3dseries.h
@@ -30,6 +30,7 @@ class QT_DATAVISUALIZATION_EXPORT QSurface3DSeries : public QAbstract3DSeries
{
Q_OBJECT
Q_PROPERTY(QSurfaceDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged)
+ Q_PROPERTY(QPoint selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged)
public:
explicit QSurface3DSeries(QObject *parent = 0);
@@ -39,8 +40,13 @@ public:
void setDataProxy(QSurfaceDataProxy *proxy);
QSurfaceDataProxy *dataProxy() const;
+ void setSelectedPoint(const QPoint &position);
+ QPoint selectedPoint() const;
+ QPoint invalidSelectionPosition() const;
+
signals:
void dataProxyChanged(QSurfaceDataProxy *proxy);
+ void selectedPointChanged(QPoint position);
protected:
explicit QSurface3DSeries(QSurface3DSeriesPrivate *d, QObject *parent = 0);
diff --git a/src/datavisualization/data/qsurface3dseries_p.h b/src/datavisualization/data/qsurface3dseries_p.h
index 6e5d9337..a1752b77 100644
--- a/src/datavisualization/data/qsurface3dseries_p.h
+++ b/src/datavisualization/data/qsurface3dseries_p.h
@@ -43,9 +43,14 @@ public:
virtual void setDataProxy(QAbstractDataProxy *proxy);
virtual void connectControllerAndProxy(Abstract3DController *newController);
+
+ void setSelectedPoint(const QPoint &position);
+
private:
QSurface3DSeries *qptr();
+ QPoint m_selectedPoint;
+
private:
friend class QSurface3DSeries;
};
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp
index b1cf8338..e1a038cb 100644
--- a/src/datavisualization/engine/bars3dcontroller.cpp
+++ b/src/datavisualization/engine/bars3dcontroller.cpp
@@ -244,11 +244,11 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series)
{
bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series);
+ Abstract3DController::removeSeries(series);
+
if (m_selectedBarSeries == series)
setSelectedBar(invalidSelectionPosition(), 0);
- Abstract3DController::removeSeries(series);
-
if (firstRemoved) {
adjustAxisRanges();
diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp
index b19b5a0c..1655c338 100644
--- a/src/datavisualization/engine/q3dsurface.cpp
+++ b/src/datavisualization/engine/q3dsurface.cpp
@@ -39,8 +39,9 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
* surface can be changed by controlling the smooth status.
*
* The Q3DSurface supports selection by showing a highlighted ball on the data point where the user has clicked
- * with left mouse button (when default input handler is in use). The selection pointer is accompanied with
- * a label which in default case shows the value of the data point and the coordinates of the point.
+ * with left mouse button (when default input handler is in use) or selected via QSurface3DSeries.
+ * The selection pointer is accompanied with a label which in default case shows the value of the
+ * data point and the coordinates of the point.
*
* The value range and the label format shown on the axis can be controlled through Q3DValueAxis.
*
@@ -118,8 +119,6 @@ Q3DSurface::Q3DSurface()
&Q3DSurface::surfaceGridEnabledChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::fontChanged, this,
&Q3DSurface::fontChanged);
- QObject::connect(d_ptr->m_shared, &Surface3DController::selectedPointChanged, this,
- &Q3DSurface::selectedPointChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::needRender, this,
&Q3DWindow::renderLater);
}
@@ -374,24 +373,6 @@ Q3DScene *Q3DSurface::scene() const
}
/*!
- * \property Q3DSurface::selectedPoint
- *
- * Selects a surface grid point in a \a position. The position is the (row, column) position in
- * the data array of the active data proxy.
- * Only one point can be selected at a time.
- * To clear selection, specify an illegal \a position, e.g. (-1, -1).
- */
-void Q3DSurface::setSelectedPoint(const QPoint &position)
-{
- d_ptr->m_shared->setSelectedPoint(position);
-}
-
-QPoint Q3DSurface::selectedPoint() const
-{
- return d_ptr->m_shared->selectedPoint();
-}
-
-/*!
* \property Q3DSurface::labelStyle
*
* Sets label \a style to one of \c QDataVis::LabelStyle. It is preset to
diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h
index 3287bee4..9bc04f78 100644
--- a/src/datavisualization/engine/q3dsurface.h
+++ b/src/datavisualization/engine/q3dsurface.h
@@ -46,7 +46,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DSurface : public Q3DWindow
Q_PROPERTY(QLinearGradient gradient READ gradient WRITE setGradient)
Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
Q_PROPERTY(Q3DScene* scene READ scene)
- Q_PROPERTY(QPoint selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged)
public:
explicit Q3DSurface();
@@ -97,9 +96,6 @@ public:
Q3DScene *scene() const;
- void setSelectedPoint(const QPoint &position);
- QPoint selectedPoint() const;
-
void setLabelStyle(QDataVis::LabelStyle style);
QDataVis::LabelStyle labelStyle() const;
@@ -114,7 +110,6 @@ signals:
void smoothSurfaceEnabledChanged(bool enabled);
void surfaceGridEnabledChanged(bool visible);
void fontChanged(QFont font);
- void selectedPointChanged(QPoint position);
protected:
void mouseDoubleClickEvent(QMouseEvent *event);
diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp
index 27d1b609..34b1c563 100644
--- a/src/datavisualization/engine/scatter3dcontroller.cpp
+++ b/src/datavisualization/engine/scatter3dcontroller.cpp
@@ -99,11 +99,11 @@ void Scatter3DController::removeSeries(QAbstract3DSeries *series)
{
bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series);
+ Abstract3DController::removeSeries(series);
+
if (m_selectedItemSeries == series)
setSelectedItem(invalidSelectionIndex(), 0);
- Abstract3DController::removeSeries(series);
-
if (firstRemoved)
adjustValueAxisRange();
}
diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp
index 9bd4b508..31c8b178 100644
--- a/src/datavisualization/engine/surface3dcontroller.cpp
+++ b/src/datavisualization/engine/surface3dcontroller.cpp
@@ -37,7 +37,8 @@ Surface3DController::Surface3DController(QRect rect)
m_isSmoothSurfaceEnabled(false),
m_isSurfaceEnabled(true),
m_isSurfaceGridEnabled(true),
- m_selectedPoint(noSelectionPoint())
+ m_selectedPoint(invalidSelectionPosition()),
+ m_selectedSeries(0)
{
// Setting a null axis creates a new default axis according to orientation and graph type.
// Note: these cannot be set in the Abstract3DController constructor, as they will call virtual
@@ -97,7 +98,7 @@ void Surface3DController::synchDataToRenderer()
}
if (m_changeTracker.selectedPointChanged) {
- m_renderer->updateSelectedPoint(m_selectedPoint);
+ m_renderer->updateSelectedPoint(m_selectedPoint, m_selectedSeries);
m_changeTracker.selectedPointChanged = false;
}
}
@@ -115,10 +116,19 @@ void Surface3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected point - may be moved offscreen
- setSelectedPoint(m_selectedPoint);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries);
}
-QPoint Surface3DController::noSelectionPoint()
+void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
+{
+ Abstract3DController::handleSeriesVisibilityChangedBySender(sender);
+
+ // Visibility changes may require disabling/enabling slicing,
+ // so just reset selection to ensure everything is still valid.
+ setSelectedPoint(m_selectedPoint, m_selectedSeries);
+}
+
+QPoint Surface3DController::invalidSelectionPosition()
{
static QPoint noSelectionPoint(-1, -1);
return noSelectionPoint;
@@ -132,12 +142,13 @@ void Surface3DController::addSeries(QAbstract3DSeries *series)
Abstract3DController::addSeries(series);
adjustValueAxisRange();
-
- // TODO: Temp until selection by series is properly implemented
- setSelectedPoint(noSelectionPoint());
} else {
qWarning("Surface graph only supports a single series.");
}
+
+ QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series);
+ if (surfaceSeries->selectedPoint() != invalidSelectionPosition())
+ setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries);
}
void Surface3DController::removeSeries(QAbstract3DSeries *series)
@@ -145,10 +156,10 @@ void Surface3DController::removeSeries(QAbstract3DSeries *series)
if (series && series->d_ptr->m_controller == this) {
Abstract3DController::removeSeries(series);
- adjustValueAxisRange();
+ if (m_selectedSeries == series)
+ setSelectedPoint(invalidSelectionPosition(), 0);
- // TODO: Temp until selection by series is properly implemented
- setSelectedPoint(noSelectionPoint());
+ adjustValueAxisRange();
}
}
@@ -228,43 +239,51 @@ void Surface3DController::setSelectionMode(QDataVis::SelectionFlags mode)
&& (mode.testFlag(QDataVis::SelectionRow) == mode.testFlag(QDataVis::SelectionColumn))) {
qWarning("Must specify one of either row or column selection mode in conjunction with slicing mode.");
} else {
- // When setting selection mode to a new slicing mode, activate slicing
- if (mode != selectionMode()) {
- bool isSlicing = mode.testFlag(QDataVis::SelectionSlice);
- if (isSlicing && m_selectedPoint != noSelectionPoint())
- scene()->setSlicingActive(true);
- else
- scene()->setSlicingActive(false);
- }
+ QDataVis::SelectionFlags oldMode = selectionMode();
Abstract3DController::setSelectionMode(mode);
+
+ if (mode != oldMode) {
+ // Refresh selection upon mode change to ensure slicing is correctly updated
+ // according to series the visibility.
+ setSelectedPoint(m_selectedPoint, m_selectedSeries);
+
+ // Special case: Always deactivate slicing when changing away from slice
+ // automanagement, as this can't be handled in setSelectedBar.
+ if (!mode.testFlag(QDataVis::SelectionSlice)
+ && oldMode.testFlag(QDataVis::SelectionSlice)) {
+ scene()->setSlicingActive(false);
+ }
+ }
}
}
-void Surface3DController::setSelectedPoint(const QPoint &position)
+void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series)
{
// If the selection targets non-existent point, clear selection instead.
QPoint pos = position;
- // TODO: Selection needs to be refactored to be handled by series
+ // Series may already have been removed, so check it before setting the selection.
+ if (!m_seriesList.contains(series))
+ series = 0;
+
const QSurfaceDataProxy *proxy = 0;
- if (m_seriesList.size()) {
- QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_seriesList.at(0));
- proxy = static_cast<QSurfaceDataProxy *>(series->dataProxy());
- } else {
- return;
- }
+ if (series)
+ proxy = series->dataProxy();
- if (pos != noSelectionPoint()) {
+ if (!proxy)
+ pos = invalidSelectionPosition();
+
+ if (pos != invalidSelectionPosition()) {
int maxRow = proxy->rowCount() - 1;
int maxCol = proxy->columnCount() - 1;
if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol)
- pos = noSelectionPoint();
+ pos = invalidSelectionPosition();
}
if (selectionMode().testFlag(QDataVis::SelectionSlice)) {
- if (pos == noSelectionPoint()) {
+ if (pos == invalidSelectionPosition() || !series->isVisible()) {
scene()->setSlicingActive(false);
} else {
// If the selected point is outside data window, or there is no selected point, disable slicing
@@ -276,7 +295,8 @@ void Surface3DController::setSelectedPoint(const QPoint &position)
float axisMaxZ = float(m_axisZ->max());
// Comparisons between float and double are not accurate, so fudge our comparison values
- //a little to get all rows and columns into view that need to be visible.
+ // a little to get all rows and columns into view that need to be visible.
+ // TODO: Probably unnecessary after QTRD-2622 done
const float fudgeFactor = 0.00001f;
float fudgedAxisXRange = (axisMaxX - axisMinX) * fudgeFactor;
float fudgedAxisZRange = (axisMaxZ - axisMinZ) * fudgeFactor;
@@ -297,29 +317,34 @@ void Surface3DController::setSelectedPoint(const QPoint &position)
if (pos != m_selectedPoint) {
m_selectedPoint = pos;
+ m_selectedSeries = series;
m_changeTracker.selectedPointChanged = true;
- emit selectedPointChanged(pos);
+
+ // Clear selection from other series and finally set new selection to the specified series
+ foreach (QAbstract3DSeries *otherSeries, m_seriesList) {
+ QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(otherSeries);
+ if (surfaceSeries != m_selectedSeries)
+ surfaceSeries->dptr()->setSelectedPoint(invalidSelectionPosition());
+ }
+ if (m_selectedSeries)
+ m_selectedSeries->dptr()->setSelectedPoint(m_selectedPoint);
+
emitNeedRender();
}
}
-QPoint Surface3DController::selectedPoint() const
-{
- return m_selectedPoint;
-}
-
void Surface3DController::handleArrayReset()
{
adjustValueAxisRange();
m_isDataDirty = true;
// Clear selection unless still valid
- setSelectedPoint(m_selectedPoint);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries);
emitNeedRender();
}
-void Surface3DController::handlePointClicked(const QPoint &position)
+void Surface3DController::handlePointClicked(const QPoint &position, QSurface3DSeries *series)
{
- setSelectedPoint(position);
+ setSelectedPoint(position, series);
// TODO: pass clicked to parent. (QTRD-2517)
// TODO: Also hover needed? (QTRD-2131)
}
diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h
index 09c0ca5b..56419d75 100644
--- a/src/datavisualization/engine/surface3dcontroller_p.h
+++ b/src/datavisualization/engine/surface3dcontroller_p.h
@@ -66,6 +66,8 @@ private:
bool m_isSurfaceGridEnabled;
QLinearGradient m_userDefinedGradient;
QPoint m_selectedPoint;
+ QSurface3DSeries *m_selectedSeries; // Points to the series for which the point is selected in
+ // single series selection cases.
public:
explicit Surface3DController(QRect rect);
@@ -86,14 +88,13 @@ public:
void setGradientColorAt(qreal pos, const QColor &color);
void setSelectionMode(QDataVis::SelectionFlags mode);
-
- void setSelectedPoint(const QPoint &position);
- QPoint selectedPoint() const;
+ void setSelectedPoint(const QPoint &position, QSurface3DSeries *series);
virtual void handleAxisAutoAdjustRangeChangedInOrientation(Q3DAbstractAxis::AxisOrientation orientation, bool autoAdjust);
virtual void handleAxisRangeChangedBySender(QObject *sender);
+ virtual void handleSeriesVisibilityChangedBySender(QObject *sender);
- static QPoint noSelectionPoint();
+ static QPoint invalidSelectionPosition();
virtual void addSeries(QAbstract3DSeries *series);
virtual void removeSeries(QAbstract3DSeries *series);
@@ -103,12 +104,11 @@ public slots:
void handleArrayReset();
// Renderer callback handlers
- void handlePointClicked(const QPoint &position);
+ void handlePointClicked(const QPoint &position, QSurface3DSeries *series);
void handleRequestSmoothSurface(bool enable);
signals:
void smoothSurfaceEnabledChanged(bool enable);
- void selectedPointChanged(QPoint position);
void surfaceVisibleChanged(bool visible);
void surfaceGridEnabledChanged(bool enable);
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index e19b70d8..b90b3527 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -112,7 +112,8 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
m_shadowQualityMultiplier(3),
m_clickedPointId(invalidSelectionId),
m_hasHeightAdjustmentChanged(true),
- m_selectedPoint(Surface3DController::noSelectionPoint())
+ m_selectedPoint(Surface3DController::invalidSelectionPosition()),
+ m_selectedSeries(0)
{
// Check if flat feature is supported
ShaderHelper tester(this, QStringLiteral(":/shaders/vertexSurfaceFlat"),
@@ -266,7 +267,7 @@ void Surface3DRenderer::updateData()
delete m_sliceDataArray.at(i);
m_sliceDataArray.clear();
- m_selectionDirty = true;
+ updateSelectedPoint(m_selectedPoint, m_selectedSeries);
}
void Surface3DRenderer::updateSliceDataModel(const QPoint &point)
@@ -337,7 +338,8 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array)
float axisMaxZ = float(m_axisCacheZ.max());
// Comparisons between float and double are not accurate, so fudge our comparison values
- //a little to get all rows and columns into view that need to be visible.
+ // a little to get all rows and columns into view that need to be visible.
+ // TODO: Probably unnecessary after QTRD-2622 done
const float fudgeFactor = 0.00001f;
float fudgedAxisXRange = (axisMaxX - axisMinX) * fudgeFactor;
float fudgedAxisZRange = (axisMaxZ - axisMinZ) * fudgeFactor;
@@ -937,7 +939,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536;
#endif
- emit pointClicked(QPoint(selectionIdToSurfacePoint(selectionId)));
+ emit pointClicked(QPoint(selectionIdToSurfacePoint(selectionId)),
+ static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series()));
}
// Draw the surface
@@ -1588,8 +1591,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Selection handling
if (m_selectionDirty) {
- QPoint visiblePoint = Surface3DController::noSelectionPoint();
- if (m_selectedPoint != Surface3DController::noSelectionPoint()) {
+ QPoint visiblePoint = Surface3DController::invalidSelectionPosition();
+ if (m_selectedPoint != Surface3DController::invalidSelectionPosition()) {
int x = m_selectedPoint.x() - m_sampleSpace.y();
int y = m_selectedPoint.y() - m_sampleSpace.x();
if (x >= 0 && y >= 0 && x < m_sampleSpace.height() && y < m_sampleSpace.width()
@@ -1599,7 +1602,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
}
if (m_cachedSelectionMode == QDataVis::SelectionNone
- || visiblePoint == Surface3DController::noSelectionPoint()) {
+ || visiblePoint == Surface3DController::invalidSelectionPosition()) {
m_selectionActive = false;
} else {
// TODO: Need separate selection ball for slice and main surface view QTRD-2515
@@ -1769,9 +1772,10 @@ bool Surface3DRenderer::updateSmoothStatus(bool enable)
return m_cachedSmoothSurface;
}
-void Surface3DRenderer::updateSelectedPoint(const QPoint &position)
+void Surface3DRenderer::updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series)
{
m_selectedPoint = position;
+ m_selectedSeries = series;
m_selectionDirty = true;
}
diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h
index 5ac20e0e..2d5c8da9 100644
--- a/src/datavisualization/engine/surface3drenderer_p.h
+++ b/src/datavisualization/engine/surface3drenderer_p.h
@@ -127,6 +127,7 @@ private:
uint m_clickedPointId;
bool m_hasHeightAdjustmentChanged;
QPoint m_selectedPoint;
+ const QSurface3DSeries *m_selectedSeries;
public:
explicit Surface3DRenderer(Surface3DController *controller);
@@ -138,7 +139,7 @@ public:
void updateSurfaceGridStatus(bool enable);
void updateSurfaceGradient(const QLinearGradient &gradient);
void updateSlicingActive(bool isSlicing);
- void updateSelectedPoint(const QPoint &position);
+ void updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series);
void drawSlicedScene();
void render(GLuint defaultFboHandle = 0);
@@ -148,7 +149,7 @@ protected:
virtual void loadMeshFile();
signals:
- void pointClicked(QPoint position);
+ void pointClicked(QPoint position, QSurface3DSeries *series);
void requestSmoothSurface(bool enable);
private:
diff --git a/src/datavisualizationqml2/declarativeseries.cpp b/src/datavisualizationqml2/declarativeseries.cpp
index 56601f83..57610c1a 100644
--- a/src/datavisualizationqml2/declarativeseries.cpp
+++ b/src/datavisualizationqml2/declarativeseries.cpp
@@ -54,7 +54,7 @@ void DeclarativeBar3DSeries::setSelectedBar(const QPointF &position)
QPointF DeclarativeBar3DSeries::selectedBar() const
{
- return QBar3DSeries::selectedBar();
+ return QPointF(QBar3DSeries::selectedBar());
}
QPointF DeclarativeBar3DSeries::invalidSelectionPosition() const
@@ -87,12 +87,29 @@ void DeclarativeScatter3DSeries::appendSeriesChildren(QQmlListProperty<QObject>
DeclarativeSurface3DSeries::DeclarativeSurface3DSeries(QObject *parent)
: QSurface3DSeries(parent)
{
+ QObject::connect(this, &QSurface3DSeries::selectedPointChanged, this,
+ &DeclarativeSurface3DSeries::selectedPointChanged);
}
DeclarativeSurface3DSeries::~DeclarativeSurface3DSeries()
{
}
+void DeclarativeSurface3DSeries::setSelectedPoint(const QPointF &position)
+{
+ QSurface3DSeries::setSelectedPoint(position.toPoint());
+}
+
+QPointF DeclarativeSurface3DSeries::selectedPoint() const
+{
+ return QPointF(QSurface3DSeries::selectedPoint());
+}
+
+QPointF DeclarativeSurface3DSeries::invalidSelectionPosition() const
+{
+ return QPointF(QSurface3DSeries::invalidSelectionPosition());
+}
+
QQmlListProperty<QObject> DeclarativeSurface3DSeries::seriesChildren()
{
return QQmlListProperty<QObject>(this, this, &DeclarativeSurface3DSeries::appendSeriesChildren
diff --git a/src/datavisualizationqml2/declarativeseries_p.h b/src/datavisualizationqml2/declarativeseries_p.h
index 72b7cbcb..6f5885c3 100644
--- a/src/datavisualizationqml2/declarativeseries_p.h
+++ b/src/datavisualizationqml2/declarativeseries_p.h
@@ -77,13 +77,21 @@ class DeclarativeSurface3DSeries : public QSurface3DSeries
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<QObject> seriesChildren READ seriesChildren)
+ Q_PROPERTY(QPointF selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged)
Q_CLASSINFO("DefaultProperty", "seriesChildren")
public:
DeclarativeSurface3DSeries(QObject *parent = 0);
virtual ~DeclarativeSurface3DSeries();
+ void setSelectedPoint(const QPointF &position);
+ QPointF selectedPoint() const;
+ Q_INVOKABLE QPointF invalidSelectionPosition() const;
+
QQmlListProperty<QObject> seriesChildren();
static void appendSeriesChildren(QQmlListProperty<QObject> *list, QObject *element);
+
+signals:
+ void selectedPointChanged(QPointF position);
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp
index 72dda752..df73cbff 100644
--- a/src/datavisualizationqml2/declarativesurface.cpp
+++ b/src/datavisualizationqml2/declarativesurface.cpp
@@ -42,8 +42,6 @@ DeclarativeSurface::DeclarativeSurface(QQuickItem *parent)
QObject::connect(m_shared, &Surface3DController::smoothSurfaceEnabledChanged, this,
&DeclarativeSurface::smoothSurfaceEnabledChanged);
- QObject::connect(m_shared, &Surface3DController::selectedPointChanged, this,
- &DeclarativeSurface::selectedPointChanged);
QObject::connect(m_shared, &Surface3DController::surfaceVisibleChanged, this,
&DeclarativeSurface::surfaceVisibleChanged);
QObject::connect(m_shared, &Surface3DController::surfaceGridEnabledChanged, this,
@@ -159,16 +157,6 @@ ColorGradient *DeclarativeSurface::gradient() const
return m_gradient;
}
-void DeclarativeSurface::setSelectedPoint(const QPointF &position)
-{
- m_shared->setSelectedPoint(position.toPoint());
-}
-
-QPointF DeclarativeSurface::selectedPoint() const
-{
- return QPointF(m_shared->selectedPoint());
-}
-
void DeclarativeSurface::setControllerGradient(const ColorGradient &gradient)
{
QLinearGradient newGradient;
diff --git a/src/datavisualizationqml2/declarativesurface_p.h b/src/datavisualizationqml2/declarativesurface_p.h
index 7e55a594..e0b4c7dd 100644
--- a/src/datavisualizationqml2/declarativesurface_p.h
+++ b/src/datavisualizationqml2/declarativesurface_p.h
@@ -54,7 +54,6 @@ class DeclarativeSurface : public AbstractDeclarative
Q_PROPERTY(bool smoothSurfaceEnabled READ isSmoothSurfaceEnabled WRITE setSmoothSurfaceEnabled NOTIFY smoothSurfaceEnabledChanged)
Q_PROPERTY(bool surfaceGridEnabled READ isSurfaceGridEnabled WRITE setSurfaceGridEnabled NOTIFY surfaceGridEnabledChanged)
Q_PROPERTY(ColorGradient *gradient READ gradient WRITE setGradient)
- Q_PROPERTY(QPointF selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged)
Q_PROPERTY(QQmlListProperty<QSurface3DSeries> seriesList READ seriesList)
Q_CLASSINFO("DefaultProperty", "seriesList")
@@ -78,9 +77,6 @@ public:
void setGradient(ColorGradient *gradient);
ColorGradient *gradient() const;
- void setSelectedPoint(const QPointF &position);
- QPointF selectedPoint() const;
-
QQmlListProperty<QSurface3DSeries> seriesList();
static void appendSeriesFunc(QQmlListProperty<QSurface3DSeries> *list, QSurface3DSeries *series);
static int countSeriesFunc(QQmlListProperty<QSurface3DSeries> *list);
@@ -93,7 +89,6 @@ signals:
void surfaceVisibleChanged(bool visible);
void smoothSurfaceEnabledChanged(bool enabled);
void surfaceGridEnabledChanged(bool visible);
- void selectedPointChanged(QPoint position);
protected:
void handleGradientUpdate();
diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp
index 7734faa2..e9cb58b1 100644
--- a/tests/scattertest/main.cpp
+++ b/tests/scattertest/main.cpp
@@ -103,6 +103,9 @@ int main(int argc, char **argv)
QPushButton *addSeriesButton = new QPushButton(widget);
addSeriesButton->setText(QStringLiteral("Add Series"));
+ QPushButton *removeSeriesButton = new QPushButton(widget);
+ removeSeriesButton->setText(QStringLiteral("Remove Series"));
+
QPushButton *startTimerButton = new QPushButton(widget);
startTimerButton->setText(QStringLiteral("Start/stop timer"));
@@ -162,6 +165,7 @@ int main(int argc, char **argv)
vLayout->addWidget(removeBunchButton, 0, Qt::AlignTop);
vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop);
vLayout->addWidget(addSeriesButton, 0, Qt::AlignTop);
+ vLayout->addWidget(removeSeriesButton, 0, Qt::AlignTop);
vLayout->addWidget(startTimerButton, 0, Qt::AlignTop);
vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop);
vLayout->addWidget(backgroundCheckBox);
@@ -208,6 +212,8 @@ int main(int argc, char **argv)
&ScatterDataModifier::selectItem);
QObject::connect(addSeriesButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::addSeries);
+ QObject::connect(removeSeriesButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::removeSeries);
QObject::connect(startTimerButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::startStopTimer);
QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier,
diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp
index eba69888..fe784d74 100644
--- a/tests/scattertest/scatterchart.cpp
+++ b/tests/scattertest/scatterchart.cpp
@@ -435,6 +435,18 @@ void ScatterDataModifier::addSeries()
m_targetSeries = oldTargetSeries;
}
+void ScatterDataModifier::removeSeries()
+{
+ if (m_targetSeries) {
+ m_chart->removeSeries(m_targetSeries);
+ delete m_targetSeries;
+ if (m_chart->seriesList().size())
+ m_targetSeries = m_chart->seriesList().at(0);
+ else
+ m_targetSeries = 0;
+ }
+}
+
void ScatterDataModifier::changeShadowQuality(int quality)
{
QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h
index 2567613f..539c430d 100644
--- a/tests/scattertest/scatterchart.h
+++ b/tests/scattertest/scatterchart.h
@@ -65,6 +65,7 @@ public slots:
void handleSelectionChange(int index);
void setGradient();
void addSeries();
+ void removeSeries();
signals:
void shadowQualityChanged(int quality);
diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp
index d415b9af..568d57c9 100644
--- a/tests/surfacetest/graphmodifier.cpp
+++ b/tests/surfacetest/graphmodifier.cpp
@@ -60,7 +60,7 @@ GraphModifier::GraphModifier(Q3DSurface *graph)
changeStyle();
connect(&m_timer, &QTimer::timeout, this, &GraphModifier::timeout);
- connect(m_graph, &Q3DSurface::selectedPointChanged, this, &GraphModifier::selectedPointChanged);
+ connect(m_theSeries, &QSurface3DSeries::selectedPointChanged, this, &GraphModifier::selectedPointChanged);
}
GraphModifier::~GraphModifier()
@@ -324,7 +324,7 @@ void GraphModifier::selectButtonClicked()
int row = rand() % proxy->rowCount();
int col = rand() % proxy->columnCount();
- m_graph->setSelectedPoint(QPoint(row, col));
+ m_theSeries->setSelectedPoint(QPoint(row, col));
}
void GraphModifier::selectedPointChanged(const QPoint &point)