]> git.sesse.net Git - pkanalytics/commitdiff
Update the status bar from the events.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 1 May 2023 13:44:44 +0000 (15:44 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 1 May 2023 13:46:26 +0000 (15:46 +0200)
events.cpp
events.h
mainwindow.h
stats.cpp

index 4ff009093eb006a248f80d8ed7404ede963fc539..5752d82ca4fb5c8d7cfed40ec705e1d17f698258 100644 (file)
@@ -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;
+}
index 9dba9cfbf573422e65aed247c4246f56057ee308..db11ed0776fa850b5ec8265e065c6fd785b904c5 100644 (file)
--- 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;
index e78463dc83a388ad99d70f38c3369b25b61f1b1a..20d8c6cc7348cda754f8fbd9107b6f215144acf8 100644 (file)
@@ -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;
index 437e0eefad815100c8158a902b6752ea092b5a25..460ddd8dc6aff2329520aaf40417f814e986b021 100644 (file)
--- 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)