@@ -186,20 +186,21 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const {
186
186
};
187
187
188
188
const auto &item = items_[index .row ()];
189
+ const auto &data = can->lastMessage (item.id );
189
190
if (role == Qt::DisplayRole) {
190
191
switch (index .column ()) {
191
192
case Column::NAME: return item.name ;
192
193
case Column::SOURCE: return item.id .source != INVALID_SOURCE ? QString::number (item.id .source ) : " N/A" ;
193
194
case Column::ADDRESS: return QString::number (item.id .address , 16 );
194
195
case Column::NODE: return item.node ;
195
- case Column::FREQ: return item.id .source != INVALID_SOURCE ? getFreq (*item. data ) : " N/A" ;
196
- case Column::COUNT: return item.id .source != INVALID_SOURCE ? QString::number (item. data -> count ) : " N/A" ;
196
+ case Column::FREQ: return item.id .source != INVALID_SOURCE ? getFreq (data) : " N/A" ;
197
+ case Column::COUNT: return item.id .source != INVALID_SOURCE ? QString::number (data. count ) : " N/A" ;
197
198
case Column::DATA: return item.id .source != INVALID_SOURCE ? " " : " N/A" ;
198
199
}
199
200
} else if (role == ColorsRole) {
200
- return QVariant::fromValue ((void *)(&item. data -> colors ));
201
+ return QVariant::fromValue ((void *)(&data. colors ));
201
202
} else if (role == BytesRole && index .column () == Column::DATA && item.id .source != INVALID_SOURCE) {
202
- return QVariant::fromValue ((void *)(&item. data -> dat ));
203
+ return QVariant::fromValue ((void *)(&data. dat ));
203
204
} else if (role == Qt::ToolTipRole && index .column () == Column::NAME) {
204
205
auto msg = dbc ()->msg (item.id );
205
206
auto tooltip = item.name ;
@@ -219,7 +220,7 @@ void MessageListModel::dbcModified() {
219
220
for (const auto &[_, m] : dbc ()->getMessages (-1 )) {
220
221
dbc_messages_.insert (MessageId{.source = INVALID_SOURCE, .address = m.address });
221
222
}
222
- filterAndSort (true );
223
+ filterAndSort ();
223
224
}
224
225
225
226
void MessageListModel::sortItems (std::vector<MessageListModel::Item> &items) {
@@ -233,8 +234,8 @@ void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) {
233
234
case Column::SOURCE: do_sort (items, [](auto &item) { return std::tie (item.id .source , item.id ); }); break ;
234
235
case Column::ADDRESS: do_sort (items, [](auto &item) { return std::tie (item.id .address , item.id );}); break ;
235
236
case Column::NODE: do_sort (items, [](auto &item) { return std::tie (item.node , item.id );}); break ;
236
- case Column::FREQ: do_sort (items, [](auto &item) { return std::tie (item. data -> freq , item.id ); }); break ;
237
- case Column::COUNT: do_sort (items, [](auto &item) { return std::tie (item. data -> count , item.id ); }); break ;
237
+ case Column::FREQ: do_sort (items, [](auto &item) { return std::make_pair (can-> lastMessage (item. id ). freq , item.id ); }); break ;
238
+ case Column::COUNT: do_sort (items, [](auto &item) { return std::make_pair (can-> lastMessage (item. id ). count , item.id ); }); break ;
238
239
}
239
240
}
240
241
@@ -258,6 +259,7 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
258
259
return true ;
259
260
260
261
bool match = true ;
262
+ const auto &data = can->lastMessage (item.id );
261
263
for (auto it = filters_.cbegin (); it != filters_.cend () && match; ++it) {
262
264
const QString &txt = it.value ();
263
265
switch (it.key ()) {
@@ -282,20 +284,20 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
282
284
break ;
283
285
case Column::FREQ:
284
286
// TODO: Hide stale messages?
285
- match = parseRange (txt, item. data -> freq );
287
+ match = parseRange (txt, data. freq );
286
288
break ;
287
289
case Column::COUNT:
288
- match = parseRange (txt, item. data -> count );
290
+ match = parseRange (txt, data. count );
289
291
break ;
290
292
case Column::DATA:
291
- match = utils::toHex (item. data -> dat ).contains (txt, Qt::CaseInsensitive);
293
+ match = utils::toHex (data. dat ).contains (txt, Qt::CaseInsensitive);
292
294
break ;
293
295
}
294
296
}
295
297
return match;
296
298
}
297
299
298
- void MessageListModel::filterAndSort (bool force_reset ) {
300
+ void MessageListModel::filterAndSort () {
299
301
// merge CAN and DBC messages
300
302
std::vector<MessageId> all_messages;
301
303
all_messages.reserve (can->lastMessages ().size () + dbc_messages_.size ());
@@ -304,22 +306,21 @@ void MessageListModel::filterAndSort(bool force_reset) {
304
306
all_messages.push_back (id);
305
307
dbc_msgs.erase (MessageId{.source = INVALID_SOURCE, .address = id.address });
306
308
}
307
- std::copy (dbc_msgs. begin (), dbc_msgs.end (), std::back_inserter (all_messages ));
309
+ all_messages. insert (all_messages. end (), dbc_msgs.begin (), dbc_msgs. end ( ));
308
310
309
311
// filter and sort
310
312
std::vector<Item> items;
311
313
for (const auto &id : all_messages) {
312
314
auto msg = dbc ()->msg (id);
313
315
Item item = {.id = id,
314
316
.name = msg ? msg->name : UNTITLED,
315
- .node = msg ? msg->transmitter : QString (),
316
- .data = &can->lastMessage (id)};
317
+ .node = msg ? msg->transmitter : QString ()};
317
318
if (match (item))
318
319
items.emplace_back (item);
319
320
}
320
321
sortItems (items);
321
322
322
- if (force_reset || items_ != items) {
323
+ if (items_ != items) {
323
324
beginResetModel ();
324
325
items_ = std::move (items);
325
326
endResetModel ();
0 commit comments