]> git.sesse.net Git - pkanalytics/commitdiff
Make a more sensible ordering of the player buttons.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 3 May 2023 16:54:51 +0000 (18:54 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 3 May 2023 16:54:51 +0000 (18:54 +0200)
events.cpp
events.h
main.cpp

index 24fd649e7f3adfeaea19f41a27e393858ba1df99..cb552c571bcd7cba8bf42b8540ff404c1568802b 100644 (file)
@@ -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<int> &new_team)
                }
        }
 }
+
+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;
+}
index 9804836aaabde417e07ac69fb4d4c52924276e04..3dd69594908e8d0f5c2671421aa97f67c9fdcf3e 100644 (file)
--- a/events.h
+++ b/events.h
@@ -47,6 +47,7 @@ public:
        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 {
@@ -55,6 +56,7 @@ private:
                std::string name;
        };
        std::map<int, Player> players;
+       std::map<int, int> player_ordering;  // From id to position.
 
        struct Event {
                int event_id;
index d9e605894ddee0f5d3a91934ff6df5a308b2cfce..a89e4785acd17404f8c0825a640c50759248d5dd 100644 (file)
--- 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<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);
 
@@ -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] = "";