]> git.sesse.net Git - ccbs/commitdiff
More refactoring.
authorSteinar H. Gunderson <sesse@samfundet.no>
Fri, 4 Mar 2005 23:36:54 +0000 (23:36 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Fri, 4 Mar 2005 23:36:54 +0000 (23:36 +0000)
bigscreen/groupscreen.cpp
bigscreen/groupscreen.h

index 4b108f56784187a4b9e72409bbb43afecf3c6e0a..227260979d96d9291f6eba010aee8b9fef072978 100644 (file)
@@ -36,6 +36,12 @@ bool GroupScreen::check_invalidated()
        return needs_update;
 }
 
        return needs_update;
 }
 
+unsigned GroupScreen::get_show_players(const Group &group)
+{
+       unsigned num_players_this_machine = (group.players.size() + num_machines - machine - 1) / num_machines;
+       return std::min(num_players_this_machine, 9U);
+}
+
 void GroupScreen::draw_main_heading(std::vector<TextDefer> &td)
 {
        char heading[64];
 void GroupScreen::draw_main_heading(std::vector<TextDefer> &td)
 {
        char heading[64];
@@ -76,6 +82,64 @@ void GroupScreen::draw_column_headings(std::vector<TextDefer> &td, const Group &
        x += colwidth[num_scores + 1] + 20;
        my_draw_text_deferred(td, "Rank", 12.0, x + colwidth[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100);
 }      
        x += colwidth[num_scores + 1] + 20;
        my_draw_text_deferred(td, "Rank", 12.0, x + colwidth[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100);
 }      
+       
+// show all the players and the scores
+void GroupScreen::draw_scores(std::vector<TextDefer> &td, const Group &group, const std::vector<unsigned> &colwidth)
+{
+       unsigned max_num_width = my_draw_text("8888", NULL, 22.0);
+       unsigned num_scores = group.players[0].scores.size();
+       unsigned show_players = get_show_players(group);
+       unsigned y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
+       
+       unsigned row = 0, m = 0, x;
+       for (std::vector<Player>::const_iterator i = group.players.begin(); i != group.players.end() && row < 9; ++i) {
+               if (m++ % num_machines != machine)
+                       continue;
+
+               my_draw_text_deferred(td, i->nick, 18.0, 20, y);
+
+               x = 40 + colwidth[0];
+
+               unsigned col = 1;
+               for (std::vector<Score>::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j, ++col) {
+                       char text[16] = "";
+                       if (j->score != -1) {
+                               std::sprintf(text, "%u", j->score);
+                       }
+       
+                       unsigned this_width = my_draw_text(text, NULL, 22.0);
+                       if (j->chosen) {
+                               my_draw_text_deferred(td, text, 22.0, x + max_num_width - this_width, y);
+
+                               // draw the long name if we can, otherwise use the short one
+                               if (my_draw_text(j->song.title, NULL, 12.0) > (colwidth[col] - 10 - max_num_width)) {
+                                       my_draw_text_deferred(td, j->song.short_title, 12.0, x + max_num_width + 10, y);
+                               } else {
+                                       my_draw_text_deferred(td, j->song.title, 12.0, x + max_num_width + 10, y);
+                               }
+                       } else {
+                               my_draw_text_deferred(td, text, 22.0, x + colwidth[col] / 2 - this_width / 2, y);
+                       }
+                       x += colwidth[col] + 20;
+               }
+
+               // draw total
+               {
+                       char text[16];
+                       std::sprintf(text, "%u", i->total);
+                       
+                       unsigned this_width = my_draw_text(text, NULL, 22.0);
+                       my_draw_text_deferred(td, text, 22.0, x + colwidth[num_scores + 1] / 2 - this_width / 2, y);
+                       x += colwidth[num_scores + 1] + 20;
+               }
+
+               if (show_players > 7)
+                       y += 40 - (show_players - 7) * 4;
+               else 
+                       y += 40;
+               ++row;
+       }
+}      
 
 /*
  * Find out how wide each column has to be. First try unlimited width (ie.
 
 /*
  * Find out how wide each column has to be. First try unlimited width (ie.
@@ -178,65 +242,10 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height)
        draw_main_heading(td);
        find_column_widths(group, colwidth);
        draw_column_headings(td, group, colwidth);
        draw_main_heading(td);
        find_column_widths(group, colwidth);
        draw_column_headings(td, group, colwidth);
+       draw_scores(td, group, colwidth);
        
        
-       unsigned max_num_width = my_draw_text("8888", NULL, 22.0);
        unsigned num_scores = group.players[0].scores.size();
 
        unsigned num_scores = group.players[0].scores.size();
 
-       // show all the players and the scores
-       unsigned num_players_this_machine = (group.players.size() + num_machines - machine - 1) / num_machines;
-       unsigned show_players = std::min(num_players_this_machine, 9U);
-       unsigned y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
-       
-       unsigned row = 0, m = 0, x;
-       for (std::vector<Player>::const_iterator i = group.players.begin(); i != group.players.end() && row < 9; ++i) {
-               if (m++ % num_machines != machine)
-                       continue;
-
-               my_draw_text_deferred(td, i->nick, 18.0, 20, y);
-
-               x = 40 + colwidth[0];
-
-               unsigned col = 1;
-               for (std::vector<Score>::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j, ++col) {
-                       char text[16] = "";
-                       if (j->score != -1) {
-                               std::sprintf(text, "%u", j->score);
-                       }
-       
-                       unsigned this_width = my_draw_text(text, NULL, 22.0);
-                       if (j->chosen) {
-                               my_draw_text_deferred(td, text, 22.0, x + max_num_width - this_width, y);
-
-                               // draw the long name if we can, otherwise use the short one
-                               if (my_draw_text(j->song.title, NULL, 12.0) > (colwidth[col] - 10 - max_num_width)) {
-                                       my_draw_text_deferred(td, j->song.short_title, 12.0, x + max_num_width + 10, y);
-                               } else {
-                                       my_draw_text_deferred(td, j->song.title, 12.0, x + max_num_width + 10, y);
-                               }
-                       } else {
-                               my_draw_text_deferred(td, text, 22.0, x + colwidth[col] / 2 - this_width / 2, y);
-                       }
-                       x += colwidth[col] + 20;
-               }
-
-               // draw total
-               {
-                       char text[16];
-                       std::sprintf(text, "%u", i->total);
-                       
-                       unsigned this_width = my_draw_text(text, NULL, 22.0);
-                       my_draw_text_deferred(td, text, 22.0, x + colwidth[num_scores + 1] / 2 - this_width / 2, y);
-                       x += colwidth[num_scores + 1] + 20;
-               }
-
-               if (show_players > 7)
-                       y += 40 - (show_players - 7) * 4;
-               else 
-                       y += 40;
-               ++row;
-               
-       }
-       
        /*
         * Approximate (but probably working quite well in practice) heuristic
         * for finding the min and max rank of a player works as follows:
        /*
         * Approximate (but probably working quite well in practice) heuristic
         * for finding the min and max rank of a player works as follows:
@@ -282,7 +291,8 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height)
        }
 
        // now finally find min and max rank, and draw it all
        }
 
        // now finally find min and max rank, and draw it all
-       y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
+       unsigned show_players = get_show_players(group);
+       unsigned y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5);
        for (unsigned i = 0; i < group.players.size() && (i/num_machines) < show_players; ++i) {
                unsigned best_rank = 1, worst_rank = 1;
                for (unsigned j = 0; j < group.players.size(); ++j) {
        for (unsigned i = 0; i < group.players.size() && (i/num_machines) < show_players; ++i) {
                unsigned best_rank = 1, worst_rank = 1;
                for (unsigned j = 0; j < group.players.size(); ++j) {
@@ -304,6 +314,11 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height)
                if (i % num_machines != machine)
                        continue;
                
                if (i % num_machines != machine)
                        continue;
                
+               // find out where to place this
+               unsigned x = 40 + colwidth[0];
+               for (unsigned j = 1; j <= num_scores + 1; ++j)
+                       x += colwidth[j] + 20;
+               
                unsigned this_width = my_draw_text(text, NULL, 22.0);
                my_draw_text_deferred(td, text, 22.0, x + colwidth[num_scores + 2] / 2 - this_width / 2, y);
 
                unsigned this_width = my_draw_text(text, NULL, 22.0);
                my_draw_text_deferred(td, text, 22.0, x + colwidth[num_scores + 2] / 2 - this_width / 2, y);
 
@@ -335,7 +350,7 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height)
        /* Find the first player with the fewest songs played and part of this machine. */
        unsigned min_played_songs = 9999, num_random_songs = 0;
        Player *next_player = NULL;
        /* Find the first player with the fewest songs played and part of this machine. */
        unsigned min_played_songs = 9999, num_random_songs = 0;
        Player *next_player = NULL;
-       m = 0;
+       unsigned m = 0;
        for (std::vector<Player>::iterator i = group.players.begin(); i != group.players.end(); ++i) {
                unsigned this_played = 0, this_random_songs = 0;
                for (std::vector<Score>::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j) {
        for (std::vector<Player>::iterator i = group.players.begin(); i != group.players.end(); ++i) {
                unsigned this_played = 0, this_random_songs = 0;
                for (std::vector<Score>::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j) {
index b88debec24381e01b54c6218d6de2486f2c29b0f..38ab516dbabb3d1aaf2e3146137395de30ff31b8 100644 (file)
@@ -21,8 +21,10 @@ private:
        struct timeval last_updated;
        std::vector<TextDefer> last_text;
 
        struct timeval last_updated;
        std::vector<TextDefer> last_text;
 
+       unsigned get_show_players(const Group &group);
        void draw_main_heading(std::vector<TextDefer> &td);
        void draw_column_headings(std::vector<TextDefer> &td, const Group &group, const std::vector<unsigned> &colwidth);
        void draw_main_heading(std::vector<TextDefer> &td);
        void draw_column_headings(std::vector<TextDefer> &td, const Group &group, const std::vector<unsigned> &colwidth);
+       void draw_scores(std::vector<TextDefer> &td, const Group &group, const std::vector<unsigned> &colwidth);
        void find_column_widths(const Group &group, std::vector<unsigned> &colwidth);
        
 public:
        void find_column_widths(const Group &group, std::vector<unsigned> &colwidth);
        
 public: