diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-04-03 12:06:54 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2014-04-03 12:14:05 +0300 |
commit | fdf486f4eb908c4471830b9a8708ebe7333b7bbe (patch) | |
tree | 47916e96a779401065a20044f65470cf8abf41f3 /src/datavisualization/engine | |
parent | 4633bb2121eb37397c7912ec9d54d7b3ba54d44d (diff) |
Axis label dragging support, part 2
Task-number: QTRD-2367
+ Added emitting selection signals
+ Added an example about creating an input handler for axis label dragging
- Snapshot for example docs to be taken
Change-Id: I641f4feb9e31c32023727b1c7c695324923accc4
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
12 files changed, 87 insertions, 31 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 8c94a9a4..a6081960 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -1113,4 +1113,10 @@ void Abstract3DController::emitNeedRender() } } +void Abstract3DController::handlePendingClick() +{ + QAbstract3DGraph::ElementType type = m_renderer->clickedType(); + emit elementSelected(type); + // TODO: Consider adding type specific signals +} QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index e433c97e..aa05fc9f 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -278,6 +278,7 @@ signals: void axisXChanged(QAbstract3DAxis *axis); void axisYChanged(QAbstract3DAxis *axis); void axisZChanged(QAbstract3DAxis *axis); + void elementSelected(QAbstract3DGraph::ElementType type); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6b3393ab..38e81be6 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -46,6 +46,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelDirty(true), m_clickPending(false), m_clickedSeries(0), + m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index f6415cca..b94c5180 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -109,6 +109,7 @@ public: inline bool isClickPending() { return m_clickPending; } inline void clearClickPending() { m_clickPending = false; } inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; } + inline QAbstract3DGraph::ElementType clickedType() { return m_clickedType; } LabelItem &selectionLabelItem(); void setSelectionLabel(const QString &label); @@ -158,6 +159,7 @@ protected: bool m_selectionLabelDirty; bool m_clickPending; QAbstract3DSeries *m_clickedSeries; + QAbstract3DGraph::ElementType m_clickedType; QString m_selectionLabel; LabelItem *m_selectionLabelItem; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index ec170129..49b6f383 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -253,6 +253,8 @@ void Bars3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QBar3DSeries *series = static_cast<QBar3DSeries *>(m_renderer->clickedSeries()); + Abstract3DController::handlePendingClick(); + setSelectedBar(position, series, true); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 9962d9e2..46df6464 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2137,33 +2137,37 @@ Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionColor) { - QPoint position; - if (selectionColor == selectionSkipColor - || (selectionColor.w() == labelRowAlpha - && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) - || (selectionColor.w() == labelColumnAlpha - && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn))) { - position = Bars3DController::invalidSelectionPosition(); - } else if (selectionColor.w() == itemAlpha) { + QPoint position = Bars3DController::invalidSelectionPosition(); + m_clickedType = QAbstract3DGraph::ElementNone; + if (selectionColor.w() == itemAlpha) { // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), int(selectionColor.y()) + int(m_axisCacheX.min())); + // Pass item clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementSeries; } else if (selectionColor.w() == labelRowAlpha) { // Row selection - // Use column from previous selection in case we have row + column mode - GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid - position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); - // TODO: Pass label clicked info to input handler (implement in part 2) + if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) { + // Use column from previous selection in case we have row + column mode + GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid + position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); + } + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (selectionColor.w() == labelColumnAlpha) { // Column selection - // Use row from previous selection in case we have row + column mode - GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid - position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); - // TODO: Pass label clicked info to input handler (implement in part 2) + if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn)) { + // Use row from previous selection in case we have row + column mode + GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid + position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); + } + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (selectionColor.w() == labelValueAlpha) { // Value selection position = Bars3DController::invalidSelectionPosition(); - // TODO: Pass label clicked info to input handler (implement in part 2) + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } return position; } diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 5afc1417..8f3c56b9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -120,6 +120,24 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION */ /*! + \enum QAbstract3DGraph::ElementType + \since Qt Data Visualization 1.1 + + Type of an element in the graph. + + \value ElementNone + No defined element. + \value ElementSeries + A series (i.e. an item in a series). + \value ElementAxisXLabel + X axis label. + \value ElementAxisZLabel + Z axis label. + \value ElementAxisYLabel + Y axis label. +*/ + +/*! * \internal */ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -128,6 +146,7 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor d_ptr(d) { qRegisterMetaType<QAbstract3DGraph::ShadowQuality>("QAbstract3DGraph::ShadowQuality"); + qRegisterMetaType<QAbstract3DGraph::ElementType>("QAbstract3DGraph::ElementType"); // Default to frameless window, as typically graphs are not toplevel setFlags(flags() | Qt::FramelessWindowHint); @@ -375,6 +394,15 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) return d_ptr->renderToImage(msaaSamples, renderSize); } +/*! \fn QAbstract3DGraph::elementSelected(ElementType type) + * \since Qt Data Visualization 1.1 + * + * Emits selection \a type when a selection is made in the graph. + * + * Signal can be used for example for implementing custom input handlers, as demonstrated in this + * \l {Axis Range Dragging With Labels Example}{example}. + */ + /*! * \internal */ @@ -500,6 +528,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::selectionModeChanged); QObject::connect(m_visualController, &Abstract3DController::shadowQualityChanged, q_ptr, &QAbstract3DGraph::shadowQualityChanged); + QObject::connect(m_visualController, &Abstract3DController::elementSelected, q_ptr, + &QAbstract3DGraph::elementSelected); + QObject::connect(m_visualController, &Abstract3DController::needRender, this, &QAbstract3DGraphPrivate::renderLater); diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 1109d7b0..85ee484f 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -70,6 +70,14 @@ public: ShadowQualitySoftHigh }; + enum ElementType { + ElementNone = 0, + ElementSeries, + ElementAxisXLabel, + ElementAxisZLabel, + ElementAxisYLabel + }; + public: virtual ~QAbstract3DGraph(); @@ -116,6 +124,7 @@ signals: void activeThemeChanged(Q3DTheme *theme); void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode); void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); + void elementSelected(QAbstract3DGraph::ElementType type); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index a28ee851..b45a956d 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -274,6 +274,8 @@ void Scatter3DController::handlePendingClick() } } + Abstract3DController::handlePendingClick(); + setSelectedItem(index, series); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 43c78137..f5336832 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1752,19 +1752,20 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series) { + m_clickedType = QAbstract3DGraph::ElementNone; if (color != selectionSkipColor) { if (color.w() == labelRowAlpha) { // Row selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (color.w() == labelColumnAlpha) { // Column selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (color.w() == labelValueAlpha) { // Value selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } else { index = int(color.x()) + (int(color.y()) << 8) @@ -1773,6 +1774,7 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, for (int i = 0; i < m_renderingArrays.size(); i++) { if (index < m_renderingArrays.at(i).size()) { series = m_visibleSeriesList.at(i).series(); + m_clickedType = QAbstract3DGraph::ElementSeries; return; // Valid found and already set to return parameters, so we can return } else { index -= m_renderingArrays.at(i).size(); diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 2d64e87d..683a214a 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -126,6 +126,8 @@ void Surface3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_renderer->clickedSeries()); + Abstract3DController::handlePendingClick(); + setSelectedPoint(position, series, true); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index a3ee0971..9e591383 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2247,25 +2247,18 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co // Maps selection Id to surface point in data array QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { -#if 0 // TODO: Implement fully in part 2 + m_clickedType = QAbstract3DGraph::ElementNone; // Check for label selection if (id / alphaMultiplier == labelRowAlpha) { - int row = id - (labelRowAlpha * alphaMultiplier); - qDebug() << "row label" << row; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelColumnAlpha) { - int column = (id - (labelColumnAlpha * alphaMultiplier)) / 256; - qDebug() << "column label" << column; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelValueAlpha) { - int value = (id - (labelValueAlpha * alphaMultiplier)) / 65536; - qDebug() << "value label" << value; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; return Surface3DController::invalidSelectionPosition(); } -#endif // Not a label selection SurfaceSeriesRenderCache *selectedCache = 0; @@ -2286,6 +2279,7 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) int row = ((idInSeries - 1) / sampleSpace.width()) + sampleSpace.y(); m_clickedSeries = selectedCache->series(); + m_clickedType = QAbstract3DGraph::ElementSeries; return QPoint(row, column); } |