summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/data/qbardataproxy.cpp10
-rw-r--r--src/datavisualization/data/qbardataproxy.h1
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp2
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.cpp32
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.h3
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.cpp6
-rw-r--r--src/datavisualization/engine/surface3dcontroller.cpp30
-rw-r--r--src/datavisualization/engine/surface3dcontroller_p.h2
8 files changed, 57 insertions, 29 deletions
diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp
index a26e446e..4247e963 100644
--- a/src/datavisualization/data/qbardataproxy.cpp
+++ b/src/datavisualization/data/qbardataproxy.cpp
@@ -427,6 +427,16 @@ const QBarDataItem *QBarDataProxy::itemAt(int rowIndex, int columnIndex) const
}
/*!
+ * \return pointer to the item at \a position. The X-value of \a position indicates the row
+ * and the Y-value indicates the column. The item is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QBarDataItem *QBarDataProxy::itemAt(const QPoint &position) const
+{
+ return itemAt(position.x(), position.y());
+}
+
+/*!
* \internal
*/
QBarDataProxyPrivate *QBarDataProxy::dptr()
diff --git a/src/datavisualization/data/qbardataproxy.h b/src/datavisualization/data/qbardataproxy.h
index 0ad71365..780897e8 100644
--- a/src/datavisualization/data/qbardataproxy.h
+++ b/src/datavisualization/data/qbardataproxy.h
@@ -58,6 +58,7 @@ public:
const QBarDataArray *array() const;
const QBarDataRow *rowAt(int rowIndex) const;
const QBarDataItem *itemAt(int rowIndex, int columnIndex) const;
+ const QBarDataItem *itemAt(const QPoint &position) const;
void resetArray();
void resetArray(QBarDataArray *newArray);
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index e5f06cc6..b7e15014 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -221,7 +221,7 @@ 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);
+ static_cast<Surface3DController *>(d_ptr->m_controller)->setSelectedPoint(position, this, true);
else
dptr()->setSelectedPoint(position);
}
diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp
index 43ce40eb..b19f1f0a 100644
--- a/src/datavisualization/data/qsurfacedataproxy.cpp
+++ b/src/datavisualization/data/qsurfacedataproxy.cpp
@@ -259,6 +259,29 @@ const QSurfaceDataArray *QSurfaceDataProxy::array() const
}
/*!
+ * \return pointer to the item at \a rowIndex, \a columnIndex. It is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QSurfaceDataItem *QSurfaceDataProxy::itemAt(int rowIndex, int columnIndex) const
+{
+ const QSurfaceDataArray &dataArray = *dptrc()->m_dataArray;
+ Q_ASSERT(rowIndex >= 0 && rowIndex < dataArray.size());
+ const QSurfaceDataRow &dataRow = *dataArray[rowIndex];
+ Q_ASSERT(columnIndex >= 0 && columnIndex < dataRow.size());
+ return &dataRow.at(columnIndex);
+}
+
+/*!
+ * \return pointer to the item at \a position. The X-value of \a position indicates the row
+ * and the Y-value indicates the column. The item is guaranteed to be valid only
+ * until the next call that modifies data.
+ */
+const QSurfaceDataItem *QSurfaceDataProxy::itemAt(const QPoint &position) const
+{
+ return itemAt(position.x(), position.y());
+}
+
+/*!
* \property QSurfaceDataProxy::rowCount
*
* \return number of rows in the data.
@@ -282,15 +305,6 @@ int QSurfaceDataProxy::columnCount() const
}
/*!
- * \return pointer to the item at \a index. It is guaranteed to be valid only until the next call that
- * modifies data.
- */
-const QSurfaceDataItem *QSurfaceDataProxy::itemAt(int index) const
-{
- return &dptrc()->m_dataArray->at(index)->at(2);
-}
-
-/*!
* \internal
*/
QSurfaceDataProxyPrivate *QSurfaceDataProxy::dptr()
diff --git a/src/datavisualization/data/qsurfacedataproxy.h b/src/datavisualization/data/qsurfacedataproxy.h
index 0933faf6..9cfe3b77 100644
--- a/src/datavisualization/data/qsurfacedataproxy.h
+++ b/src/datavisualization/data/qsurfacedataproxy.h
@@ -49,7 +49,8 @@ public:
int rowCount() const;
int columnCount() const;
const QSurfaceDataArray *array() const;
- const QSurfaceDataItem *itemAt(int index) const;
+ const QSurfaceDataItem *itemAt(int rowIndex, int columnIndex) const;
+ const QSurfaceDataItem *itemAt(const QPoint &position) const;
void resetArray(QSurfaceDataArray *newArray);
diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp
index d8146149..adb34458 100644
--- a/src/datavisualization/engine/qabstract3dgraph.cpp
+++ b/src/datavisualization/engine/qabstract3dgraph.cpp
@@ -85,6 +85,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
automatically. If you wish to control the slice view yourself via Q3DScene, do not set this
flag. When setting this mode flag, either \c SelectionRow or \c SelectionColumn must also
be set, but not both. Slicing is supported by Q3DBars and Q3DSurface only.
+ When this flag is set, slice mode is entered in the following situations:
+ \list
+ \li When selection is changed explicitly via series API to a visible item
+ \li When selection is changed by clicking on the graph
+ \li When the selection mode changes and the selected item is visible
+ \endlist
\value SelectionMultiSeries
Setting this mode means that items for all series at same position are highlighted, instead
of just the selected item. The actual selection in the other series doesn't change.
diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp
index 0eb66d0e..5aeecb20 100644
--- a/src/datavisualization/engine/surface3dcontroller.cpp
+++ b/src/datavisualization/engine/surface3dcontroller.cpp
@@ -103,7 +103,7 @@ void Surface3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected point - may be moved offscreen
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
}
void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
@@ -111,10 +111,6 @@ 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()
@@ -123,7 +119,7 @@ void Surface3DController::handlePendingClick()
QPoint position = m_renderer->clickedPosition();
QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_renderer->clickedSeries());
- setSelectedPoint(position, series);
+ setSelectedPoint(position, series, true);
m_renderer->resetClickedStatus();
}
@@ -154,7 +150,7 @@ void Surface3DController::addSeries(QAbstract3DSeries *series)
QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series);
if (surfaceSeries->selectedPoint() != invalidSelectionPosition())
- setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries);
+ setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries, false);
}
void Surface3DController::removeSeries(QAbstract3DSeries *series)
@@ -164,7 +160,7 @@ void Surface3DController::removeSeries(QAbstract3DSeries *series)
Abstract3DController::removeSeries(series);
if (m_selectedSeries == series)
- setSelectedPoint(invalidSelectionPosition(), 0);
+ setSelectedPoint(invalidSelectionPosition(), 0, false);
if (wasVisible)
adjustValueAxisRange();
@@ -203,7 +199,7 @@ void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags 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);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, true);
// Special case: Always deactivate slicing when changing away from slice
// automanagement, as this can't be handled in setSelectedBar.
@@ -215,7 +211,7 @@ void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode
}
}
-void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series)
+void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series, bool enterSlice)
{
// If the selection targets non-existent point, clear selection instead.
QPoint pos = position;
@@ -253,7 +249,7 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
if (item.x() < axisMinX || item.x() > axisMaxX
|| item.z() < axisMinZ || item.z() > axisMaxZ) {
scene()->setSlicingActive(false);
- } else {
+ } else if (enterSlice) {
scene()->setSlicingActive(true);
}
}
@@ -280,7 +276,7 @@ void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSer
void Surface3DController::clearSelection()
{
- setSelectedPoint(invalidSelectionPosition(), 0);
+ setSelectedPoint(invalidSelectionPosition(), 0, false);
}
void Surface3DController::handleArrayReset()
@@ -291,7 +287,7 @@ void Surface3DController::handleArrayReset()
m_isDataDirty = true;
}
// Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
emitNeedRender();
}
@@ -335,7 +331,7 @@ void Surface3DController::handleRowsChanged(int startIndex, int count)
adjustValueAxisRange();
// Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
emitNeedRender();
}
}
@@ -361,7 +357,7 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex)
adjustValueAxisRange();
// Clear selection unless still valid
- setSelectedPoint(m_selectedPoint, m_selectedSeries);
+ setSelectedPoint(m_selectedPoint, m_selectedSeries, false);
emitNeedRender();
}
}
@@ -389,7 +385,7 @@ void Surface3DController::handleRowsInserted(int startIndex, int count)
int selectedRow = m_selectedPoint.x();
if (startIndex <= selectedRow) {
selectedRow += count;
- setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries, false);
}
}
@@ -415,7 +411,7 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count)
else
selectedRow -= count; // Move selected row down by amount of rows removed
- setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries);
+ setSelectedPoint(QPoint(selectedRow, m_selectedPoint.y()), m_selectedSeries, false);
}
}
diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h
index 624bea47..4ca9c8e2 100644
--- a/src/datavisualization/engine/surface3dcontroller_p.h
+++ b/src/datavisualization/engine/surface3dcontroller_p.h
@@ -76,7 +76,7 @@ public:
virtual void synchDataToRenderer();
void setSelectionMode(QAbstract3DGraph::SelectionFlags mode);
- void setSelectedPoint(const QPoint &position, QSurface3DSeries *series);
+ void setSelectedPoint(const QPoint &position, QSurface3DSeries *series, bool enterSlice);
virtual void clearSelection();
virtual void handleAxisAutoAdjustRangeChangedInOrientation(