From 7d34d0b7a3c0af58545180d7a18e026e5403ba5d Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 4 Mar 2005 23:36:54 +0000 Subject: [PATCH] More refactoring. --- bigscreen/groupscreen.cpp | 131 +++++++++++++++++++++----------------- bigscreen/groupscreen.h | 2 + 2 files changed, 75 insertions(+), 58 deletions(-) diff --git a/bigscreen/groupscreen.cpp b/bigscreen/groupscreen.cpp index 4b108f5..2272609 100644 --- a/bigscreen/groupscreen.cpp +++ b/bigscreen/groupscreen.cpp @@ -36,6 +36,12 @@ bool GroupScreen::check_invalidated() 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 &td) { char heading[64]; @@ -76,6 +82,64 @@ void GroupScreen::draw_column_headings(std::vector &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); } + +// show all the players and the scores +void GroupScreen::draw_scores(std::vector &td, const Group &group, const std::vector &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::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::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. @@ -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_scores(td, group, colwidth); - unsigned max_num_width = my_draw_text("8888", NULL, 22.0); 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::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::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: @@ -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 - 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) { @@ -304,6 +314,11 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height) 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); @@ -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; - m = 0; + unsigned m = 0; for (std::vector::iterator i = group.players.begin(); i != group.players.end(); ++i) { unsigned this_played = 0, this_random_songs = 0; for (std::vector::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j) { diff --git a/bigscreen/groupscreen.h b/bigscreen/groupscreen.h index b88debe..38ab516 100644 --- a/bigscreen/groupscreen.h +++ b/bigscreen/groupscreen.h @@ -21,8 +21,10 @@ private: struct timeval last_updated; std::vector last_text; + unsigned get_show_players(const Group &group); void draw_main_heading(std::vector &td); void draw_column_headings(std::vector &td, const Group &group, const std::vector &colwidth); + void draw_scores(std::vector &td, const Group &group, const std::vector &colwidth); void find_column_widths(const Group &group, std::vector &colwidth); public: -- 2.39.2