  #include "tools/cabana/streams/abstractstream.h"
  
  #include <QtConcurrent>
  
  AbstractStream *can = nullptr;
  
  AbstractStream::AbstractStream(QObject *parent, bool is_live_streaming) : is_live_streaming(is_live_streaming), QObject(parent) {
 
</s> remove     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);
 </s> add     if (chart()->plotArea().contains(ev->pos())) {
      double t = chart()->mapToValue(ev->pos()).x();
      // Prevent seeking past the end of the route
      t = std::clamp(t, 0., can->totalSeconds());
      can->seekTo(t);
    } </s> remove   emit updated();
  emit msgsReceived(&can_msgs);
 </s> add   QTimer::singleShot(0, [this]() {
    emit updated();
    emit msgsReceived(&can_msgs);
  });
#include <QTimer>
  #include "tools/cabana/streams/abstractstream.h"
#include <QTimer>
  #include <QtConcurrent>
  
  AbstractStream *can = nullptr;
  
  AbstractStream::AbstractStream(QObject *parent, bool is_live_streaming) : is_live_streaming(is_live_streaming), QObject(parent) {
keep replace keep keep keep keep keep
 cabana: fix hang on scrubbing in zommed chart (#27568) 
tools/cabana/streams/abstractstream.cc