From a53c2f1a04693bf3085b777bc622623a02a64095 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 1 May 2023 15:44:44 +0200 Subject: [PATCH] Update the status bar from the events. --- events.cpp | 39 +++++++++++++++++++++++++++++++++++++++ events.h | 8 ++++++++ mainwindow.h | 2 ++ stats.cpp | 33 +++++++++++++++++++++++++-------- 4 files changed, 74 insertions(+), 8 deletions(-) diff --git a/events.cpp b/events.cpp index 4ff0090..5752d82 100644 --- a/events.cpp +++ b/events.cpp @@ -221,3 +221,42 @@ void EventsModel::set_event_type(unsigned pos, const string &type) abort(); } } + +EventsModel::Status EventsModel::get_status_at(uint64_t t) +{ + Status s; + s.our_score = 0; + s.their_score = 0; + s.offense = true; + uint64_t last_gained_possession = 0; + unsigned num_touches = 0; + for (const Event &e : events) { + if (e.t > t) { + break; + } + if (e.type == "goal") { + ++s.our_score; + s.offense = false; + num_touches = 0; + } + if (e.type == "their_goal") { + ++s.their_score; + s.offense = true; + num_touches = 0; + } + if (e.type == "catch") { + if (num_touches == 0) { // Pick up. + last_gained_possession = e.t; + } + ++num_touches; + } + if (e.type == "interception") { + num_touches = 1; + s.offense = true; + last_gained_possession = e.t; + } + } + s.num_passes = (num_touches == 0) ? 0 : num_touches - 1; + s.possession_sec = (s.offense && last_gained_possession != 0) ? (t - last_gained_possession) / 1000 : 0; + return s; +} diff --git a/events.h b/events.h index 9dba9cf..db11ed0 100644 --- a/events.h +++ b/events.h @@ -29,6 +29,14 @@ public: void delete_event(unsigned row); void set_event_type(unsigned row, const std::string &type); + struct Status { + unsigned our_score, their_score; + bool offense; + unsigned num_passes; + unsigned possession_sec; + }; + Status get_status_at(uint64_t t); + private: struct Player { int player_id; diff --git a/mainwindow.h b/mainwindow.h index e78463d..20d8c6c 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -16,9 +16,11 @@ public: void setModel(EventsModel *model); private: + void position_changed(uint64_t pos); void seek(int64_t delta_ms); void set_current_event_type(const std::string &type); void delete_current_event(); + void update_status(); Ui::MainWindow *ui; EventsModel *model; diff --git a/stats.cpp b/stats.cpp index 437e0ee..460ddd8 100644 --- a/stats.cpp +++ b/stats.cpp @@ -41,14 +41,7 @@ MainWindow::MainWindow() ui->setupUi(this); connect(player, &QMediaPlayer::positionChanged, [this](uint64_t pos) { - ui->timestamp->setText(QString::fromUtf8(format_timestamp(pos))); - if (buffered_seek) { - player->setPosition(*buffered_seek); - buffered_seek.reset(); - } - if (!playing) { - player->pause(); // We only played to get a picture. - } + position_changed(pos); }); player->setVideoOutput(ui->video); @@ -115,6 +108,19 @@ MainWindow::MainWindow() connect(ui->delete_, &QPushButton::clicked, [this]() { delete_current_event(); }); } +void MainWindow::position_changed(uint64_t pos) +{ + ui->timestamp->setText(QString::fromUtf8(format_timestamp(pos))); + if (buffered_seek) { + player->setPosition(*buffered_seek); + buffered_seek.reset(); + } + if (!playing) { + player->pause(); // We only played to get a picture. + } + update_status(); +} + void MainWindow::setModel(EventsModel *model) { ui->event_view->setModel(model); @@ -140,6 +146,7 @@ void MainWindow::set_current_event_type(const string &type) } int row = select->selectedRows().front().row(); // Should only be one, due to our selection behavior. model->set_event_type(row, type); + update_status(); } void MainWindow::delete_current_event() @@ -150,6 +157,16 @@ void MainWindow::delete_current_event() } int row = select->selectedRows().front().row(); // Should only be one, due to our selection behavior. model->delete_event(row); + update_status(); +} + +void MainWindow::update_status() +{ + EventsModel::Status s = model->get_status_at(player->position()); + char buf[256]; + snprintf(buf, sizeof(buf), "%d–%d | %s | %d passes, %d sec possession", + s.our_score, s.their_score, s.offense ? "offense" : "defense", s.num_passes, s.possession_sec); + ui->status->setText(buf); } sqlite3 *open_db(const char *filename) -- 2.39.2