summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/surface3dcontroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine/surface3dcontroller.cpp')
-rw-r--r--src/datavisualization/engine/surface3dcontroller.cpp148
1 files changed, 97 insertions, 51 deletions
diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp
index 3cec72d1..0eb66d0e 100644
--- a/src/datavisualization/engine/surface3dcontroller.cpp
+++ b/src/datavisualization/engine/surface3dcontroller.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2013 Digia Plc
+** Copyright (C) 2014 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
@@ -19,9 +19,9 @@
#include "surface3dcontroller_p.h"
#include "surface3drenderer_p.h"
#include "camerahelper_p.h"
-#include "q3dabstractaxis_p.h"
-#include "q3dvalueaxis_p.h"
-#include "q3dcategoryaxis.h"
+#include "qabstract3daxis_p.h"
+#include "qvalue3daxis_p.h"
+#include "qcategory3daxis.h"
#include "qsurfacedataproxy_p.h"
#include "qsurface3dseries_p.h"
#include "shaderhelper_p.h"
@@ -30,10 +30,10 @@
#include <QDebug>
-QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+QT_BEGIN_NAMESPACE_DATAVISUALIZATION
-Surface3DController::Surface3DController(QRect rect)
- : Abstract3DController(rect),
+Surface3DController::Surface3DController(QRect rect, Q3DScene *scene)
+ : Abstract3DController(rect, scene),
m_renderer(0),
m_selectedPoint(invalidSelectionPosition()),
m_selectedSeries(0),
@@ -59,9 +59,7 @@ void Surface3DController::initializeOpenGL()
m_renderer = new Surface3DRenderer(this);
setRenderer(m_renderer);
- synchDataToRenderer();
- QObject::connect(m_renderer, &Surface3DRenderer::pointClicked, this,
- &Surface3DController::handlePointClicked, Qt::QueuedConnection);
+
emitNeedRender();
}
@@ -91,7 +89,8 @@ void Surface3DController::synchDataToRenderer()
}
}
-void Surface3DController::handleAxisAutoAdjustRangeChangedInOrientation(Q3DAbstractAxis::AxisOrientation orientation, bool autoAdjust)
+void Surface3DController::handleAxisAutoAdjustRangeChangedInOrientation(
+ QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust)
{
Q_UNUSED(orientation)
Q_UNUSED(autoAdjust)
@@ -111,11 +110,24 @@ void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
{
Abstract3DController::handleSeriesVisibilityChangedBySender(sender);
+ adjustValueAxisRange();
+
// Visibility changes may require disabling/enabling slicing,
// so just reset selection to ensure everything is still valid.
setSelectedPoint(m_selectedPoint, m_selectedSeries);
}
+void Surface3DController::handlePendingClick()
+{
+ // This function is called while doing the sync, so it is okay to query from renderer
+ QPoint position = m_renderer->clickedPosition();
+ QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_renderer->clickedSeries());
+
+ setSelectedPoint(position, series);
+
+ m_renderer->resetClickedStatus();
+}
+
QPoint Surface3DController::invalidSelectionPosition()
{
static QPoint invalidSelectionPoint(-1, -1);
@@ -134,7 +146,8 @@ void Surface3DController::addSeries(QAbstract3DSeries *series)
if (!m_seriesList.size()) {
Abstract3DController::addSeries(series);
- adjustValueAxisRange();
+ if (series->isVisible())
+ adjustValueAxisRange();
} else {
qWarning("Surface graph only supports a single series.");
}
@@ -146,14 +159,15 @@ void Surface3DController::addSeries(QAbstract3DSeries *series)
void Surface3DController::removeSeries(QAbstract3DSeries *series)
{
- if (series && series->d_ptr->m_controller == this) {
- Abstract3DController::removeSeries(series);
+ bool wasVisible = (series && series->d_ptr->m_controller == this && series->isVisible());
+
+ Abstract3DController::removeSeries(series);
- if (m_selectedSeries == series)
- setSelectedPoint(invalidSelectionPosition(), 0);
+ if (m_selectedSeries == series)
+ setSelectedPoint(invalidSelectionPosition(), 0);
+ if (wasVisible)
adjustValueAxisRange();
- }
}
QList<QSurface3DSeries *> Surface3DController::surfaceSeriesList()
@@ -169,18 +183,20 @@ QList<QSurface3DSeries *> Surface3DController::surfaceSeriesList()
return surfaceSeriesList;
}
-void Surface3DController::setSelectionMode(QDataVis::SelectionFlags mode)
+void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode)
{
// Currently surface only supports row and column modes when also slicing
- if ((mode.testFlag(QDataVis::SelectionRow) || mode.testFlag(QDataVis::SelectionColumn))
- && !mode.testFlag(QDataVis::SelectionSlice)) {
+ if ((mode.testFlag(QAbstract3DGraph::SelectionRow)
+ || mode.testFlag(QAbstract3DGraph::SelectionColumn))
+ && !mode.testFlag(QAbstract3DGraph::SelectionSlice)) {
qWarning("Unsupported selection mode.");
return;
- } else if (mode.testFlag(QDataVis::SelectionSlice)
- && (mode.testFlag(QDataVis::SelectionRow) == mode.testFlag(QDataVis::SelectionColumn))) {
+ } else if (mode.testFlag(QAbstract3DGraph::SelectionSlice)
+ && (mode.testFlag(QAbstract3DGraph::SelectionRow)
+ == mode.testFlag(QAbstract3DGraph::SelectionColumn))) {
qWarning("Must specify one of either row or column selection mode in conjunction with slicing mode.");
} else {
- QDataVis::SelectionFlags oldMode = selectionMode();
+ QAbstract3DGraph::SelectionFlags oldMode = selectionMode();
Abstract3DController::setSelectionMode(mode);
@@ -191,8 +207,8 @@ void Surface3DController::setSelectionMode(QDataVis::SelectionFlags mode)
// 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)) {
+ if (!mode.testFlag(QAbstract3DGraph::SelectionSlice)
+ && oldMode.testFlag(QAbstract3DGraph::SelectionSlice)) {
scene()->setSlicingActive(false);
}
}
@@ -223,13 +239,11 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
pos = invalidSelectionPosition();
}
- if (selectionMode().testFlag(QDataVis::SelectionSlice)) {
+ if (selectionMode().testFlag(QAbstract3DGraph::SelectionSlice)) {
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
- // TODO: (QTRD-2351) This logic doesn't match the renderer logic for non straight surfaces,
- // but that logic needs to change anyway, so this is good for now.
float axisMinX = m_axisX->min();
float axisMaxX = m_axisX->max();
float axisMinZ = m_axisZ->min();
@@ -264,22 +278,23 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
}
}
+void Surface3DController::clearSelection()
+{
+ setSelectedPoint(invalidSelectionPosition(), 0);
+}
+
void Surface3DController::handleArrayReset()
{
- adjustValueAxisRange();
- m_isDataDirty = true;
+ QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(sender())->series();
+ if (series->isVisible()) {
+ adjustValueAxisRange();
+ m_isDataDirty = true;
+ }
// Clear selection unless still valid
setSelectedPoint(m_selectedPoint, m_selectedSeries);
emitNeedRender();
}
-void Surface3DController::handlePointClicked(const QPoint &position, QSurface3DSeries *series)
-{
- setSelectedPoint(position, series);
- // TODO: pass clicked to parent. (QTRD-2517)
- // TODO: Also hover needed? (QTRD-2131)
-}
-
void Surface3DController::handleFlatShadingSupportedChange(bool supported)
{
// Handle renderer flat surface support indicator signal. This happens exactly once per renderer.
@@ -299,7 +314,8 @@ void Surface3DController::handleRowsChanged(int startIndex, int count)
if (m_changedRows.size() == 0)
m_changedRows.reserve(sender->rowCount());
- if (static_cast<QSurface3DSeries *>(m_seriesList.at(0)) == sender->series()) {
+ QSurface3DSeries *series = sender->series();
+ if (series->isVisible()) {
// Change is for the visible series, put the change to queue
int oldChangeCount = m_changedRows.size();
for (int i = 0; i < count; i++) {
@@ -328,7 +344,8 @@ void Surface3DController::handleRowsChanged(int startIndex, int count)
void Surface3DController::handleItemChanged(int rowIndex, int columnIndex)
{
QSurfaceDataProxy *sender = static_cast<QSurfaceDataProxy *>(QObject::sender());
- if (static_cast<QSurface3DSeries *>(m_seriesList.at(0)) == sender->series()) {
+ QSurface3DSeries *series = sender->series();
+ if (series->isVisible()) {
// Change is for the visible series, put the change to queue
bool newItem = true;
QPoint candidate(columnIndex, rowIndex);
@@ -354,8 +371,11 @@ void Surface3DController::handleRowsAdded(int startIndex, int count)
{
Q_UNUSED(startIndex)
Q_UNUSED(count)
- adjustValueAxisRange();
- m_isDataDirty = true;
+ QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(sender())->series();
+ if (series->isVisible()) {
+ adjustValueAxisRange();
+ m_isDataDirty = true;
+ }
emitNeedRender();
}
@@ -363,8 +383,21 @@ void Surface3DController::handleRowsInserted(int startIndex, int count)
{
Q_UNUSED(startIndex)
Q_UNUSED(count)
- adjustValueAxisRange();
- m_isDataDirty = true;
+ QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(sender())->series();
+ if (series == m_selectedSeries) {
+ // If rows inserted to selected series before the selection, adjust the selection
+ int selectedRow = m_selectedPoint.x();
+ if (startIndex <= selectedRow) {
+ selectedRow += count;
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ }
+ }
+
+ if (series->isVisible()) {
+ adjustValueAxisRange();
+ m_isDataDirty = true;
+ }
+
emitNeedRender();
}
@@ -372,20 +405,33 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count)
{
Q_UNUSED(startIndex)
Q_UNUSED(count)
- adjustValueAxisRange();
- m_isDataDirty = true;
+ QSurface3DSeries *series = static_cast<QSurfaceDataProxy *>(sender())->series();
+ if (series == m_selectedSeries) {
+ // If rows removed from selected series before the selection, adjust the selection
+ int selectedRow = m_selectedPoint.x();
+ if (startIndex <= selectedRow) {
+ if ((startIndex + count) > selectedRow)
+ selectedRow = -1; // Selected row removed
+ else
+ selectedRow -= count; // Move selected row down by amount of rows removed
+
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ }
+ }
- // Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ if (series->isVisible()) {
+ adjustValueAxisRange();
+ m_isDataDirty = true;
+ }
emitNeedRender();
}
void Surface3DController::adjustValueAxisRange()
{
- Q3DValueAxis *valueAxisX = static_cast<Q3DValueAxis *>(m_axisX);
- Q3DValueAxis *valueAxisY = static_cast<Q3DValueAxis *>(m_axisY);
- Q3DValueAxis *valueAxisZ = static_cast<Q3DValueAxis *>(m_axisZ);
+ QValue3DAxis *valueAxisX = static_cast<QValue3DAxis *>(m_axisX);
+ QValue3DAxis *valueAxisY = static_cast<QValue3DAxis *>(m_axisY);
+ QValue3DAxis *valueAxisZ = static_cast<QValue3DAxis *>(m_axisZ);
bool adjustX = (valueAxisX && valueAxisX->isAutoAdjustRange());
bool adjustY = (valueAxisY && valueAxisY->isAutoAdjustRange());
bool adjustZ = (valueAxisZ && valueAxisZ->isAutoAdjustRange());
@@ -491,4 +537,4 @@ void Surface3DController::adjustValueAxisRange()
}
}
-QT_DATAVISUALIZATION_END_NAMESPACE
+QT_END_NAMESPACE_DATAVISUALIZATION