diff --git a/tools/cabana/chartswidget.cc b/tools/cabana/chartswidget.cc index c2ef7c17c1..a221cbe445 100644 --- a/tools/cabana/chartswidget.cc +++ b/tools/cabana/chartswidget.cc @@ -311,12 +311,14 @@ void ChartsWidget::removeChart(ChartView *chart) { } void ChartsWidget::removeAll() { - for (auto c : charts) { - c->deleteLater(); + if (!charts.isEmpty()) { + for (auto c : charts) { + c->deleteLater(); + } + charts.clear(); + updateToolBar(); + emit seriesChanged(); } - charts.clear(); - updateToolBar(); - emit seriesChanged(); } void ChartsWidget::alignCharts() { @@ -390,10 +392,8 @@ ChartView::ChartView(QWidget *parent) : tip_label(this), QChartView(nullptr, par setRubberBand(can->liveStreaming() ? QChartView::NoRubberBand : QChartView::HorizontalRubberBand); setMouseTracking(true); - QObject::connect(axis_x, &QValueAxis::rangeChanged, [this]() { resetChartCache(); }); QObject::connect(axis_y, &QValueAxis::rangeChanged, [this]() { resetChartCache(); }); QObject::connect(axis_y, &QAbstractAxis::titleTextChanged, [this]() { resetChartCache(); }); - QObject::connect(chart, &QChart::plotAreaChanged, [this]() { resetChartCache(); }); QObject::connect(dbc(), &DBCManager::signalRemoved, this, &ChartView::signalRemoved); QObject::connect(dbc(), &DBCManager::signalUpdated, this, &ChartView::signalUpdated); @@ -529,6 +529,7 @@ void ChartView::updatePlotArea(int left_pos, bool force) { int adjust_top = chart()->legend()->geometry().height() + style()->pixelMetric(QStyle::PM_LayoutTopMargin); chart()->setPlotArea(rect().adjusted(align_to + left, adjust_top + top, -x_label_size.width() / 2 - right, -x_label_size.height() - bottom)); chart()->layout()->invalidate(); + resetChartCache(); } } @@ -549,6 +550,11 @@ void ChartView::updatePlot(double cur, double min, double max) { axis_x->setRange(min, max); updateAxisY(); updateSeriesPoints(); + // update tooltip + if (tooltip_x >= 0) { + showTip(chart()->mapToValue({tooltip_x, 0}).x()); + } + resetChartCache(); } viewport()->update(); } @@ -799,7 +805,8 @@ void ChartView::mouseMoveEvent(QMouseEvent *ev) { } void ChartView::showTip(double sec) { - qreal x = chart()->mapToPosition({sec, 0}).x(); + tooltip_x = chart()->mapToPosition({sec, 0}).x(); + qreal x = tooltip_x; QStringList text_list(QString::number(chart()->mapToValue({x, 0}).x(), 'f', 3)); for (auto &s : sigs) { if (s.series->isVisible()) { @@ -808,11 +815,12 @@ void ChartView::showTip(double sec) { auto it = std::lower_bound(s.vals.rbegin(), s.vals.rend(), sec, [](auto &p, double x) { return p.x() > x; }); if (it != s.vals.rend() && it->x() >= axis_x->min()) { value = QString::number(it->y()); - s.track_pt = chart()->mapToPosition(*it); - x = std::max(x, s.track_pt.x()); + s.track_pt = *it; + x = std::max(x, chart()->mapToPosition(*it).x()); } - text_list << QString("%2: %3 (%4 - %5)") - .arg(s.series->color().name(), s.sig->name, value, QString::number(s.min), QString::number(s.max)); + QString name = sigs.size() > 1 ? s.sig->name + ": " : ""; + text_list << QString("%2%3 (%4 - %5)") + .arg(s.series->color().name(), name, value, QString::number(s.min), QString::number(s.max)); } } QPointF tooltip_pt(x, chart()->plotArea().top()); @@ -823,6 +831,7 @@ void ChartView::showTip(double sec) { void ChartView::hideTip() { clearTrackPoints(); + tooltip_x = -1; tip_label.hide(); viewport()->update(); } @@ -897,8 +906,9 @@ void ChartView::drawForeground(QPainter *painter, const QRectF &rect) { for (auto &s : sigs) { if (!s.track_pt.isNull() && s.series->isVisible()) { painter->setBrush(s.series->color().darker(125)); - painter->drawEllipse(s.track_pt, 5.5, 5.5); - track_line_x = std::max(track_line_x, s.track_pt.x()); + QPointF pos = chart()->mapToPosition(s.track_pt); + painter->drawEllipse(pos, 5.5, 5.5); + track_line_x = std::max(track_line_x, pos.x()); } } if (track_line_x > 0) { diff --git a/tools/cabana/chartswidget.h b/tools/cabana/chartswidget.h index a88b3185af..c3af11eb5d 100644 --- a/tools/cabana/chartswidget.h +++ b/tools/cabana/chartswidget.h @@ -113,6 +113,7 @@ private: bool is_scrubbing = false; bool resume_after_scrub = false; QPixmap chart_pixmap; + double tooltip_x = -1; friend class ChartsWidget; };