From e80f2502715829872c5c79a2f6be746849f399f3 Mon Sep 17 00:00:00 2001 From: deanlee Date: Fri, 3 Feb 2023 14:41:47 +0800 Subject: [PATCH 1/2] update pointers after create series --- tools/cabana/chartswidget.cc | 52 ++++++++++++++++++++---------------- tools/cabana/chartswidget.h | 1 + 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/tools/cabana/chartswidget.cc b/tools/cabana/chartswidget.cc index e49d28db445568..8886c7e7f2a77e 100644 --- a/tools/cabana/chartswidget.cc +++ b/tools/cabana/chartswidget.cc @@ -376,6 +376,7 @@ void ChartView::addSeries(const QString &msg_id, const Signal *sig) { sigs.push_back({.msg_id = msg_id, .address = address, .source = source, .sig = sig, .series = series}); updateTitle(); updateSeries(sig); + updateSeriesPoints(); emit seriesAdded(msg_id, sig); } @@ -482,39 +483,42 @@ void ChartView::updatePlot(double cur, double min, double max) { if (min != axis_x->min() || max != axis_x->max()) { axis_x->setRange(min, max); updateAxisY(); + updateSeriesPoints(); + } - // Show points when zoomed in enough - for (auto &s : sigs) { - auto begin = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; }); - auto end = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->max(), [](auto &p, double x) { return p.x() < x; }); + scene()->invalidate({}, QGraphicsScene::ForegroundLayer); +} - int num_points = std::max(end - begin, 1); - int pixels_per_point = width() / num_points; +void ChartView::updateSeriesPoints() { + // Show points when zoomed in enough + for (auto &s : sigs) { + auto begin = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; }); + auto end = std::lower_bound(s.vals.begin(), s.vals.end(), axis_x->max(), [](auto &p, double x) { return p.x() < x; }); - if (series_type == QAbstractSeries::SeriesTypeScatter) { - ((QScatterSeries *)s.series)->setMarkerSize(std::clamp(pixels_per_point / 3, 1, 8)); - } else { - s.series->setPointsVisible(pixels_per_point > 20); + int num_points = std::max(end - begin, 1); + int pixels_per_point = width() / num_points; - // TODO: On MacOS QChartWidget doesn't work with the OpenGL settings that CameraWidget needs. + if (series_type == QAbstractSeries::SeriesTypeScatter) { + ((QScatterSeries *)s.series)->setMarkerSize(std::clamp(pixels_per_point / 3, 1, 8)); + } else { + s.series->setPointsVisible(pixels_per_point > 20); + + // TODO: On MacOS QChartWidget doesn't work with the OpenGL settings that CameraWidget needs. #ifndef __APPLE - // OpenGL mode lacks certain features (such as showing points), only use when drawing many points - bool use_opengl = pixels_per_point < 1; - s.series->setUseOpenGL(use_opengl); + // OpenGL mode lacks certain features (such as showing points), only use when drawing many points + bool use_opengl = pixels_per_point < 1; + s.series->setUseOpenGL(use_opengl); - // Qt doesn't properly apply device pixel ratio in OpenGL mode - QApplication *application = static_cast(QApplication::instance()); - float scale = use_opengl ? application->devicePixelRatio() : 1.0; + // Qt doesn't properly apply device pixel ratio in OpenGL mode + QApplication *application = static_cast(QApplication::instance()); + float scale = use_opengl ? application->devicePixelRatio() : 1.0; - QPen pen = s.series->pen(); - pen.setWidth(2.0 * scale); - s.series->setPen(pen); + QPen pen = s.series->pen(); + pen.setWidth(2.0 * scale); + s.series->setPen(pen); #endif - } } } - - scene()->invalidate({}, QGraphicsScene::ForegroundLayer); } void ChartView::updateSeries(const Signal *sig, const std::vector *events, bool clear) { @@ -762,6 +766,7 @@ QXYSeries *ChartView::createSeries(QAbstractSeries::SeriesType type) { #ifndef __APPLE__ series->setUseOpenGL(true); #endif + // updateSeriesPoints(); return series; } @@ -783,6 +788,7 @@ void ChartView::setSeriesType(QAbstractSeries::SeriesType type) { series->replace(s.vals); s.series = series; } + updateSeriesPoints(); updateTitle(); } } diff --git a/tools/cabana/chartswidget.h b/tools/cabana/chartswidget.h index 9b2afd45a99808..b496540f5e450e 100644 --- a/tools/cabana/chartswidget.h +++ b/tools/cabana/chartswidget.h @@ -73,6 +73,7 @@ private slots: void applyNiceNumbers(qreal min, qreal max); qreal niceNumber(qreal x, bool ceiling); QXYSeries *createSeries(QAbstractSeries::SeriesType type); + void updateSeriesPoints(); QValueAxis *axis_x; QValueAxis *axis_y; From ec5f3e01fece40aed581c8c29b0775cf9edd9636 Mon Sep 17 00:00:00 2001 From: deanlee Date: Sat, 4 Feb 2023 04:51:16 +0800 Subject: [PATCH 2/2] cleanup --- tools/cabana/chartswidget.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/cabana/chartswidget.cc b/tools/cabana/chartswidget.cc index 8cbccccba0295b..54cacf56cd6314 100644 --- a/tools/cabana/chartswidget.cc +++ b/tools/cabana/chartswidget.cc @@ -766,7 +766,6 @@ QXYSeries *ChartView::createSeries(QAbstractSeries::SeriesType type) { #ifndef __APPLE__ series->setUseOpenGL(true); #endif - // updateSeriesPoints(); return series; }