players.clear();
events.clear();
- // Read the players.
+ // Read the players. (The ordering is used to build the order map.)
sqlite3_stmt *stmt;
- int ret = sqlite3_prepare_v2(db, "SELECT player, number, name FROM player", -1, &stmt, 0);
+ int ret = sqlite3_prepare_v2(db, "SELECT player, number, name FROM player ORDER BY gender, (number+0), number", -1, &stmt, 0);
if (ret != SQLITE_OK) {
fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
abort();
}
+ int order = 0;
for ( ;; ) {
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
p.number = (const char *)sqlite3_column_text(stmt, 1);
p.name = (const char *) sqlite3_column_text(stmt, 2);
players[p.player_id] = std::move(p);
+ player_ordering[p.player_id] = order++;
} else if (ret == SQLITE_DONE) {
break;
} else {
}
}
}
+
+vector<int> EventsModel::sort_team(const set<int> &team) const
+{
+ vector<int> ret(team.begin(), team.end());
+ std::sort(ret.begin(), ret.end(), [this](int a, int b) {
+ return player_ordering.find(a)->second < player_ordering.find(b)->second;
+ });
+ return ret;
+}
Status get_status_at(uint64_t t);
std::set<int> get_team_at(uint64_t t);
void set_team_at(uint64_t, const std::set<int> &new_team);
+ std::vector<int> sort_team(const std::set<int> &team) const; // Ordered first by gender, then by number.
private:
struct Player {
std::string name;
};
std::map<int, Player> players;
+ std::map<int, int> player_ordering; // From id to position.
struct Event {
int event_id;
void MainWindow::insert_event(int button_id)
{
uint64_t t = video->position();
- set<int> team = events->get_team_at(t);
+ vector<int> team = events->sort_team(events->get_team_at(t));
if (button_id > team.size()) {
return;
}
- int player_id = *next(team.begin(), button_id - 1);
+ int player_id = team[button_id - 1];
EventsModel::Status s = events->get_status_at(t);
void MainWindow::update_player_buttons(uint64_t t)
{
- // FIXME: sort by number, instead of by internal ID
QPushButton *buttons[] = {
ui->player_1,
ui->player_2,
};
const char shortcuts[] = "qweasdf";
int num_players = 0;
- for (int player_id : events->get_team_at(t)) {
+ 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] = "";