From aa1104c9fca5a25ecf881dc034804d63f57bf9ef Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 3 May 2023 18:54:51 +0200 Subject: [PATCH] Make a more sensible ordering of the player buttons. --- events.cpp | 15 +++++++++++++-- events.h | 2 ++ main.cpp | 7 +++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/events.cpp b/events.cpp index 24fd649..cb552c5 100644 --- a/events.cpp +++ b/events.cpp @@ -60,13 +60,14 @@ void EventsModel::load_data() 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) { @@ -75,6 +76,7 @@ void EventsModel::load_data() 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 { @@ -390,3 +392,12 @@ void EventsModel::set_team_at(uint64_t t, const set &new_team) } } } + +vector EventsModel::sort_team(const set &team) const +{ + vector 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; +} diff --git a/events.h b/events.h index 9804836..3dd6959 100644 --- a/events.h +++ b/events.h @@ -47,6 +47,7 @@ public: Status get_status_at(uint64_t t); std::set get_team_at(uint64_t t); void set_team_at(uint64_t, const std::set &new_team); + std::vector sort_team(const std::set &team) const; // Ordered first by gender, then by number. private: struct Player { @@ -55,6 +56,7 @@ private: std::string name; }; std::map players; + std::map player_ordering; // From id to position. struct Event { int event_id; diff --git a/main.cpp b/main.cpp index d9e6058..a89e478 100644 --- a/main.cpp +++ b/main.cpp @@ -185,11 +185,11 @@ void MainWindow::seek(int64_t delta_ms) void MainWindow::insert_event(int button_id) { uint64_t t = video->position(); - set team = events->get_team_at(t); + vector 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); @@ -281,7 +281,6 @@ void MainWindow::update_status(uint64_t 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, @@ -293,7 +292,7 @@ void MainWindow::update_player_buttons(uint64_t t) }; 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] = ""; -- 2.39.2