}
}
+unsigned EventsModel::get_last_event_pos(uint64_t t) const
+{
+ // upper_bound() gives first where e.t > t,
+ // and the one before that is the one we want.
+ auto it = upper_bound(events.begin(), events.end(), t,
+ [](uint64_t t, const Event &e) { return t < e.t; });
+ if (it == events.begin()) {
+ return 0;
+ } else {
+ return distance(events.begin(), it - 1);
+ }
+}
+
EventsModel::Status EventsModel::get_status_at(uint64_t t)
{
Status s;
void delete_event(unsigned row);
void set_event_type(unsigned row, const std::string &type);
uint64_t get_time(unsigned row) { return events[row].t; }
+ unsigned get_last_event_pos(uint64_t t) const; // Last event that happened at or before t.
+ QModelIndex get_last_event_qt(uint64_t t) const {
+ return createIndex(get_last_event_pos(t), 0);
+ }
std::optional<int> get_player_id(unsigned row) { return events[row].player_id; }
struct Status {
if (!playing) {
video->pause(); // We only played to get a picture.
}
+ if (playing) {
+ QModelIndex row = events->get_last_event_qt(video->position());
+ ui->event_view->scrollTo(row, QAbstractItemView::PositionAtCenter);
+ }
update_ui_from_time(pos);
}