| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -43,7 +43,6 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->setItemsExpandable(false); | 
					 | 
					 | 
					 | 
					  view->setItemsExpandable(false); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->setIndentation(0); | 
					 | 
					 | 
					 | 
					  view->setIndentation(0); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->setRootIsDecorated(false); | 
					 | 
					 | 
					 | 
					  view->setRootIsDecorated(false); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->setUniformRowHeights(!settings.multiple_lines_hex); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  // Must be called before setting any header parameters to avoid overriding
 | 
					 | 
					 | 
					 | 
					  // Must be called before setting any header parameters to avoid overriding
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  restoreHeaderState(settings.message_header_state); | 
					 | 
					 | 
					 | 
					  restoreHeaderState(settings.message_header_state); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -135,15 +134,9 @@ void MessagesWidget::selectMessage(const MessageId &msg_id) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void MessagesWidget::suppressHighlighted() { | 
					 | 
					 | 
					 | 
					void MessagesWidget::suppressHighlighted() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (sender() == suppress_add) { | 
					 | 
					 | 
					 | 
					  int n = sender() == suppress_add ? can->suppressHighlighted() : (can->clearSuppressed(), 0); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    size_t n = can->suppressHighlighted(); | 
					 | 
					 | 
					 | 
					  suppress_clear->setText(n > 0 ? tr("Clear (%1)").arg(n) : tr("Clear")); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    suppress_clear->setText(tr("Clear (%1)").arg(n)); | 
					 | 
					 | 
					 | 
					  suppress_clear->setEnabled(n > 0); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    suppress_clear->setEnabled(true); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    can->clearSuppressed(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    suppress_clear->setText(tr("Clear")); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    suppress_clear->setEnabled(false); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void MessagesWidget::headerContextMenuEvent(const QPoint &pos) { | 
					 | 
					 | 
					 | 
					void MessagesWidget::headerContextMenuEvent(const QPoint &pos) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -174,7 +167,6 @@ void MessagesWidget::menuAboutToShow() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void MessagesWidget::setMultiLineBytes(bool multi) { | 
					 | 
					 | 
					 | 
					void MessagesWidget::setMultiLineBytes(bool multi) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  settings.multiple_lines_hex = multi; | 
					 | 
					 | 
					 | 
					  settings.multiple_lines_hex = multi; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  delegate->setMultipleLines(multi); | 
					 | 
					 | 
					 | 
					  delegate->setMultipleLines(multi); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->setUniformRowHeights(!multi); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->updateBytesSectionSize(); | 
					 | 
					 | 
					 | 
					  view->updateBytesSectionSize(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  view->doItemsLayout(); | 
					 | 
					 | 
					 | 
					  view->doItemsLayout(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -207,22 +199,22 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }; | 
					 | 
					 | 
					 | 
					  }; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  const static QString NA =  QStringLiteral("N/A"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  const auto &item = items_[index.row()]; | 
					 | 
					 | 
					 | 
					  const auto &item = items_[index.row()]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  const auto &data = can->lastMessage(item.id); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (role == Qt::DisplayRole) { | 
					 | 
					 | 
					 | 
					  if (role == Qt::DisplayRole) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    switch (index.column()) { | 
					 | 
					 | 
					 | 
					    switch (index.column()) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::NAME: return item.name; | 
					 | 
					 | 
					 | 
					      case Column::NAME: return item.name; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A"; | 
					 | 
					 | 
					 | 
					      case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : NA; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::ADDRESS: return QString::number(item.id.address, 16); | 
					 | 
					 | 
					 | 
					      case Column::ADDRESS: return QString::number(item.id.address, 16); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::NODE: return item.node; | 
					 | 
					 | 
					 | 
					      case Column::NODE: return item.node; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data.freq) : "N/A"; | 
					 | 
					 | 
					 | 
					      case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(can->lastMessage(item.id).freq) : NA; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A"; | 
					 | 
					 | 
					 | 
					      case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(can->lastMessage(item.id).count) : NA; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A"; | 
					 | 
					 | 
					 | 
					      case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : NA; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (role == ColorsRole) { | 
					 | 
					 | 
					 | 
					  } else if (role == ColorsRole) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return QVariant::fromValue((void*)(&data.colors)); | 
					 | 
					 | 
					 | 
					    return QVariant::fromValue((void*)(&can->lastMessage(item.id).colors)); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) { | 
					 | 
					 | 
					 | 
					  } else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return QVariant::fromValue((void*)(&data.dat)); | 
					 | 
					 | 
					 | 
					    return QVariant::fromValue((void*)(&can->lastMessage(item.id).dat)); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (role == Qt::ForegroundRole && !item.active) { | 
					 | 
					 | 
					 | 
					  } else if (role == Qt::ForegroundRole && !item.active) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return settings.theme == DARK_THEME ? QApplication::palette().color(QPalette::Text).darker(150) : QColor(Qt::gray); | 
					 | 
					 | 
					 | 
					    return settings.theme == DARK_THEME ? QApplication::palette().color(QPalette::Text).darker(150) : QColor(Qt::gray); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (role == Qt::ToolTipRole && index.column() == Column::NAME) { | 
					 | 
					 | 
					 | 
					  } else if (role == Qt::ToolTipRole && index.column() == Column::NAME) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -366,18 +358,17 @@ bool MessageListModel::filterAndSort() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void MessageListModel::msgsReceived(const std::set<MessageId> *new_msgs, bool has_new_ids) { | 
					 | 
					 | 
					 | 
					void MessageListModel::msgsReceived(const std::set<MessageId> *new_msgs, bool has_new_ids) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (has_new_ids || filters_.contains(Column::FREQ) || filters_.contains(Column::COUNT) || filters_.contains(Column::DATA)) { | 
					 | 
					 | 
					 | 
					  if (has_new_ids || ((filters_.count(Column::FREQ) || filters_.count(Column::COUNT) || filters_.count(Column::DATA)) && | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                      ++sort_threshold_ == settings.fps)) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    sort_threshold_ = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (filterAndSort()) return; | 
					 | 
					 | 
					 | 
					    if (filterAndSort()) return; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  for (int i = 0; i < items_.size(); ++i) { | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    auto &item = items_[i]; | 
					 | 
					 | 
					 | 
					  for (auto &item : items_) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    bool prev_active = item.active; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    item.active = isMessageActive(item.id); | 
					 | 
					 | 
					 | 
					    item.active = isMessageActive(item.id); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (item.active != prev_active || !new_msgs || new_msgs->count(item.id)) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      for (int col = 0; col < columnCount(); ++col) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        emit dataChanged(index(i, col), index(i, col), {Qt::DisplayRole}); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // Update viewport
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void MessageListModel::sort(int column, Qt::SortOrder order) { | 
					 | 
					 | 
					 | 
					void MessageListModel::sort(int column, Qt::SortOrder order) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -420,6 +411,7 @@ void MessageView::updateBytesSectionSize() { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      max_bytes = std::max<int>(max_bytes, m.dat.size()); | 
					 | 
					 | 
					 | 
					      max_bytes = std::max<int>(max_bytes, m.dat.size()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  setUniformRowHeights(!delegate->multipleLines() || max_bytes <= 8); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  header()->resizeSection(MessageListModel::Column::DATA, delegate->sizeForBytes(max_bytes).width()); | 
					 | 
					 | 
					 | 
					  header()->resizeSection(MessageListModel::Column::DATA, delegate->sizeForBytes(max_bytes).width()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |