string format_timestamp(uint64_t pos);
+static string event_type_to_string(EventType type)
+{
+ switch (type) {
+ case EventType::CATCH:
+ return "catch";
+ case EventType::DEFENSE:
+ return "defense";
+ case EventType::DEFENSIVE_SOFT_MINUS:
+ return "defensive_soft_minus";
+ case EventType::DEFENSIVE_SOFT_PLUS:
+ return "defensive_soft_plus";
+ case EventType::FORMATION_DEFENSE:
+ return "formation_defense";
+ case EventType::FORMATION_OFFENSE:
+ return "formation_offense";
+ case EventType::DROP:
+ return "drop";
+ case EventType::GOAL:
+ return "goal";
+ case EventType::IN:
+ return "in";
+ case EventType::INTERCEPTION:
+ return "interception";
+ case EventType::OFFENSIVE_SOFT_MINUS:
+ return "offensive_soft_minus";
+ case EventType::OFFENSIVE_SOFT_PLUS:
+ return "offensive_soft_plus";
+ case EventType::OUT:
+ return "out";
+ case EventType::PULL:
+ return "pull";
+ case EventType::PULL_LANDED:
+ return "pull_landed";
+ case EventType::PULL_OOB:
+ return "pull_oob";
+ case EventType::RESTART:
+ return "restart";
+ case EventType::SET_DEFENSE:
+ return "set_defense";
+ case EventType::SET_OFFENSE:
+ return "set_offense";
+ case EventType::STALLOUT:
+ return "stallout";
+ case EventType::STOPPAGE:
+ return "stoppage";
+ case EventType::THEIR_GOAL:
+ return "their_goal";
+ case EventType::THEIR_PULL:
+ return "their_pull";
+ case EventType::THEIR_THROWAWAY:
+ return "their_throwaway";
+ case EventType::THROWAWAY:
+ return "throwaway";
+ case EventType::UNKNOWN:
+ return "unknown";
+ case EventType::WAS_D:
+ return "was_d";
+ }
+ abort();
+}
+
+static EventType string_to_event_type(const string &type)
+{
+ if (type == "catch") {
+ return EventType::CATCH;
+ } else if (type == "defense") {
+ return EventType::DEFENSE;
+ } else if (type == "defensive_soft_minus") {
+ return EventType::DEFENSIVE_SOFT_MINUS;
+ } else if (type == "defensive_soft_plus") {
+ return EventType::DEFENSIVE_SOFT_PLUS;
+ } else if (type == "formation_defense") {
+ return EventType::FORMATION_DEFENSE;
+ } else if (type == "formation_offense") {
+ return EventType::FORMATION_OFFENSE;
+ } else if (type == "drop") {
+ return EventType::DROP;
+ } else if (type == "goal") {
+ return EventType::GOAL;
+ } else if (type == "in") {
+ return EventType::IN;
+ } else if (type == "interception") {
+ return EventType::INTERCEPTION;
+ } else if (type == "offensive_soft_minus") {
+ return EventType::OFFENSIVE_SOFT_MINUS;
+ } else if (type == "offensive_soft_plus") {
+ return EventType::OFFENSIVE_SOFT_PLUS;
+ } else if (type == "out") {
+ return EventType::OUT;
+ } else if (type == "pull") {
+ return EventType::PULL;
+ } else if (type == "pull_landed") {
+ return EventType::PULL_LANDED;
+ } else if (type == "pull_oob") {
+ return EventType::PULL_OOB;
+ } else if (type == "restart") {
+ return EventType::RESTART;
+ } else if (type == "set_defense") {
+ return EventType::SET_DEFENSE;
+ } else if (type == "set_offense") {
+ return EventType::SET_OFFENSE;
+ } else if (type == "stallout") {
+ return EventType::STALLOUT;
+ } else if (type == "stoppage") {
+ return EventType::STOPPAGE;
+ } else if (type == "their_goal") {
+ return EventType::THEIR_GOAL;
+ } else if (type == "their_pull") {
+ return EventType::THEIR_PULL;
+ } else if (type == "their_throwaway") {
+ return EventType::THEIR_THROWAWAY;
+ } else if (type == "throwaway") {
+ return EventType::THROWAWAY;
+ } else if (type == "unknown") {
+ return EventType::UNKNOWN;
+ } else if (type == "was_d") {
+ return EventType::WAS_D;
+ } else {
+ fprintf(stderr, "Unknown event type ā%sā\n", type.c_str());
+ exit(1);
+ }
+}
+
EventsModel::EventsModel(sqlite3 *db, int match_id) : db(db), match_id(match_id)
{
load_data();
auto f_it = formations.find(*formation_id);
const Formation &f = f_it->second;
return QString::fromUtf8(f.name);
- } else if (e.type == "formation_offense" || e.type == "formation_defense") {
+ } else if (e.type == EventType::FORMATION_OFFENSE || e.type == EventType::FORMATION_DEFENSE) {
return "(None/unknown)";
} else {
return QVariant();
}
} else if (index.column() == 2) {
- string type = e.type;
- type[0] = toupper(e.type[0]);
+ string type = event_type_to_string(e.type);
+ type[0] = toupper(type[0]);
for (char &ch : type) {
if (ch == '_') {
ch = ' ';
if (sqlite3_column_type(stmt, 3) == SQLITE_INTEGER) { // Non-NULL.
e.formation_id = sqlite3_column_int(stmt, 3);
}
- e.type = (const char *)sqlite3_column_text(stmt, 4);
+ e.type = string_to_event_type((const char *)sqlite3_column_text(stmt, 4));
events.push_back(std::move(e));
} else if (ret == SQLITE_DONE) {
break;
e.t = t;
e.player_id = player_id;
e.formation_id = formation_id;
- e.type = type;
+ e.type = string_to_event_type(type);
events.insert(events.begin() + pos, e);
endInsertRows();
void EventsModel::set_event_type(unsigned pos, const string &type)
{
- events[pos].type = type;
+ events[pos].type = string_to_event_type(type);
emit dataChanged(createIndex(pos, 0), createIndex(pos, 2));
sqlite3_stmt *stmt;
break;
}
- if (e.type == "goal" || e.type == "their_goal") {
+ if (e.type == EventType::GOAL || e.type == EventType::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" || e.type == "set_defense" || e.type == "set_offense") {
+ } else if (e.type == EventType::IN || e.type == EventType::OUT || e.type == EventType::STOPPAGE || e.type == EventType::RESTART || e.type == EventType::UNKNOWN || e.type == EventType::SET_DEFENSE || e.type == EventType::SET_OFFENSE) {
// No effect on pull status.
- } else if (e.type == "pull") {
+ } else if (e.type == EventType::PULL) {
s.pull_state = Status::PULL_IN_AIR;
} else {
s.pull_state = Status::NOT_PULLING; // Includes pull_landed and pull_oob.
}
- if (e.type == "set_offense") {
+ if (e.type == EventType::SET_OFFENSE) {
set_offense();
- } else if (e.type == "set_defense") {
+ } else if (e.type == EventType::SET_DEFENSE) {
set_defense();
}
- if (e.type == "goal") {
+ if (e.type == EventType::GOAL) {
++s.our_score;
set_defense();
num_touches = 0;
}
- if (e.type == "their_goal") {
+ if (e.type == EventType::THEIR_GOAL) {
++s.their_score;
set_offense();
num_touches = 0;
}
- if (e.type == "catch") {
+ if (e.type == EventType::CATCH) {
if (num_touches == 0) { // Pick up.
last_gained_possession = e.t;
time_spent_in_stoppage = 0;
}
++num_touches;
}
- if (e.type == "interception") {
+ if (e.type == EventType::INTERCEPTION) {
num_touches = 1;
set_offense();
last_gained_possession = e.t;
time_spent_in_stoppage = 0;
}
- if (e.type == "defense" || e.type == "their_throwaway") {
+ if (e.type == EventType::DEFENSE || e.type == EventType::THEIR_THROWAWAY) {
set_offense();
num_touches = 0;
time_spent_in_stoppage = 0;
}
- if (e.type == "drop" || e.type == "was_d" || e.type == "throwaway" || e.type == "stallout") {
+ if (e.type == EventType::DROP || e.type == EventType::WAS_D || e.type == EventType::THROWAWAY || e.type == EventType::STALLOUT) {
set_defense();
num_touches = 0;
}
- if (e.type == "stoppage") {
+ if (e.type == EventType::STOPPAGE) {
s.stoppage = true;
last_stoppage = e.t;
}
- if (e.type == "restart") {
+ if (e.type == EventType::RESTART) {
s.stoppage = false;
if (last_stoppage != 0) {
time_spent_in_stoppage += (e.t - last_stoppage);
last_stoppage = 0;
}
}
- if (e.type == "formation_offense") {
+ if (e.type == EventType::FORMATION_OFFENSE) {
if (e.formation_id) {
s.offensive_formation = *e.formation_id;
} else {
s.offensive_formation = 0;
}
}
- if (e.type == "formation_defense") {
+ if (e.type == EventType::FORMATION_DEFENSE) {
if (e.formation_id) {
s.defensive_formation = *e.formation_id;
} else {
if (e.t > t) {
break;
}
- if (e.type == "in") {
+ if (e.type == EventType::IN) {
team.insert(*e.player_id);
}
- if (e.type == "out") {
+ if (e.type == EventType::OUT) {
team.erase(*e.player_id);
}
}
if (e.t > t) {
break;
}
- if (e.type == "goal" || e.type == "their_goal" || e.type == "stoppage" || e.type == "reset" || e.type == "set_offense" || e.type == "set_defense") {
+ if (e.type == EventType::GOAL || e.type == EventType::THEIR_GOAL || e.type == EventType::STOPPAGE || e.type == EventType::SET_OFFENSE || e.type == EventType::SET_DEFENSE) {
backdate_point = e.t + 1;
}
if (e.player_id.has_value() && !new_team.count(*e.player_id)) {
if (events[i].t > backdate_point) {
break;
}
- if (events[i].t == backdate_point && (events[i].type == "in" || events[i].type == "out")) {
+ if (events[i].t == backdate_point && (events[i].type == EventType::IN || events[i].type == EventType::OUT)) {
delete_event(i);
} else {
++i;
if (e.t > t) {
break;
}
- if (e.type == "goal" || e.type == "their_goal" ||
- e.type == "in" || e.type == "out" ||
- e.type == "stoppage" || e.type == "reset" ||
- e.type == "set_defense" || e.type == "set_offense" ||
- e.type == "throwaway" || e.type == "their_throwaway" ||
- e.type == "drop" || e.type == "was_d" || e.type == "defense" || e.type == "interception" || e.type == "stallout" ||
- e.type == "pull" || e.type == "pull_landed" || e.type == "pull_oob" || e.type == "their_pull" ||
- e.type == "formation_offense" || e.type == "formation_defense") {
+ if (e.type == EventType::GOAL || e.type == EventType::THEIR_GOAL ||
+ e.type == EventType::IN || e.type == EventType::OUT ||
+ e.type == EventType::STOPPAGE ||
+ e.type == EventType::SET_DEFENSE || e.type == EventType::SET_OFFENSE ||
+ e.type == EventType::THROWAWAY || e.type == EventType::THEIR_THROWAWAY ||
+ e.type == EventType::DROP || e.type == EventType::WAS_D || e.type == EventType::DEFENSE || e.type == EventType::INTERCEPTION || e.type == EventType::STALLOUT ||
+ e.type == EventType::PULL || e.type == EventType::PULL_LANDED || e.type == EventType::PULL_OOB || e.type == EventType::THEIR_PULL ||
+ e.type == EventType::FORMATION_OFFENSE || e.type == EventType::FORMATION_DEFENSE) {
backdate_point = e.t + 1;
}
- if (e.type == "formation_offense" || e.type == "formation_defense") {
+ if (e.type == EventType::FORMATION_OFFENSE || e.type == EventType::FORMATION_DEFENSE) {
backdate_point = 0;
}
}