X-Git-Url: https://git.sesse.net/?p=ccbs;a=blobdiff_plain;f=bigscreen%2Fgroupscreen.cpp;h=227260979d96d9291f6eba010aee8b9fef072978;hp=c5c902099f4ed36806c172d87f26dbbea5550748;hb=7d34d0b7a3c0af58545180d7a18e026e5403ba5d;hpb=233b56b4ea7820602ee5cba8a717930348400bf6 diff --git a/bigscreen/groupscreen.cpp b/bigscreen/groupscreen.cpp index c5c9020..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]; @@ -57,6 +63,84 @@ void GroupScreen::draw_main_heading(std::vector &td) my_draw_text_deferred(td, heading, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60); } +// make column headings from the first player's songs +void GroupScreen::draw_column_headings(std::vector &td, const Group &group, const std::vector &colwidth) +{ + unsigned num_scores = group.players[0].scores.size(); + + unsigned col = 1; + unsigned x = 40 + colwidth[0]; + for (std::vector::const_iterator i = group.players[0].scores.begin(); i != group.players[0].scores.end(); ++i, ++col) { + if (!i->chosen) { + unsigned this_width = my_draw_text(i->song.short_title, NULL, 12.0); + my_draw_text_deferred(td, i->song.short_title, 12.0, x + colwidth[col] / 2 - this_width / 2, 100); + } + x += colwidth[col] + 20; + } + + my_draw_text_deferred(td, "Total", 12.0, x + colwidth[num_scores + 1] / 2 - my_draw_text("Total", 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 &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. * long titles for everything); if that gets too long, try again with short @@ -157,80 +241,11 @@ 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(); - // make column headings from the first player's songs - unsigned col = 1; - unsigned x = 40 + colwidth[0]; - for (std::vector::const_iterator i = group.players[0].scores.begin(); i != group.players[0].scores.end(); ++i, ++col) { - if (!i->chosen) { - unsigned this_width = my_draw_text(i->song.short_title, NULL, 12.0); - my_draw_text_deferred(td, i->song.short_title, 12.0, x + colwidth[col] / 2 - this_width / 2, 100); - } - x += colwidth[col] + 20; - } - - my_draw_text_deferred(td, "Total", 12.0, x + colwidth[num_scores + 1] / 2 - my_draw_text("Total", 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 - 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; - 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); - - unsigned 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: @@ -255,7 +270,7 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height) std::vector max_score, min_score; for (std::vector::const_iterator i = group.players.begin(); i != group.players.end(); ++i) { unsigned min_score_tp = 0, max_score_tp = 0; - for (std::vector::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j, ++col) { + for (std::vector::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j) { if (j->score != -1) { // already given min_score_tp += j->score; @@ -276,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) { @@ -298,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); @@ -329,10 +350,10 @@ 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, ++col) { + for (std::vector::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j) { if (j->score != -1) ++this_played; if (!j->chosen)