From d318513c33318f01e9d875012a39d7931cf2023e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 7 Feb 2023 08:39:16 +0800 Subject: [PATCH] cabana: fixed wrong plot area after changed column count (#27228) old-commit-hash: 1a99fd36101fbe4cbe9853b1df5dfe6c59fea5c4 --- tools/cabana/chartswidget.cc | 33 +++++++++++++++++---------------- tools/cabana/chartswidget.h | 9 +++++---- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/tools/cabana/chartswidget.cc b/tools/cabana/chartswidget.cc index 845649dfc1..a271df9dd7 100644 --- a/tools/cabana/chartswidget.cc +++ b/tools/cabana/chartswidget.cc @@ -149,7 +149,6 @@ void ChartsWidget::updateState() { for (auto c : charts) { c->updatePlot(cur_sec, range.first, range.second); } - alignCharts(); charts_layout->parentWidget()->setUpdatesEnabled(true); } @@ -186,13 +185,14 @@ ChartView *ChartsWidget::createChart() { auto chart = new ChartView(this); chart->setFixedHeight(settings.chart_height); chart->setMinimumWidth(CHART_MIN_WIDTH); - chart->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + chart->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); chart->chart()->setTheme(use_dark_theme ? QChart::QChart::ChartThemeDark : QChart::ChartThemeLight); QObject::connect(chart, &ChartView::remove, [=]() { removeChart(chart); }); QObject::connect(chart, &ChartView::zoomIn, this, &ChartsWidget::zoomIn); QObject::connect(chart, &ChartView::zoomReset, this, &ChartsWidget::zoomReset); QObject::connect(chart, &ChartView::seriesRemoved, this, &ChartsWidget::seriesChanged); QObject::connect(chart, &ChartView::seriesAdded, this, &ChartsWidget::seriesChanged); + QObject::connect(chart, &ChartView::axisYLabelWidthChanged, this, &ChartsWidget::alignCharts); charts.push_back(chart); updateLayout(); return chart; @@ -231,14 +231,14 @@ void ChartsWidget::updateLayout() { columns_cb_action->setVisible(show_column_cb); n = std::min(column_count, n); - if (charts.size() != charts_layout->count() || n != charts_layout->columnCount()) { + if (charts.size() != charts_layout->count() || n != current_column_count) { + current_column_count = n; charts_layout->parentWidget()->setUpdatesEnabled(false); for (int i = 0; i < charts.size(); ++i) { charts_layout->addWidget(charts[charts.size() - i - 1], i / n, i % n); } QTimer::singleShot(0, [this]() { charts_layout->parentWidget()->setUpdatesEnabled(true); }); } - alignCharts(true); } void ChartsWidget::resizeEvent(QResizeEvent *event) { @@ -275,16 +275,14 @@ void ChartsWidget::removeAll() { emit seriesChanged(); } -void ChartsWidget::alignCharts(bool force) { +void ChartsWidget::alignCharts() { int plot_left = 0; for (auto c : charts) { plot_left = std::max(plot_left, c->y_label_width); } plot_left = std::max((plot_left / 10) * 10 + 10, 50); - if (std::exchange(align_to, plot_left) != align_to || force) { - for (auto c : charts) { - c->updatePlotArea(align_to); - } + for (auto c : charts) { + c->updatePlotArea(plot_left); } } @@ -459,7 +457,7 @@ void ChartView::manageSeries() { void ChartView::resizeEvent(QResizeEvent *event) { QChartView::resizeEvent(event); - updatePlotArea(); + updatePlotArea(align_to); int x = event->size().width() - close_btn_proxy->size().width() - 11; close_btn_proxy->setPos(x, 8); manage_btn_proxy->setPos(x - manage_btn_proxy->size().width() - 5, 8); @@ -467,12 +465,14 @@ void ChartView::resizeEvent(QResizeEvent *event) { } void ChartView::updatePlotArea(int left) { - align_to = left > 0 ? left : align_to; QRect r = rect(); - background->setRect(r); - chart()->legend()->setGeometry(QRect(r.left(), r.top(), r.width(), 45)); - chart()->setPlotArea(QRect(align_to, r.top() + 45, r.width() - align_to - 22, r.height() - 80)); - chart()->layout()->invalidate(); + if (align_to != left || r != background->rect()) { + align_to = left; + background->setRect(r); + chart()->legend()->setGeometry(QRect(r.left(), r.top(), r.width(), 45)); + chart()->setPlotArea(QRect(align_to, r.top() + 45, r.width() - align_to - 22, r.height() - 80)); + chart()->layout()->invalidate(); + } } void ChartView::updateTitle() { @@ -600,13 +600,14 @@ void ChartView::updateAxisY() { double delta = std::abs(max - min) < 1e-3 ? 1 : (max - min) * 0.05; auto [min_y, max_y, tick_count] = getNiceAxisNumbers(min - delta, max + delta, axis_y->tickCount()); - if (min_y != axis_y->min() || max_y != axis_y->max()) { + if (min_y != axis_y->min() || max_y != axis_y->max() || y_label_width == 0) { axis_y->setRange(min_y, max_y); axis_y->setTickCount(tick_count); QFontMetrics fm(axis_y->labelsFont()); int n = qMax(int(-qFloor(std::log10((max_y - min_y) / (tick_count - 1)))), 0) + 1; y_label_width = qMax(fm.width(QString::number(min_y, 'f', n)), fm.width(QString::number(max_y, 'f', n))) + 20; // left margin 20 + emit axisYLabelWidthChanged(y_label_width); } } diff --git a/tools/cabana/chartswidget.h b/tools/cabana/chartswidget.h index 77f04534a4..66ef98991f 100644 --- a/tools/cabana/chartswidget.h +++ b/tools/cabana/chartswidget.h @@ -33,7 +33,7 @@ public: void updateSeries(const Signal *sig = nullptr, const std::vector *events = nullptr, bool clear = true); void updatePlot(double cur, double min, double max); void setSeriesType(QAbstractSeries::SeriesType type); - void updatePlotArea(int left = 0); + void updatePlotArea(int left); struct SigItem { QString msg_id; @@ -51,6 +51,7 @@ signals: void zoomIn(double min, double max); void zoomReset(); void remove(); + void axisYLabelWidthChanged(int w); private slots: void msgRemoved(uint32_t address); @@ -78,7 +79,7 @@ private: QXYSeries *createSeries(QAbstractSeries::SeriesType type); void updateSeriesPoints(); - int y_label_width = 50; + int y_label_width = 0; int align_to = 0; QValueAxis *axis_x; QValueAxis *axis_y; @@ -115,7 +116,7 @@ signals: private: void resizeEvent(QResizeEvent *event) override; - void alignCharts(bool force = false); + void alignCharts(); void newChart(); ChartView * createChart(); void removeChart(ChartView *chart); @@ -148,7 +149,7 @@ private: QAction *columns_cb_action; QComboBox *columns_cb; int column_count = 1; - int align_to = 0; + int current_column_count = 0; }; class SeriesSelector : public QDialog {