|
|
|
@ -43,7 +43,6 @@ MessagesWidget::MessagesWidget(QWidget *parent) : menu(new QMenu(this)), QWidget |
|
|
|
|
view->setItemsExpandable(false); |
|
|
|
|
view->setIndentation(0); |
|
|
|
|
view->setRootIsDecorated(false); |
|
|
|
|
view->setUniformRowHeights(!settings.multiple_lines_hex); |
|
|
|
|
|
|
|
|
|
// Must be called before setting any header parameters to avoid overriding
|
|
|
|
|
restoreHeaderState(settings.message_header_state); |
|
|
|
@ -135,15 +134,9 @@ void MessagesWidget::selectMessage(const MessageId &msg_id) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MessagesWidget::suppressHighlighted() { |
|
|
|
|
if (sender() == suppress_add) { |
|
|
|
|
size_t n = can->suppressHighlighted(); |
|
|
|
|
suppress_clear->setText(tr("Clear (%1)").arg(n)); |
|
|
|
|
suppress_clear->setEnabled(true); |
|
|
|
|
} else { |
|
|
|
|
can->clearSuppressed(); |
|
|
|
|
suppress_clear->setText(tr("Clear")); |
|
|
|
|
suppress_clear->setEnabled(false); |
|
|
|
|
} |
|
|
|
|
int n = sender() == suppress_add ? can->suppressHighlighted() : (can->clearSuppressed(), 0); |
|
|
|
|
suppress_clear->setText(n > 0 ? tr("Clear (%1)").arg(n) : tr("Clear")); |
|
|
|
|
suppress_clear->setEnabled(n > 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MessagesWidget::headerContextMenuEvent(const QPoint &pos) { |
|
|
|
@ -174,7 +167,6 @@ void MessagesWidget::menuAboutToShow() { |
|
|
|
|
void MessagesWidget::setMultiLineBytes(bool multi) { |
|
|
|
|
settings.multiple_lines_hex = multi; |
|
|
|
|
delegate->setMultipleLines(multi); |
|
|
|
|
view->setUniformRowHeights(!multi); |
|
|
|
|
view->updateBytesSectionSize(); |
|
|
|
|
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 &data = can->lastMessage(item.id); |
|
|
|
|
if (role == Qt::DisplayRole) { |
|
|
|
|
switch (index.column()) { |
|
|
|
|
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::NODE: return item.node; |
|
|
|
|
case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data.freq) : "N/A"; |
|
|
|
|
case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A"; |
|
|
|
|
case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "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(can->lastMessage(item.id).count) : NA; |
|
|
|
|
case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : NA; |
|
|
|
|
} |
|
|
|
|
} 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) { |
|
|
|
|
return QVariant::fromValue((void*)(&data.dat)); |
|
|
|
|
return QVariant::fromValue((void*)(&can->lastMessage(item.id).dat)); |
|
|
|
|
} else if (role == Qt::ForegroundRole && !item.active) { |
|
|
|
|
return settings.theme == DARK_THEME ? QApplication::palette().color(QPalette::Text).darker(150) : QColor(Qt::gray); |
|
|
|
|
} 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) { |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < items_.size(); ++i) { |
|
|
|
|
auto &item = items_[i]; |
|
|
|
|
bool prev_active = item.active; |
|
|
|
|
|
|
|
|
|
for (auto &item : items_) { |
|
|
|
|
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) { |
|
|
|
@ -420,6 +411,7 @@ void MessageView::updateBytesSectionSize() { |
|
|
|
|
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()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|