7
7
#include < QFutureSynchronizer>
8
8
#include < QGraphicsLayout>
9
9
#include < QLineEdit>
10
+ #include < QMenu>
10
11
#include < QRubberBand>
11
12
#include < QToolBar>
12
13
#include < QToolButton>
@@ -178,6 +179,7 @@ void ChartsWidget::settingChanged() {
178
179
range_slider->setRange (1 , settings.max_cached_minutes * 60 );
179
180
for (auto c : charts) {
180
181
c->setFixedHeight (settings.chart_height );
182
+ c->setSeriesType (settings.chart_series_type == 0 ? QAbstractSeries::SeriesTypeLine : QAbstractSeries::SeriesTypeScatter);
181
183
}
182
184
}
183
185
@@ -297,6 +299,8 @@ bool ChartsWidget::eventFilter(QObject *obj, QEvent *event) {
297
299
// ChartView
298
300
299
301
ChartView::ChartView (QWidget *parent) : QChartView(nullptr , parent) {
302
+ series_type = settings.chart_series_type == 0 ? QAbstractSeries::SeriesTypeLine : QAbstractSeries::SeriesTypeScatter;
303
+
300
304
QChart *chart = new QChart ();
301
305
chart->setBackgroundRoundness (0 );
302
306
axis_x = new QValueAxis (this );
@@ -317,9 +321,20 @@ ChartView::ChartView(QWidget *parent) : QChartView(nullptr, parent) {
317
321
close_btn_proxy->setZValue (chart->zValue () + 11 );
318
322
319
323
QToolButton *manage_btn = new QToolButton ();
324
+ manage_btn->setToolButtonStyle (Qt::ToolButtonIconOnly);
320
325
manage_btn->setIcon (utils::icon (" gear" ));
321
326
manage_btn->setAutoRaise (true );
322
- manage_btn->setToolTip (tr (" Manage series" ));
327
+ QMenu *menu = new QMenu (this );
328
+ line_series_action = menu->addAction (tr (" Line" ), [this ]() { setSeriesType (QAbstractSeries::SeriesTypeLine); });
329
+ line_series_action->setCheckable (true );
330
+ line_series_action->setChecked (series_type == QAbstractSeries::SeriesTypeLine);
331
+ scatter_series_action = menu->addAction (tr (" Scatter" ), [this ]() { setSeriesType (QAbstractSeries::SeriesTypeScatter); });
332
+ scatter_series_action->setCheckable (true );
333
+ scatter_series_action->setChecked (series_type == QAbstractSeries::SeriesTypeScatter);
334
+ menu->addSeparator ();
335
+ menu->addAction (tr (" Manage series" ), this , &ChartView::manageSeries);
336
+ manage_btn->setMenu (menu);
337
+ manage_btn->setPopupMode (QToolButton::InstantPopup);
323
338
manage_btn_proxy = new QGraphicsProxyWidget (chart);
324
339
manage_btn_proxy->setWidget (manage_btn);
325
340
manage_btn_proxy->setZValue (chart->zValue () + 11 );
@@ -334,7 +349,6 @@ ChartView::ChartView(QWidget *parent) : QChartView(nullptr, parent) {
334
349
QObject::connect (dbc (), &DBCManager::msgRemoved, this , &ChartView::msgRemoved);
335
350
QObject::connect (dbc (), &DBCManager::msgUpdated, this , &ChartView::msgUpdated);
336
351
QObject::connect (remove_btn, &QToolButton::clicked, this , &ChartView::remove );
337
- QObject::connect (manage_btn, &QToolButton::clicked, this , &ChartView::manageSeries);
338
352
}
339
353
340
354
qreal ChartView::getYAsixLabelWidth () const {
@@ -354,8 +368,7 @@ void ChartView::setPlotAreaLeftPosition(int pos) {
354
368
}
355
369
356
370
void ChartView::addSeries (const QString &msg_id, const Signal *sig) {
357
- QLineSeries *series = new QLineSeries (this );
358
-
371
+ QXYSeries *series = createSeries (series_type);
359
372
chart ()->addSeries (series);
360
373
series->attachAxis (axis_x);
361
374
series->attachAxis (axis_y);
@@ -478,22 +491,26 @@ void ChartView::updatePlot(double cur, double min, double max) {
478
491
int num_points = std::max<int >(end - begin, 1 );
479
492
int pixels_per_point = width () / num_points;
480
493
481
- s.series ->setPointsVisible (pixels_per_point > 20 );
494
+ if (series_type == QAbstractSeries::SeriesTypeScatter) {
495
+ ((QScatterSeries *)s.series )->setMarkerSize (std::clamp (pixels_per_point / 3 , 1 , 8 ));
496
+ } else {
497
+ s.series ->setPointsVisible (pixels_per_point > 20 );
482
498
483
- // TODO: On MacOS QChartWidget doesn't work with the OpenGL settings that CameraWidget needs.
499
+ // TODO: On MacOS QChartWidget doesn't work with the OpenGL settings that CameraWidget needs.
484
500
#ifndef __APPLE
485
- // OpenGL mode lacks certain features (such as showing points), only use when drawing many points
486
- bool use_opengl = pixels_per_point < 1 ;
487
- s.series ->setUseOpenGL (use_opengl);
501
+ // OpenGL mode lacks certain features (such as showing points), only use when drawing many points
502
+ bool use_opengl = pixels_per_point < 1 ;
503
+ s.series ->setUseOpenGL (use_opengl);
488
504
489
- // Qt doesn't properly apply device pixel ratio in OpenGL mode
490
- QApplication* application = static_cast <QApplication *>(QApplication::instance ());
491
- float scale = use_opengl ? application->devicePixelRatio () : 1.0 ;
505
+ // Qt doesn't properly apply device pixel ratio in OpenGL mode
506
+ QApplication * application = static_cast <QApplication *>(QApplication::instance ());
507
+ float scale = use_opengl ? application->devicePixelRatio () : 1.0 ;
492
508
493
- QPen pen = s.series ->pen ();
494
- pen.setWidth (2.0 * scale);
495
- s.series ->setPen (pen);
509
+ QPen pen = s.series ->pen ();
510
+ pen.setWidth (2.0 * scale);
511
+ s.series ->setPen (pen);
496
512
#endif
513
+ }
497
514
}
498
515
}
499
516
@@ -733,6 +750,43 @@ void ChartView::drawForeground(QPainter *painter, const QRectF &rect) {
733
750
}
734
751
}
735
752
753
+ QXYSeries *ChartView::createSeries (QAbstractSeries::SeriesType type) {
754
+ QXYSeries *series = nullptr ;
755
+ if (type == QAbstractSeries::SeriesTypeLine) {
756
+ series = new QLineSeries (this );
757
+ } else {
758
+ series = new QScatterSeries (this );
759
+ }
760
+ // TODO: Due to a bug in CameraWidget the camera frames
761
+ // are drawn instead of the graphs on MacOS. Re-enable OpenGL when fixed
762
+ #ifndef __APPLE__
763
+ series->setUseOpenGL (true );
764
+ #endif
765
+ return series;
766
+ }
767
+
768
+ void ChartView::setSeriesType (QAbstractSeries::SeriesType type) {
769
+ if (type != series_type) {
770
+ series_type = type;
771
+ line_series_action->setChecked (type == QAbstractSeries::SeriesTypeLine);
772
+ scatter_series_action->setChecked (type == QAbstractSeries::SeriesTypeScatter);
773
+
774
+ for (auto &s : sigs) {
775
+ chart ()->removeSeries (s.series );
776
+ s.series ->deleteLater ();
777
+ }
778
+ for (auto &s : sigs) {
779
+ auto series = createSeries (series_type);
780
+ chart ()->addSeries (series);
781
+ series->attachAxis (axis_x);
782
+ series->attachAxis (axis_y);
783
+ series->replace (s.vals );
784
+ s.series = series;
785
+ }
786
+ updateTitle ();
787
+ }
788
+ }
789
+
736
790
// SeriesSelector
737
791
738
792
SeriesSelector::SeriesSelector (QWidget *parent) {
0 commit comments