      const auto &m = messages[index.row()];
      if (index.column() == 0) {
        return QString::number(m.ts, 'f', 2);
      }
      return !sigs.empty() ? QString::number(get_raw_value((uint8_t *)m.dat.data(), m.dat.size(), *sigs[index.column() - 1]))
                           : toHex(m.dat);
    } else if (role == Qt::FontRole && index.column() == 1 && sigs.empty()) {
      return QFontDatabase::systemFont(QFontDatabase::FixedFont);
    }
    return {};
  }
 
</s> remove   int prev_row_count = messages.size();
 </s> add  </s> remove     messages = can->messages(msg_id);
  }
  int delta = messages.size() - prev_row_count;
  if (delta > 0) {
    beginInsertRows({}, prev_row_count, messages.size() - 1);
    endInsertRows();
  } else if (delta < 0) {
    beginRemoveRows({}, messages.size(), prev_row_count - 1);
    endRemoveRows();
 </s> add     uint64_t last_mono_time = messages.empty() ? 0 : messages.front().mono_time;
    auto new_msgs = fetchData(last_mono_time, (can->currentSec() + can->routeStartTime()) * 1e9);
    if ((has_more_data = !new_msgs.empty())) {
      beginInsertRows({}, 0, new_msgs.size() - 1);
      messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
      endInsertRows();
    } </s> remove   const auto &cur_segment = cur->second;
  // merge the previous adjacent segment if it's loaded
  auto begin = segments_.find(cur_segment->seg_num - 1);
  if (begin == segments_.end() || !(begin->second && begin->second->isLoaded())) {
    begin = cur;
  }
 </s> add  </s> remove 
int HistoryLog::sizeHintForColumn(int column) const {
  return -1;
}
 </s> add 
    return !sigs.empty() ? QString::number(m.sig_values[index.column() - 1]) : toHex(m.data);
      const auto &m = messages[index.row()];
      if (index.column() == 0) {
        return QString::number(m.ts, 'f', 2);
      }
    return !sigs.empty() ? QString::number(m.sig_values[index.column() - 1]) : toHex(m.data);
    return !sigs.empty() ? QString::number(m.sig_values[index.column() - 1]) : toHex(m.data);
    } else if (role == Qt::FontRole && index.column() == 1 && sigs.empty()) {
      return QFontDatabase::systemFont(QFontDatabase::FixedFont);
    }
    return {};
  }
keep keep keep keep replace replace keep keep keep keep keep
 Cabana: display all logs in log view (#26659)

* fetch more

* clear log in showevent

* fix wrong time value

* check list size

* fix canmessages::process

* cache all events

* improve segment cache

* cleanup 
tools/cabana/historylog.cc