From d9795989980dddf5213e1e1293002e5192ad9c54 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 May 2023 23:02:20 +0200 Subject: [PATCH] Make the events view scroll the current event into view when playing. --- events.cpp | 13 +++++++++++++ events.h | 4 ++++ main.cpp | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/events.cpp b/events.cpp index 8ad0009..24fd649 100644 --- a/events.cpp +++ b/events.cpp @@ -225,6 +225,19 @@ void EventsModel::set_event_type(unsigned pos, const string &type) } } +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; diff --git a/events.h b/events.h index b33f0b6..9804836 100644 --- a/events.h +++ b/events.h @@ -29,6 +29,10 @@ public: 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 get_player_id(unsigned row) { return events[row].player_id; } struct Status { diff --git a/main.cpp b/main.cpp index 104e1e5..faac256 100644 --- a/main.cpp +++ b/main.cpp @@ -161,6 +161,10 @@ void MainWindow::position_changed(uint64_t pos) 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); } -- 2.39.2