cabana: scrub by shift dragging on graph (#27545)

* cabana: scrub by shift dragging on graph

* not while live streaming
old-commit-hash: b79f4594c4
beeps
Willem Melching 2 years ago committed by GitHub
parent 2ca3feab16
commit ed75ea1836
  1. 26
      tools/cabana/chartswidget.cc
  2. 2
      tools/cabana/chartswidget.h

@ -668,6 +668,16 @@ void ChartView::mousePressEvent(QMouseEvent *event) {
if (dropAction == Qt::MoveAction) { if (dropAction == Qt::MoveAction) {
return; return;
} }
} else if (event->button() == Qt::LeftButton && QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) {
if (!can->liveStreaming()) {
// Save current playback state when scrubbing
resume_after_scrub = !can->isPaused();
if (resume_after_scrub) {
can->pause(true);
}
is_scrubbing = true;
}
} else { } else {
QChartView::mousePressEvent(event); QChartView::mousePressEvent(event);
} }
@ -701,9 +711,25 @@ void ChartView::mouseReleaseEvent(QMouseEvent *event) {
} else { } else {
QGraphicsView::mouseReleaseEvent(event); QGraphicsView::mouseReleaseEvent(event);
} }
// Resume playback if we were scrubbing
is_scrubbing = false;
if (resume_after_scrub) {
can->pause(false);
resume_after_scrub = false;
}
} }
void ChartView::mouseMoveEvent(QMouseEvent *ev) { void ChartView::mouseMoveEvent(QMouseEvent *ev) {
// Scrubbing
if (is_scrubbing && QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier)) {
double t = chart()->mapToValue({(double)ev->x(), (double)ev->y()}).x();
// Prevent seeking past the end of the route
t = std::clamp(t, 0., can->totalSeconds());
can->seekTo(t);
return;
}
auto rubber = findChild<QRubberBand *>(); auto rubber = findChild<QRubberBand *>();
bool is_zooming = rubber && rubber->isVisible(); bool is_zooming = rubber && rubber->isVisible();
const auto plot_area = chart()->plotArea(); const auto plot_area = chart()->plotArea();

@ -97,6 +97,8 @@ private:
double cur_sec = 0; double cur_sec = 0;
const QString mime_type = "application/x-cabanachartview"; const QString mime_type = "application/x-cabanachartview";
SeriesType series_type = SeriesType::Line; SeriesType series_type = SeriesType::Line;
bool is_scrubbing = false;
bool resume_after_scrub = false;
friend class ChartsWidget; friend class ChartsWidget;
}; };

Loading…
Cancel
Save