From 604d8a652cc088a4b3a4307ec291916757e03201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 13 May 2014 08:26:06 +0300 Subject: API to query custom item selection Task-number: QTRD-3046 + Added missing elementSelected signal to QML Change-Id: I5e79d8e910d2730e3d2ae5550ce576f01aac0b18 Change-Id: I5e79d8e910d2730e3d2ae5550ce576f01aac0b18 Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 37 ++++++++++++++++++++-- .../engine/abstract3dcontroller.cpp | 20 +++++++++++- .../engine/abstract3dcontroller_p.h | 2 ++ .../engine/abstract3drenderer_p.h | 1 + src/datavisualization/engine/bars3drenderer.cpp | 4 +++ src/datavisualization/engine/qabstract3dgraph.cpp | 30 +++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 3 ++ src/datavisualization/engine/scatter3drenderer.cpp | 4 +++ src/datavisualization/engine/surface3drenderer.cpp | 3 ++ src/datavisualizationqml2/abstractdeclarative.cpp | 12 +++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 4 +++ 11 files changed, 116 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index fc91e795..9995c508 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -28,8 +28,8 @@ Note that this type is uncreatable, but contains properties that are shared between the 3D visualizations. - For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag and - \l QAbstract3DGraph::ShadowQuality + For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag, + \l QAbstract3DGraph::ShadowQuality, and \l QAbstract3DGraph::ElementType \sa Bars3D, Scatter3D, Surface3D, {Qt Data Visualization C++ Classes} */ @@ -207,3 +207,36 @@ * * \since Qt Data Visualization 1.1 */ + +/*! + * \qmlmethod int AbstractGraph3D::selectedCustomItemIndex() + * + * Can be used to query the index of the selected custom item after receiving elementSelected signal + * with \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Selection is valid until + * the next elementSelected signal. + * + * \return index of the selected custom item, or -1. + * + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod Custom3DItem AbstractGraph3D::selectedCustomItem() + * + * Can be used to get the selected custom item after receiving elementSelected signal with + * \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Ownership of the item remains + * with the graph. Selection is valid until the next elementSelected signal. + * + * \return the selected custom item, or null. + * + * \since Qt Data Visualization 1.1 + */ + +/*! \qmlsignal AbstractGraph3D::elementSelected(ElementType type) + * + * Emits selection \a type when a selection is made in the graph. + * + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() + * + * \since Qt Data Visualization 1.1 + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index fd773675..7c30f1c0 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -1268,7 +1268,8 @@ void Abstract3DController::handlePendingClick() int Abstract3DController::selectedLabelIndex() const { int index = m_renderer->m_selectedLabelIndex; - if (selectedAxis()->labels().count() <= index) + QAbstract3DAxis *axis = selectedAxis(); + if (axis && axis->labels().count() <= index) index = -1; return index; } @@ -1295,4 +1296,21 @@ QAbstract3DAxis *Abstract3DController::selectedAxis() const return axis; } +int Abstract3DController::selectedCustomItemIndex() const +{ + int index = m_renderer->m_selectedCustomItemIndex; + if (m_customItems.count() <= index) + index = -1; + return index; +} + +QCustom3DItem *Abstract3DController::selectedCustomItem() const +{ + QCustom3DItem *item = 0; + int index = selectedCustomItemIndex(); + if (index >= 0) + item = m_customItems[index]; + return item; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index cebae72b..62b647a6 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -243,6 +243,8 @@ public: int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; + int selectedCustomItemIndex() const; + QCustom3DItem *selectedCustomItem() const; void emitNeedRender(); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 3ae36450..58173a61 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -181,6 +181,7 @@ protected: QAbstract3DSeries *m_clickedSeries; QAbstract3DGraph::ElementType m_clickedType; int m_selectedLabelIndex; + int m_selectedCustomItemIndex; QString m_selectionLabel; LabelItem *m_selectionLabelItem; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index bf381754..015f76d5 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2270,6 +2270,7 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC QPoint position = Bars3DController::invalidSelectionPosition(); m_clickedType = QAbstract3DGraph::ElementNone; m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; if (selectionColor.w() == itemAlpha) { // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), @@ -2305,6 +2306,9 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC } else if (selectionColor.w() == customItemAlpha) { // Custom item selection position = Bars3DController::invalidSelectionPosition(); + m_selectedCustomItemIndex = int(selectionColor.x()) + + (int(selectionColor.y()) << 8) + + (int(selectionColor.z()) << 16); m_clickedType = QAbstract3DGraph::ElementCustomItem; } return position; diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 13d7972a..f2942026 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -452,6 +452,34 @@ QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const return d_ptr->m_visualController->selectedAxis(); } +/*! + * Can be used to query the index of the selected custom item after receiving elementSelected signal + * with QAbstract3DGraph::ElementCustomItem type. Selection is valid until the next elementSelected + * signal. + * + * \return index of the selected custom item, or -1. + * + * \since Qt Data Visualization 1.1 + */ +int QAbstract3DGraph::selectedCustomItemIndex() const +{ + return d_ptr->m_visualController->selectedCustomItemIndex(); +} + +/*! + * Can be used to get the selected custom item after receiving elementSelected signal with + * QAbstract3DGraph::ElementCustomItem type. Ownership of the item remains with the graph. + * Selection is valid until the next elementSelected signal. + * + * \return pointer to the selected custom item, or null. + * + * \since Qt Data Visualization 1.1 + */ +QCustom3DItem *QAbstract3DGraph::selectedCustomItem() const +{ + return d_ptr->m_visualController->selectedCustomItem(); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. @@ -476,7 +504,7 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * Signal can be used for example for implementing custom input handlers, as demonstrated in this * \l {Axis Range Dragging With Labels Example}{example}. * - * \sa selectedLabelIndex(), selectedAxis() + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() */ /*! diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 2ff2d84f..aeccf667 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -117,6 +117,9 @@ public: int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; + int selectedCustomItemIndex() const; + QCustom3DItem *selectedCustomItem() const; + QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); void setMeasureFps(bool enable); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index ff01d51e..9e8712e3 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1762,6 +1762,7 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, { m_clickedType = QAbstract3DGraph::ElementNone; m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; if (color != selectionSkipColor) { if (color.w() == labelRowAlpha) { // Row selection @@ -1781,6 +1782,9 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, } else if (color.w() == customItemAlpha) { // Custom item selection index = Scatter3DController::invalidSelectionIndex(); + m_selectedCustomItemIndex = int(color.x()) + + (int(color.y()) << 8) + + (int(color.z()) << 16); m_clickedType = QAbstract3DGraph::ElementCustomItem; } else { int totalIndex = int(color.x()) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 00e6e21f..f405212f 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2287,6 +2287,8 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { m_clickedType = QAbstract3DGraph::ElementNone; + m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; // Check for label and custom item selection if (id / alphaMultiplier == labelRowAlpha) { m_selectedLabelIndex = id - (alphaMultiplier * labelRowAlpha); @@ -2303,6 +2305,7 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) } else if (id / alphaMultiplier == customItemAlpha) { // Custom item selection m_clickedType = QAbstract3DGraph::ElementCustomItem; + m_selectedCustomItemIndex = id - (alphaMultiplier * customItemAlpha); return Surface3DController::invalidSelectionPosition(); } diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index cdcfcf65..375c9bdb 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -241,6 +241,16 @@ QAbstract3DAxis *AbstractDeclarative::selectedAxis() const return m_controller->selectedAxis(); } +int AbstractDeclarative::selectedCustomItemIndex() const +{ + return m_controller->selectedCustomItemIndex(); +} + +QCustom3DItem *AbstractDeclarative::selectedCustomItem() const +{ + return m_controller->selectedCustomItem(); +} + QQmlListProperty AbstractDeclarative::customItemList() { return QQmlListProperty(this, this, @@ -293,6 +303,8 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) &AbstractDeclarative::themeChanged); QObject::connect(m_controller.data(), &Abstract3DController::selectionModeChanged, this, &AbstractDeclarative::handleSelectionModeChange); + QObject::connect(m_controller.data(), &Abstract3DController::elementSelected, this, + &AbstractDeclarative::elementSelected); QObject::connect(m_controller.data(), &Abstract3DController::axisXChanged, this, &AbstractDeclarative::handleAxisXChanged); diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 7db6c935..3dd07dca 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -137,6 +137,9 @@ public: Q_REVISION(1) Q_INVOKABLE virtual int selectedLabelIndex() const; Q_REVISION(1) Q_INVOKABLE virtual QAbstract3DAxis *selectedAxis() const; + Q_REVISION(1) Q_INVOKABLE virtual int selectedCustomItemIndex() const; + Q_REVISION(1) Q_INVOKABLE virtual QCustom3DItem *selectedCustomItem() const; + QQmlListProperty customItemList(); static void appendCustomItemFunc(QQmlListProperty *list, QCustom3DItem *item); @@ -191,6 +194,7 @@ signals: void renderingModeChanged(AbstractDeclarative::RenderingMode mode); Q_REVISION(1) void measureFpsChanged(bool enabled); Q_REVISION(1) void currentFpsChanged(qreal fps); + Q_REVISION(1) void elementSelected(QAbstract3DGraph::ElementType type); private: QPointer m_controller; -- cgit v1.2.3