|  |  | @ -3,7 +3,9 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QApplication> |  |  |  | #include <QApplication> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QFontDatabase> |  |  |  | #include <QFontDatabase> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QHeaderView> |  |  |  | #include <QHeaderView> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <QMouseEvent> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <QPainter> |  |  |  | #include <QPainter> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <QToolTip> | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "tools/cabana/canmessages.h" |  |  |  | #include "tools/cabana/canmessages.h" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -19,6 +21,7 @@ BinaryView::BinaryView(QWidget *parent) : QTableView(parent) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   horizontalHeader()->hide(); |  |  |  |   horizontalHeader()->hide(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); |  |  |  |   verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); | 
			
		
	
		
		
			
				
					
					|  |  |  |   setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |  |  |  |   setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setMouseTracking(true); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // replace selection model
 |  |  |  |   // replace selection model
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   auto old_model = selectionModel(); |  |  |  |   auto old_model = selectionModel(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -30,6 +33,24 @@ BinaryView::BinaryView(QWidget *parent) : QTableView(parent) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   }); |  |  |  |   }); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void BinaryView::highlight(const Signal *sig) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (sig != hovered_sig) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     hovered_sig = sig; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     model->dataChanged(model->index(0, 0), model->index(model->rowCount() - 1, model->columnCount() - 1)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     emit signalHovered(hovered_sig); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void BinaryView::mouseMoveEvent(QMouseEvent *event) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (auto index = indexAt(event->pos()); index.isValid()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     auto item = (BinaryViewModel::Item *)index.internalPointer(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     highlight(item->sig); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (item->sig) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       QToolTip::showText(event->globalPos(), item->sig->name.c_str(), this, rect()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QTableView::mouseMoveEvent(event); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void BinaryView::mouseReleaseEvent(QMouseEvent *event) { |  |  |  | void BinaryView::mouseReleaseEvent(QMouseEvent *event) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   QTableView::mouseReleaseEvent(event); |  |  |  |   QTableView::mouseReleaseEvent(event); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -40,6 +61,11 @@ void BinaryView::mouseReleaseEvent(QMouseEvent *event) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void BinaryView::leaveEvent(QEvent *event) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   highlight(nullptr); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QTableView::leaveEvent(event); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void BinaryView::setMessage(const QString &message_id) { |  |  |  | void BinaryView::setMessage(const QString &message_id) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   msg_id = message_id; |  |  |  |   msg_id = message_id; | 
			
		
	
		
		
			
				
					
					|  |  |  |   model->setMessage(message_id); |  |  |  |   model->setMessage(message_id); | 
			
		
	
	
		
		
			
				
					|  |  | @ -80,7 +106,8 @@ void BinaryViewModel::setMessage(const QString &message_id) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else if (j == end) { |  |  |  |         } else if (j == end) { | 
			
		
	
		
		
			
				
					
					|  |  |  |           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 = QColor(getColor(i)); |  |  |  |         items[idx].bg_color = getColor(i); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         items[idx].sig = &dbc_msg->sigs[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
	
		
		
			
				
					|  |  | @ -170,9 +197,17 @@ QSize BinaryItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QMo | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void BinaryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { |  |  |  | void BinaryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { | 
			
		
	
		
		
			
				
					
					|  |  |  |   auto item = (const BinaryViewModel::Item *)index.internalPointer(); |  |  |  |   auto item = (const BinaryViewModel::Item *)index.internalPointer(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   BinaryView *bin_view = (BinaryView *)parent(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   painter->save(); |  |  |  |   painter->save(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   // TODO: highlight signal cells on mouse over
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   painter->fillRect(option.rect, option.state & QStyle::State_Selected ? highlight_color : item->bg_color); |  |  |  |   // background
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   QColor bg_color = item->sig && bin_view->hoveredSignal() == item->sig ? hoverColor(item->bg_color) : item->bg_color; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (option.state & QStyle::State_Selected) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     bg_color = highlight_color; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   painter->fillRect(option.rect, bg_color); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // text
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (index.column() == 8) { |  |  |  |   if (index.column() == 8) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     painter->setFont(hex_font); |  |  |  |     painter->setFont(hex_font); | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |