+ s.our_score, s.their_score, offense, s.num_passes, s.possession_sec);
+ if (s.stoppage_sec > 0) {
+ char buf2[256];
+ snprintf(buf2, sizeof(buf2), "%s (plus %d sec stoppage)", buf, s.stoppage_sec);
+ ui->status->setText(buf2);
+ } else {
+ ui->status->setText(buf);
+ }
+}
+
+void MainWindow::update_player_buttons(uint64_t t)
+{
+ QPushButton *buttons[] = {
+ ui->player_1,
+ ui->player_2,
+ ui->player_3,
+ ui->player_4,
+ ui->player_5,
+ ui->player_6,
+ ui->player_7
+ };
+ const char shortcuts[] = "qweasdf";
+ int num_players = 0;
+ for (int player_id : events->sort_team(events->get_team_at(t))) {
+ QPushButton *btn = buttons[num_players];
+ string label = players->get_player_name_by_id(player_id) + " (&" + shortcuts[num_players] + ")";
+ char shortcut[2] = "";
+ shortcut[0] = toupper(shortcuts[num_players]);
+ btn->setText(QString::fromUtf8(label));
+ btn->setShortcut(QCoreApplication::translate("MainWindow", shortcut, nullptr));
+ btn->setEnabled(true);
+ if (++num_players == 7) {
+ break;
+ }
+ }
+ for (int i = num_players; i < 7; ++i) {
+ QPushButton *btn = buttons[i];
+ btn->setText("No player");
+ btn->setEnabled(false);
+ }
+}
+
+void MainWindow::update_action_buttons(uint64_t t)
+{
+ EventsModel::Status s = events->get_status_at(t);
+
+ bool has_selection = false;
+ bool has_selection_with_player = false;
+
+ QItemSelectionModel *select = ui->event_view->selectionModel();
+ if (select->hasSelection()) {
+ has_selection = true;
+ int row = select->selectedRows().front().row(); // Should only be one, due to our selection behavior.
+ has_selection_with_player = events->get_player_id(row).has_value();
+ }
+ ui->delete_->setEnabled(has_selection);
+
+ if (s.stoppage) {
+ ui->stoppage->setText("Restart (&v)");
+ ui->stoppage->setShortcut(QCoreApplication::translate("MainWindow", "V", nullptr));
+ ui->catch_->setEnabled(false);
+ ui->throwaway->setEnabled(false);
+ ui->drop->setEnabled(false);
+ ui->goal->setEnabled(false);
+ ui->offensive_soft_plus->setEnabled(false);
+ ui->offensive_soft_minus->setEnabled(false);
+ ui->pull->setEnabled(false);
+ ui->interception->setEnabled(false);
+ ui->their_throwaway->setEnabled(false);
+ ui->our_defense->setEnabled(false);
+ ui->their_goal->setEnabled(false);
+ ui->defensive_soft_plus->setEnabled(false);
+ ui->defensive_soft_minus->setEnabled(false);
+ ui->their_pull->setEnabled(false);
+ return;
+ } else {
+ ui->stoppage->setText("Stoppage (&v)");
+ ui->stoppage->setShortcut(QCoreApplication::translate("MainWindow", "V", nullptr));
+ }
+
+ // Defaults for pull-related buttons.
+ ui->pull->setText("Pull (&p)");
+ ui->their_pull->setText("Their pull (&p)");
+ ui->pull->setShortcut(QCoreApplication::translate("MainWindow", "P", nullptr));
+ ui->their_pull->setShortcut(QCoreApplication::translate("MainWindow", "P", nullptr));
+ ui->throwaway->setText("Throwaway (&t)");
+ ui->throwaway->setShortcut(QCoreApplication::translate("MainWindow", "T", nullptr));
+
+ if (s.pull_state == EventsModel::Status::SHOULD_PULL) {
+ ui->pull->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player);
+ ui->their_pull->setEnabled(s.attack_state == EventsModel::Status::OFFENSE);
+
+ ui->catch_->setEnabled(false);
+ ui->throwaway->setEnabled(false);
+ ui->drop->setEnabled(false);
+ ui->goal->setEnabled(false);
+ ui->offensive_soft_plus->setEnabled(false);
+ ui->offensive_soft_minus->setEnabled(false);
+ ui->interception->setEnabled(false);
+ ui->their_throwaway->setEnabled(false);
+ ui->our_defense->setEnabled(false);
+ ui->their_goal->setEnabled(false);
+ ui->defensive_soft_plus->setEnabled(false);
+ ui->defensive_soft_minus->setEnabled(false);
+ return;
+ }
+ if (s.pull_state == EventsModel::Status::PULL_IN_AIR) {
+ if (s.attack_state == EventsModel::Status::DEFENSE) {
+ ui->pull->setText("Pull landed (&p)");
+ ui->pull->setShortcut(QCoreApplication::translate("MainWindow", "P", nullptr));
+ ui->pull->setEnabled(true);
+
+ ui->throwaway->setText("Pull OOB (&t)");
+ ui->throwaway->setShortcut(QCoreApplication::translate("MainWindow", "T", nullptr));
+ ui->throwaway->setEnabled(true);
+ } else {
+ ui->pull->setEnabled(false);
+ ui->throwaway->setEnabled(false);
+ }
+ ui->their_pull->setEnabled(false); // We don't track their pull landings; only by means of catch etc.
+
+ ui->catch_->setEnabled(false);
+ ui->drop->setEnabled(false);
+ ui->goal->setEnabled(false);
+ ui->offensive_soft_plus->setEnabled(false);
+ ui->offensive_soft_minus->setEnabled(false);
+ ui->interception->setEnabled(false);
+ ui->their_throwaway->setEnabled(false);
+ ui->our_defense->setEnabled(false);
+ ui->their_goal->setEnabled(false);
+ ui->defensive_soft_plus->setEnabled(false);
+ ui->defensive_soft_minus->setEnabled(false);
+ return;
+ }
+
+ ui->catch_->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->throwaway->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->drop->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->goal->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->offensive_soft_plus->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->offensive_soft_minus->setEnabled(s.attack_state == EventsModel::Status::OFFENSE && has_selection_with_player);
+ ui->pull->setEnabled(false);
+
+ ui->interception->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player);
+ ui->their_throwaway->setEnabled(s.attack_state == EventsModel::Status::DEFENSE);
+ ui->our_defense->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player);
+ ui->their_goal->setEnabled(s.attack_state == EventsModel::Status::DEFENSE);
+ ui->defensive_soft_plus->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player);
+ ui->defensive_soft_minus->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player);
+ ui->their_pull->setEnabled(false);