summaryrefslogtreecommitdiffstats
path: root/examples/charts/chartsgallery/interactionschart.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2023-06-09 10:04:14 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-06-09 09:21:42 +0000
commit420bc17f4a6d02adac70d23e3c9e31ce3dea5fab (patch)
tree79db6e1faac034b2a602e943a9bb185b302c3b88 /examples/charts/chartsgallery/interactionschart.cpp
parent92fdde892b08c5f7e18c065e9f78f24d79ec8554 (diff)
Rename gallery and qmlgallery examples as they are too genericv6.6.0-beta1
Gallery name conflicted with widgets example of same name. New names are chartsgallery and qmlchartsgallery. Fixes: QTBUG-114408 Change-Id: Iee9fdfa1f685685a4118fb9d401c1e53147546cb Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> (cherry picked from commit 2ae46ef08f6a10a0d44557bb592db06be667f2bb) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'examples/charts/chartsgallery/interactionschart.cpp')
-rw-r--r--examples/charts/chartsgallery/interactionschart.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/examples/charts/chartsgallery/interactionschart.cpp b/examples/charts/chartsgallery/interactionschart.cpp
new file mode 100644
index 00000000..740c9f64
--- /dev/null
+++ b/examples/charts/chartsgallery/interactionschart.cpp
@@ -0,0 +1,77 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "interactionschart.h"
+
+#include <QLineSeries>
+#include <QtMath>
+#include <QValueAxis>
+
+InteractionsChart::InteractionsChart(QGraphicsItem *parent, Qt::WindowFlags wFlags, QLineSeries *series)
+ : QChart(QChart::ChartTypeCartesian, parent, wFlags), m_series(series)
+{
+}
+
+void InteractionsChart::clickPoint(const QPointF &point)
+{
+ // Find the closest data point
+ m_movingPoint = QPoint();
+ m_clicked = false;
+ const auto points = m_series->points();
+ for (QPointF p : points) {
+ if (distance(p, point) < distance(m_movingPoint, point)) {
+ m_movingPoint = p;
+ m_clicked = true;
+ }
+ }
+}
+
+qreal InteractionsChart::distance(const QPointF &p1, const QPointF &p2)
+{
+ return qSqrt((p1.x() - p2.x()) * (p1.x() - p2.x())
+ + (p1.y() - p2.y()) * (p1.y() - p2.y()));
+}
+
+void InteractionsChart::setPointClicked(bool clicked)
+{
+ m_clicked = clicked;
+}
+
+void InteractionsChart::handlePointMove(const QPoint &point)
+{
+ if (m_clicked) {
+ // Map the point clicked from the ChartView to the area occupied by the chart
+ QPoint mappedPoint = point;
+ mappedPoint.setX(point.x() - this->plotArea().x());
+ mappedPoint.setY(point.y() - this->plotArea().y());
+
+ // Get the x and y axis to be able to convert the mapped coordinate point to the chart scale
+ QAbstractAxis *axisx = axes(Qt::Horizontal).first();
+ QValueAxis *haxis = nullptr;
+ if (axisx->type() == QAbstractAxis::AxisTypeValue)
+ haxis = qobject_cast<QValueAxis *>(axisx);
+
+ QAbstractAxis *axisy = axes(Qt::Vertical).first();
+ QValueAxis *vaxis = nullptr;
+ if (axisy->type() == QAbstractAxis::AxisTypeValue)
+ vaxis = qobject_cast<QValueAxis *>(axisy);
+
+ if (haxis && vaxis) {
+ // Calculate the "unit" between points on the x y axis
+ double xUnit = this->plotArea().width() / haxis->max();
+ double yUnit = this->plotArea().height() / vaxis->max();
+
+ // Convert the mappedPoint to the actual chart scale
+ double x = mappedPoint.x() / xUnit;
+ double y = vaxis->max() - mappedPoint.y() / yUnit;
+
+ // Replace the old point with the new one
+ m_series->replace(m_movingPoint, QPointF(x, y));
+
+ // Update the m_movingPoint so we are able to do the replace also during mousemoveEvent
+ m_movingPoint.setX(x);
+ m_movingPoint.setY(y);
+ }
+ }
+}
+