diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2023-06-09 10:04:14 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-06-09 09:21:42 +0000 |
commit | 420bc17f4a6d02adac70d23e3c9e31ce3dea5fab (patch) | |
tree | 79db6e1faac034b2a602e943a9bb185b302c3b88 /examples/charts/chartsgallery/interactionschart.cpp | |
parent | 92fdde892b08c5f7e18c065e9f78f24d79ec8554 (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.cpp | 77 |
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); + } + } +} + |