Cabana: Added ability to highlight and resize overlapped signals (#26210)

pull/26219/head
Dean Lee 3 years ago committed by GitHub
parent 60b666fe3b
commit 20dced4edc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      tools/cabana/binaryview.cc
  2. 3
      tools/cabana/binaryview.h

@ -70,9 +70,10 @@ void BinaryView::mousePressEvent(QMouseEvent *event) {
void BinaryView::mouseMoveEvent(QMouseEvent *event) { void BinaryView::mouseMoveEvent(QMouseEvent *event) {
if (auto index = indexAt(event->pos()); index.isValid()) { if (auto index = indexAt(event->pos()); index.isValid()) {
auto item = (BinaryViewModel::Item *)index.internalPointer(); auto item = (BinaryViewModel::Item *)index.internalPointer();
highlight(item->sig); const Signal *sig = item->sigs.isEmpty() ? nullptr : item->sigs.back();
item->sig ? QToolTip::showText(event->globalPos(), item->sig->name.c_str(), this, rect()) highlight(sig);
: QToolTip::hideText(); sig ? QToolTip::showText(event->globalPos(), sig->name.c_str(), this, rect())
: QToolTip::hideText();
} }
QTableView::mouseMoveEvent(event); QTableView::mouseMoveEvent(event);
} }
@ -119,11 +120,13 @@ void BinaryView::updateState() {
const Signal *BinaryView::getResizingSignal() const { const Signal *BinaryView::getResizingSignal() const {
if (anchor_index.isValid()) { if (anchor_index.isValid()) {
auto item = (const BinaryViewModel::Item *)anchor_index.internalPointer(); auto item = (const BinaryViewModel::Item *)anchor_index.internalPointer();
if (item && item->sig) { if (item && item->sigs.size() > 0) {
int archor_pos = anchor_index.row() * 8 + anchor_index.column(); int archor_pos = anchor_index.row() * 8 + anchor_index.column();
auto [sig_from, sig_to] = getSignalRange(item->sig); for (auto s : item->sigs) {
if (archor_pos == sig_from || archor_pos == sig_to) auto [sig_from, sig_to] = getSignalRange(s);
return item->sig; if (archor_pos == sig_from || archor_pos == sig_to)
return s;
}
} }
} }
return nullptr; return nullptr;
@ -157,7 +160,7 @@ void BinaryViewModel::setMessage(const QString &message_id) {
sig.is_little_endian ? items[idx].is_msb = true : items[idx].is_lsb = true; sig.is_little_endian ? items[idx].is_msb = true : items[idx].is_lsb = true;
} }
items[idx].bg_color = getColor(i); items[idx].bg_color = getColor(i);
items[idx].sig = &dbc_msg->sigs[i]; items[idx].sigs.push_back(&dbc_msg->sigs[i]);
} }
} }
} }
@ -235,7 +238,8 @@ void BinaryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
BinaryView *bin_view = (BinaryView *)parent(); BinaryView *bin_view = (BinaryView *)parent();
painter->save(); painter->save();
bool hover = item->sig && bin_view->hoveredSignal() == item->sig; bool hover = std::find_if(item->sigs.begin(), item->sigs.end(), [=](auto s) { return s == bin_view->hoveredSignal(); }) !=
item->sigs.end();
// background // background
QColor bg_color = hover ? hoverColor(item->bg_color) : item->bg_color; QColor bg_color = hover ? hoverColor(item->bg_color) : item->bg_color;
if (option.state & QStyle::State_Selected) { if (option.state & QStyle::State_Selected) {

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <QList>
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
#include <QTableView> #include <QTableView>
@ -38,7 +39,7 @@ public:
bool is_msb = false; bool is_msb = false;
bool is_lsb = false; bool is_lsb = false;
QString val = "0"; QString val = "0";
const Signal *sig = nullptr; QList<const Signal *> sigs;
}; };
private: private:

Loading…
Cancel
Save