From e46c9899c17627f531a5e6f51c4cd40abd2f2b6c Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 14 Apr 2023 10:51:43 +0800 Subject: [PATCH] cabana: fix tooltip will not show if chart is partial visible. (#27897) * use horizontalSpacing * fix chart toopl tip old-commit-hash: d425f9d1e61a29090e088ff158ff0ac792287fda --- tools/cabana/chart/chart.cc | 13 ++++++++++--- tools/cabana/chart/chartswidget.cc | 14 +++++++------- tools/cabana/chart/chartswidget.h | 1 + tools/cabana/chart/tiplabel.cc | 14 +++++++++----- tools/cabana/chart/tiplabel.h | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index ee1cdab6d..49ee3c5bd 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -512,6 +512,13 @@ void ChartView::mouseMoveEvent(QMouseEvent *ev) { } void ChartView::showTip(double sec) { + QRect tip_area(0, chart()->plotArea().top(), rect().width(), chart()->plotArea().height()); + QRect visible_rect = charts_widget->chartVisibleRect(this).intersected(tip_area); + if (visible_rect.isEmpty()) { + tip_label.hide(); + return; + } + tooltip_x = chart()->mapToPosition({sec, 0}).x(); qreal x = tooltip_x; QStringList text_list(QString::number(chart()->mapToValue({x, 0}).x(), 'f', 3)); @@ -532,9 +539,9 @@ void ChartView::showTip(double sec) { .arg(s.series->color().name(), name, value, min, max); } } - QPointF tooltip_pt(x, chart()->plotArea().top()); - int plot_right = mapToGlobal(chart()->plotArea().topRight().toPoint()).x(); - tip_label.showText(mapToGlobal(tooltip_pt.toPoint()), "

" + text_list.join("
") + "

", plot_right); + QPoint pt(x, chart()->plotArea().top()); + QString text = "

" % text_list.join("
") % "

"; + tip_label.showText(pt, text, this, visible_rect); viewport()->update(); } diff --git a/tools/cabana/chart/chartswidget.cc b/tools/cabana/chart/chartswidget.cc index 2700f6519..9d2a9b547 100644 --- a/tools/cabana/chart/chartswidget.cc +++ b/tools/cabana/chart/chartswidget.cc @@ -161,14 +161,14 @@ void ChartsWidget::zoomReset() { zoom_undo_stack->clear(); } -void ChartsWidget::showValueTip(double sec) { +QRect ChartsWidget::chartVisibleRect(ChartView *chart) { const QRect visible_rect(-charts_container->pos(), charts_scroll->viewport()->size()); + return chart->rect().intersected(QRect(chart->mapFrom(charts_container, visible_rect.topLeft()), visible_rect.size())); +} + +void ChartsWidget::showValueTip(double sec) { for (auto c : currentCharts()) { - if (sec >= 0 && visible_rect.contains(QRect(c->mapTo(charts_container, QPoint(0, 0)), c->size()))) { - c->showTip(sec); - } else { - c->hideTip(); - } + sec >= 0 ? c->showTip(sec) : c->hideTip(); } } @@ -291,7 +291,7 @@ void ChartsWidget::updateLayout(bool force) { auto charts_layout = charts_container->charts_layout; int n = MAX_COLUMN_COUNT; for (; n > 1; --n) { - if ((n * CHART_MIN_WIDTH + (n - 1) * charts_layout->spacing()) < charts_layout->geometry().width()) break; + if ((n * CHART_MIN_WIDTH + (n - 1) * charts_layout->horizontalSpacing()) < charts_layout->geometry().width()) break; } bool show_column_cb = n > 1; diff --git a/tools/cabana/chart/chartswidget.h b/tools/cabana/chart/chartswidget.h index 5fe227b15..956debcc9 100644 --- a/tools/cabana/chart/chartswidget.h +++ b/tools/cabana/chart/chartswidget.h @@ -59,6 +59,7 @@ private: ChartView *createChart(); void removeChart(ChartView *chart); void splitChart(ChartView *chart); + QRect chartVisibleRect(ChartView *chart); void eventsMerged(); void updateState(); void zoomReset(); diff --git a/tools/cabana/chart/tiplabel.cc b/tools/cabana/chart/tiplabel.cc index db686e44f..3ee5f0097 100644 --- a/tools/cabana/chart/tiplabel.cc +++ b/tools/cabana/chart/tiplabel.cc @@ -22,18 +22,22 @@ TipLabel::TipLabel(QWidget *parent) : QLabel(parent, Qt::ToolTip | Qt::Frameless setVisible(false); } -void TipLabel::showText(const QPoint &pt, const QString &text, int right_edge) { +void TipLabel::showText(const QPoint &pt, const QString &text, QWidget *w, const QRect &rect) { setText(text); if (!text.isEmpty()) { QSize extra(1, 1); resize(sizeHint() + extra); - QPoint tip_pos(pt.x() + 12, pt.y()); - if (tip_pos.x() + size().width() >= right_edge) { + QPoint tip_pos(pt.x() + 12, rect.top() + 2); + if (tip_pos.x() + size().width() >= rect.right()) { tip_pos.rx() = pt.x() - size().width() - 12; } - move(tip_pos); + if (rect.contains({tip_pos, size()})) { + move(w->mapToGlobal(tip_pos)); + setVisible(true); + return; + } } - setVisible(!text.isEmpty()); + setVisible(false); } void TipLabel::paintEvent(QPaintEvent *ev) { diff --git a/tools/cabana/chart/tiplabel.h b/tools/cabana/chart/tiplabel.h index 568aa3d72..ac6e09e97 100644 --- a/tools/cabana/chart/tiplabel.h +++ b/tools/cabana/chart/tiplabel.h @@ -5,6 +5,6 @@ class TipLabel : public QLabel { public: TipLabel(QWidget *parent = nullptr); - void showText(const QPoint &pt, const QString &sec, int right_edge); + void showText(const QPoint &pt, const QString &sec, QWidget *w, const QRect &rect); void paintEvent(QPaintEvent *ev) override; };