cabana: improve precision of timeline (#29872)

old-commit-hash: d9f107a2c9
test-msgs
Dean Lee 2 years ago committed by GitHub
parent 6c389dee7e
commit 916f083499
  1. 13
      tools/cabana/chart/chart.cc
  2. 1
      tools/cabana/chart/chart.h

@ -25,7 +25,8 @@
const int AXIS_X_TOP_MARGIN = 4; const int AXIS_X_TOP_MARGIN = 4;
static inline bool xLessThan(const QPointF &p, float x) { return p.x() < x; } static inline bool xLessThan(const QPointF &p, float x) { return p.x() < x; }
ChartView::ChartView(const std::pair<double, double> &x_range, ChartsWidget *parent) : charts_widget(parent), tip_label(this), QChartView(nullptr, parent) { ChartView::ChartView(const std::pair<double, double> &x_range, ChartsWidget *parent)
: charts_widget(parent), tip_label(this), QChartView(nullptr, parent) {
series_type = (SeriesType)settings.chart_series_type; series_type = (SeriesType)settings.chart_series_type;
QChart *chart = new QChart(); QChart *chart = new QChart();
chart->setBackgroundVisible(false); chart->setBackgroundVisible(false);
@ -668,6 +669,7 @@ void ChartView::drawBackground(QPainter *painter, const QRectF &rect) {
void ChartView::drawForeground(QPainter *painter, const QRectF &rect) { void ChartView::drawForeground(QPainter *painter, const QRectF &rect) {
drawTimeline(painter); drawTimeline(painter);
drawSignalValue(painter);
// draw track points // draw track points
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
qreal track_line_x = -1; qreal track_line_x = -1;
@ -718,23 +720,24 @@ void ChartView::drawRubberBandTimeRange(QPainter *painter) {
void ChartView::drawTimeline(QPainter *painter) { void ChartView::drawTimeline(QPainter *painter) {
const auto plot_area = chart()->plotArea(); const auto plot_area = chart()->plotArea();
// draw line // draw vertical time line
qreal x = std::clamp(chart()->mapToPosition(QPointF{cur_sec, 0}).x(), plot_area.left(), plot_area.right()); qreal x = std::clamp(chart()->mapToPosition(QPointF{cur_sec, 0}).x(), plot_area.left(), plot_area.right());
painter->setPen(QPen(chart()->titleBrush().color(), 2)); painter->setPen(QPen(chart()->titleBrush().color(), 2));
painter->drawLine(QPointF{x, plot_area.top()}, QPointF{x, plot_area.bottom() + 1}); painter->drawLine(QPointF{x, plot_area.top()}, QPointF{x, plot_area.bottom() + 1});
// draw current time // draw current time under the axis-x
QString time_str = QString::number(cur_sec, 'f', 2); QString time_str = QString::number(cur_sec, 'f', 2);
QSize time_str_size = QFontMetrics(axis_x->labelsFont()).size(Qt::TextSingleLine, time_str) + QSize(8, 2); QSize time_str_size = QFontMetrics(axis_x->labelsFont()).size(Qt::TextSingleLine, time_str) + QSize(8, 2);
QRect time_str_rect(QPoint(x - time_str_size.width() / 2, plot_area.bottom() + AXIS_X_TOP_MARGIN), time_str_size); QRectF time_str_rect(QPointF(x - time_str_size.width() / 2.0, plot_area.bottom() + AXIS_X_TOP_MARGIN), time_str_size);
QPainterPath path; QPainterPath path;
path.addRoundedRect(time_str_rect, 3, 3); path.addRoundedRect(time_str_rect, 3, 3);
painter->fillPath(path, settings.theme == DARK_THEME ? Qt::darkGray : Qt::gray); painter->fillPath(path, settings.theme == DARK_THEME ? Qt::darkGray : Qt::gray);
painter->setPen(palette().color(QPalette::BrightText)); painter->setPen(palette().color(QPalette::BrightText));
painter->setFont(axis_x->labelsFont()); painter->setFont(axis_x->labelsFont());
painter->drawText(time_str_rect, Qt::AlignCenter, time_str); painter->drawText(time_str_rect, Qt::AlignCenter, time_str);
}
// draw signal value void ChartView::drawSignalValue(QPainter *painter) {
auto item_group = qgraphicsitem_cast<QGraphicsItemGroup *>(chart()->legend()->childItems()[0]); auto item_group = qgraphicsitem_cast<QGraphicsItemGroup *>(chart()->legend()->childItems()[0]);
assert(item_group != nullptr); assert(item_group != nullptr);
auto legend_markers = item_group->childItems(); auto legend_markers = item_group->childItems();

@ -83,6 +83,7 @@ private:
void drawForeground(QPainter *painter, const QRectF &rect) override; void drawForeground(QPainter *painter, const QRectF &rect) override;
void drawBackground(QPainter *painter, const QRectF &rect) override; void drawBackground(QPainter *painter, const QRectF &rect) override;
void drawDropIndicator(bool draw) { if (std::exchange(can_drop, draw) != can_drop) viewport()->update(); } void drawDropIndicator(bool draw) { if (std::exchange(can_drop, draw) != can_drop) viewport()->update(); }
void drawSignalValue(QPainter *painter);
void drawTimeline(QPainter *painter); void drawTimeline(QPainter *painter);
void drawRubberBandTimeRange(QPainter *painter); void drawRubberBandTimeRange(QPainter *painter);
std::tuple<double, double, int> getNiceAxisNumbers(qreal min, qreal max, int tick_count); std::tuple<double, double, int> getNiceAxisNumbers(qreal min, qreal max, int tick_count);

Loading…
Cancel
Save