]> git.sesse.net Git - ccbs/blobdiff - bigscreen/groupscreen.cpp
Fetch all the "max score for song" entries in one go instead of one at a time.
[ccbs] / bigscreen / groupscreen.cpp
index 2b541203aa9d3dd02f57255905f89cab82c44f38..fbdcc5ed89aac1ea9e44fe3ad7159b53e81b5936 100644 (file)
@@ -1,9 +1,10 @@
 #include <cstdio>
 #include <algorithm>
+#include <map>
 
 #include "groupscreen.h"
 #include "fetch_group.h"
-#include "fetch_max_score_for_song.h"
+#include "fetch_max_score_for_songs.h"
 #include "fetch_max_score_for_player.h"
 #include "fetch_needs_update.h"
 #include "fetch_highscore.h"
@@ -40,6 +41,13 @@ void GroupScreen::draw(unsigned char *buf)
        
        scores_changed.reset_flag();
 
+       /*
+        * We'll probably need some values from here later on (although not all), just fetch them
+        * all while we're at it.
+        */
+       std::map<unsigned, unsigned> song_scores;
+       conn.perform(FetchMaxScoreForSongs(tournament, &song_scores));
+       
        Group group;
        conn.perform(FetchGroup(tournament, round, parallel, &group));
        gettimeofday(&last_updated, NULL);
@@ -135,8 +143,11 @@ void GroupScreen::draw(unsigned char *buf)
        my_draw_text_deferred(td, "Rank", 12.0, x + width[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100);
        
        // show all the players and the scores
-       unsigned y = 140;
-       for (std::vector<Player>::const_iterator i = group.players.begin(); i != group.players.end(); ++i) {
+       unsigned show_players = std::min(group.players.size(), 9U);
+       unsigned y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
+       
+       unsigned row = 0;
+       for (std::vector<Player>::const_iterator i = group.players.begin(); i != group.players.end() && row < 9; ++i, ++row) {
                my_draw_text_deferred(td, i->nick, 18.0, 20, y);
 
                unsigned x = 40 + width[0];
@@ -174,7 +185,10 @@ void GroupScreen::draw(unsigned char *buf)
                        x += width[num_scores + 1] + 20;
                }
 
-               y += 40;
+               if (show_players > 7)
+                       y += 40 - (show_players - 7) * 4;
+               else 
+                       y += 40;
        }
        
        /*
@@ -212,7 +226,7 @@ void GroupScreen::draw(unsigned char *buf)
                                unsigned max_score_this_song;
                                if (j->song.id != -1) {
                                        // random song, or we know what song the player picked
-                                       conn.perform(FetchMaxScoreForSong(tournament, j->song.id, &max_score_this_song));
+                                       max_score_this_song = song_scores[j->song.id];
                                } else {
                                        conn.perform(FetchMaxScoreForPlayer(tournament, i->id, round, &max_score_this_song));
                                }
@@ -224,8 +238,8 @@ void GroupScreen::draw(unsigned char *buf)
        }
 
        // now finally find min and max rank, and draw it all
-       y = 140;
-       for (unsigned i = 0; i < group.players.size(); ++i) {
+       y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
+       for (unsigned i = 0; i < show_players; ++i) {
                unsigned best_rank = 1, worst_rank = 1;
                for (unsigned j = 0; j < group.players.size(); ++j) {
                        if (i == j)
@@ -246,7 +260,10 @@ void GroupScreen::draw(unsigned char *buf)
                unsigned this_width = my_draw_text(text, NULL, 22.0);
                my_draw_text_deferred(td, text, 22.0, x + width[num_scores + 2] / 2 - this_width / 2, y);
 
-               y += 40;
+               if (show_players > 7)
+                       y += 40 - (show_players - 7) * 4;
+               else 
+                       y += 40;
        }
                
        /*
@@ -341,7 +358,7 @@ void GroupScreen::draw(unsigned char *buf)
                        unsigned max_score_this_song;
                        if (next_song->song.id != -1) {
                                // random song, or we know what song the player picked
-                               conn.perform(FetchMaxScoreForSong(tournament, next_song->song.id, &max_score_this_song));
+                               max_score_this_song = song_scores[next_song->song.id];
                        } else {
                                conn.perform(FetchMaxScoreForPlayer(tournament, next_player->id, round, &max_score_this_song));
                        }