From cb053c497530ddbd5702f1b5186a09789834def3 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 2 May 2023 21:51:08 +0200 Subject: [PATCH] Implement pulls landing. --- events.cpp | 6 ++-- main.cpp | 91 +++++++++++++++++++++++++++++++++++++++++++++------ mainwindow.ui | 7 ++-- 3 files changed, 90 insertions(+), 14 deletions(-) diff --git a/events.cpp b/events.cpp index 2fca843..8ad0009 100644 --- a/events.cpp +++ b/events.cpp @@ -248,10 +248,12 @@ EventsModel::Status EventsModel::get_status_at(uint64_t t) if (e.type == "goal" || e.type == "their_goal") { s.pull_state = Status::SHOULD_PULL; - } else if (e.type == "in" || e.type == "out" || e.type == "stoppage" || e.type == "restart" || e.type == "unknown") { + } else if (e.type == "in" || e.type == "out" || e.type == "stoppage" || e.type == "restart" || e.type == "unknown" || e.type == "set_defense" || e.type == "set_offense") { // No effect on pull status. + } else if (e.type == "pull") { + s.pull_state = Status::PULL_IN_AIR; } else { - s.pull_state = Status::NOT_PULLING; + s.pull_state = Status::NOT_PULLING; // Includes pull_landed and pull_oob. } if (e.type == "set_offense") { diff --git a/main.cpp b/main.cpp index 13fd81e..104e1e5 100644 --- a/main.cpp +++ b/main.cpp @@ -99,19 +99,37 @@ MainWindow::MainWindow(EventsModel *events, PlayersModel *players) : events(even // Offensive events connect(ui->offense_label, &ClickableLabel::clicked, [this]() { insert_noplayer_event("set_offense"); }); connect(ui->catch_, &QPushButton::clicked, [this]() { set_current_event_type("catch"); }); - connect(ui->throwaway, &QPushButton::clicked, [this]() { set_current_event_type("throwaway"); }); + connect(ui->throwaway, &QPushButton::clicked, [this, events]() { + EventsModel::Status s = events->get_status_at(video->position()); + if (s.attack_state == EventsModel::Status::DEFENSE && s.pull_state == EventsModel::Status::PULL_IN_AIR) { + insert_noplayer_event("pull_oob"); + } else { + set_current_event_type("throwaway"); + } + }); connect(ui->drop, &QPushButton::clicked, [this]() { set_current_event_type("drop"); }); connect(ui->goal, &QPushButton::clicked, [this]() { set_current_event_type("goal"); }); connect(ui->offensive_soft_plus, &QPushButton::clicked, [this]() { set_current_event_type("offensive_soft_plus"); }); connect(ui->offensive_soft_minus, &QPushButton::clicked, [this]() { set_current_event_type("offensive_soft_minus"); }); - connect(ui->pull, &QPushButton::clicked, [this]() { set_current_event_type("pull"); }); - connect(ui->pull_landed, &QPushButton::clicked, [this]() { insert_noplayer_event("pull_landed"); }); + connect(ui->pull, &QPushButton::clicked, [this, events]() { + EventsModel::Status s = events->get_status_at(video->position()); + if (s.pull_state == EventsModel::Status::SHOULD_PULL) { + set_current_event_type("pull"); + } else if (EventsModel::Status::PULL_IN_AIR) { + insert_noplayer_event("pull_landed"); + } + }); // Defensive events (TODO add more) connect(ui->defense_label, &ClickableLabel::clicked, [this]() { insert_noplayer_event("set_defense"); }); connect(ui->their_throwaway, &QPushButton::clicked, [this]() { insert_noplayer_event("their_throwaway"); }); connect(ui->their_goal, &QPushButton::clicked, [this]() { insert_noplayer_event("their_goal"); }); - connect(ui->their_pull, &QPushButton::clicked, [this]() { insert_noplayer_event("their_pull"); }); + connect(ui->their_pull, &QPushButton::clicked, [this, events]() { + EventsModel::Status s = events->get_status_at(video->position()); + if (s.pull_state == EventsModel::Status::SHOULD_PULL) { + insert_noplayer_event("their_pull"); + } + }); connect(ui->our_defense, &QPushButton::clicked, [this]() { set_current_event_type("defense"); }); connect(ui->defensive_soft_plus, &QPushButton::clicked, [this]() { set_current_event_type("defensive_soft_plus"); }); connect(ui->defensive_soft_minus, &QPushButton::clicked, [this]() { set_current_event_type("defensive_soft_minus"); }); @@ -312,7 +330,6 @@ void MainWindow::update_action_buttons(uint64_t t) ui->offensive_soft_plus->setEnabled(false); ui->offensive_soft_minus->setEnabled(false); ui->pull->setEnabled(false); - ui->pull_landed->setEnabled(false); ui->interception->setEnabled(false); ui->their_throwaway->setEnabled(false); ui->our_defense->setEnabled(false); @@ -327,16 +344,70 @@ void MainWindow::update_action_buttons(uint64_t t) 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); + ui->our_foul->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); + ui->our_foul->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); - - // TODO: be stricter - ui->pull->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && s.pull_state == EventsModel::Status::SHOULD_PULL && has_selection_with_player); - ui->pull_landed->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && 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); @@ -344,8 +415,8 @@ void MainWindow::update_action_buttons(uint64_t t) 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(s.attack_state == EventsModel::Status::OFFENSE && s.pull_state == EventsModel::Status::SHOULD_PULL); ui->our_foul->setEnabled(s.attack_state == EventsModel::Status::DEFENSE && has_selection_with_player); + ui->their_pull->setEnabled(false); } sqlite3 *open_db(const char *filename) diff --git a/mainwindow.ui b/mainwindow.ui index 142c1a6..24fffb3 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -246,9 +246,12 @@ - + + + false + - Pull landed (&p) + -- 2.39.2