    QObject::connect(remove_btn, &QToolButton::clicked, this, &DetailWidget::removeMsg);
    QObject::connect(binary_view, &BinaryView::resizeSignal, signal_view->model, &SignalModel::resizeSignal);
    QObject::connect(binary_view, &BinaryView::addSignal, signal_view->model, &SignalModel::addSignal);
    QObject::connect(binary_view, &BinaryView::signalHovered, signal_view, &SignalView::signalHovered);
    QObject::connect(binary_view, &BinaryView::signalClicked, [this](const Signal *s) { signal_view->selectSignal(s, true); });
    QObject::connect(binary_view, &BinaryView::editSignal, signal_view->model, &SignalModel::saveSignal);
    QObject::connect(binary_view, &BinaryView::removeSignal, signal_view->model, &SignalModel::removeSignal);
    QObject::connect(binary_view, &BinaryView::showChart, charts, &ChartsWidget::showChart);
    QObject::connect(signal_view, &SignalView::showChart, charts, &ChartsWidget::showChart);
    QObject::connect(signal_view, &SignalView::highlight, binary_view, &BinaryView::highlight);
 
</s> remove void SignalModel::insertItem(SignalModel::Item *parent_item, int pos, const Signal *sig) {
 </s> add void SignalModel::insertItem(SignalModel::Item *parent_item, int pos, const cabana::Signal *sig) { </s> remove   auto dbc_names = dbc()->allDBCNames();
 </s> add   auto dbc_names = allDBCNames(); </s> remove   if (auto m = const_cast<Msg *>(msg(id))) {
 </s> add   if (auto m = const_cast<cabana::Msg *>(msg(id))) { </s> remove struct MessageId {
  uint8_t source;
  uint32_t address;

  QString toString() const {
    return QString("%1:%2").arg(source).arg(address, 1, 16);
  }

  bool operator==(const MessageId &other) const {
    return source == other.source && address == other.address;
  }

  bool operator!=(const MessageId &other) const {
    return !(*this == other);
  }

  bool operator<(const MessageId &other) const {
    return std::pair{source, address} < std::pair{other.source, other.address};
  }

  bool operator>(const MessageId &other) const {
    return std::pair{source, address} > std::pair{other.source, other.address};
  }
};

uint qHash(const MessageId &item);
Q_DECLARE_METATYPE(MessageId);

namespace dbcmanager {

typedef QList<std::pair<QString, QString>> ValueDescription;

struct Signal {
  QString name;
  int start_bit, msb, lsb, size;
  bool is_signed;
  double factor, offset;
  bool is_little_endian;
  QString min, max, unit;
  QString comment;
  ValueDescription val_desc;
};

struct Msg {
  QString name;
  uint32_t size;

  std::vector<const Signal*> getSignals() const;
  const Signal *sig(const QString &sig_name) const {
    auto it = std::find_if(sigs.begin(), sigs.end(), [&](auto &s) { return s.name == sig_name; });
    return it != sigs.end() ? &(*it) : nullptr;
  }

private:
  QList<Signal> sigs;
  friend class DBCManager;
};
 </s> add #include "tools/cabana/dbc.h" </s> remove       // split into one minitue chunks
 </s> add void ChartView::updateSeries(const cabana::Signal *sig, const std::vector<Event *> *events, bool clear) {
  QObject::connect(binary_view, &BinaryView::signalClicked, [this](const cabana::Signal *s) { signal_view->selectSignal(s, true); });
    QObject::connect(remove_btn, &QToolButton::clicked, this, &DetailWidget::removeMsg);
    QObject::connect(binary_view, &BinaryView::resizeSignal, signal_view->model, &SignalModel::resizeSignal);
    QObject::connect(binary_view, &BinaryView::addSignal, signal_view->model, &SignalModel::addSignal);
    QObject::connect(binary_view, &BinaryView::signalHovered, signal_view, &SignalView::signalHovered);
  QObject::connect(binary_view, &BinaryView::signalClicked, [this](const cabana::Signal *s) { signal_view->selectSignal(s, true); });
    QObject::connect(binary_view, &BinaryView::editSignal, signal_view->model, &SignalModel::saveSignal);
    QObject::connect(binary_view, &BinaryView::removeSignal, signal_view->model, &SignalModel::removeSignal);
    QObject::connect(binary_view, &BinaryView::showChart, charts, &ChartsWidget::showChart);
    QObject::connect(signal_view, &SignalView::showChart, charts, &ChartsWidget::showChart);
    QObject::connect(signal_view, &SignalView::highlight, binary_view, &BinaryView::highlight);
keep keep keep keep replace keep keep keep keep keep
 cabana: refactor Msg and Signal into dbc.cc (#27552) 
tools/cabana/detailwidget.cc