// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "JFJochSimpleChartView.h" #include #include #include #include JFJochSimpleChartView::JFJochSimpleChartView(QWidget *parent) : QChartView(new QChart(), parent) { chart()->legend()->hide(); setFixedHeight(300); setRenderHint(QPainter::Antialiasing); //setRubberBand(QChartView::RubberBand::HorizontalRubberBand); } void JFJochSimpleChartView::UpdateData(const std::vector &in_x, const std::vector &in_y, QString legend_x, QString legend_y) { x = in_x; y = in_y; chart()->removeAllSeries(); // Remove all axes to avoid duplicates for (auto ax: chart()->axes()) chart()->removeAxis(ax); if (x.empty() || x.size() != y.size()) return; auto *series = new QLineSeries(this); for (size_t i = 0; i < x.size(); ++i) series->append(x[i], y[i]); chart()->addSeries(series); auto *axY = new QValueAxis(); axY->setTitleText(legend_y); chart()->addAxis(axY, Qt::AlignLeft); series->attachAxis(axY); // Build X range auto [minXIt, maxXIt] = std::minmax_element(x.begin(), x.end()); const double xmin = *minXIt, xmax = *maxXIt; // Normal value axis at bottom auto *axX = new QValueAxis(); axX->setRange(xmin, xmax); axX->setTitleText(legend_x); chart()->addAxis(axX, Qt::AlignBottom); series->attachAxis(axX); } void JFJochSimpleChartView::ClearData() { chart()->removeAllSeries(); } void JFJochSimpleChartView::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); QAction *copyXY = menu.addAction("Copy (x y) points"); copyXY->setEnabled(!x.empty() && x.size() == y.size()); QAction *chosen = menu.exec(event->globalPos()); if (chosen == copyXY) { QString out; out.reserve(static_cast(x.size() * 16)); // rough prealloc for (size_t i = 0; i < x.size() && i < y.size(); ++i) { out.append(QString::number(x[i], 'g', 10)); out.append(' '); out.append(QString::number(y[i], 'g', 10)); if (i + 1 < x.size()) out.append('\n'); } QClipboard *cb = QApplication::clipboard(); cb->setText(out); } }