321005c049fdd67341d2904e31d8a9aa09f353b8
[ccbs] / bigscreen / top5chosenscreen.cpp
1 #include <cstdio>
2 #include <algorithm>
3
4 #include "resolution.h"
5 #include "top5chosenscreen.h"
6 #include "fonts.h"
7
8 Top5ChosenScreen::Top5ChosenScreen(pqxx::connection &conn, unsigned tournament)
9         : conn(conn), tournament(tournament), scores_changed(conn, "scores"), valid(false)
10 {
11 }
12
13 Top5ChosenScreen::~Top5ChosenScreen()
14 {
15 }
16
17 bool Top5ChosenScreen::check_invalidated()
18 {
19         if (!valid)
20                 return true;
21         if (!scores_changed.get_flag())
22                 return false;
23
24         // check that there are indeed changes, otherwise don't bother
25         std::vector<TopChosen> scores;
26         conn.perform(FetchTopChosenSongsForTournament(tournament, 5, &scores));
27
28         for (std::vector<TopChosen>::const_iterator i = scores.begin(); i != scores.end(); ++i) {
29                 if (seen_topchosen.count(*i) == 0) {
30                         return true;
31                 }       
32         }
33         
34         return false;
35 }
36
37 void Top5ChosenScreen::draw(unsigned char *buf)
38 {
39         scores_changed.reset_flag();
40         memset(buf, 0, SCREEN_WIDTH * SCREEN_HEIGHT * 4);
41
42         // fetch the top 5 chosen songs
43         std::vector<TopChosen> scores;
44         conn.perform(FetchTopChosenSongsForTournament(tournament, 5, &scores));
45
46         {
47                 unsigned width = my_draw_text("Today's top 5 chosen songs", NULL, 40.0);
48                 my_draw_text("Today's top 5 chosen songs", buf, 40.0, SCREEN_WIDTH/2 - width/2, 60);
49         }
50
51         // simple headings
52         my_draw_text("Song", buf, 12.0, 70, 100);
53         my_draw_text("Frequency", buf, 12.0, 710, 100);
54         
55         unsigned row = 1, y = 140;
56         for (std::vector<TopChosen>::const_iterator i = scores.begin(); i != scores.end(); ++i) {
57                 char str[16];
58                 unsigned r = 255, g = 255, b = 255;
59
60                 // print new entries in red
61                 if (seen_topchosen.count(*i) == 0 && seen_topchosen.size() > 0) {
62                         g = b = 0;
63                 }
64
65                 std::sprintf(str, "%u", row++);
66                 unsigned width = my_draw_text(str, NULL, 24.0);
67                 my_draw_text(str, buf, 24.0, 30 - width/2, y);
68
69                 if (my_draw_text(i->title, NULL, 24.0) > 610) {
70                         my_draw_text(i->shorttitle, buf, 24.0, 70, y, r, g, b);
71                 } else {
72                         my_draw_text(i->title, buf, 24.0, 70, y, r, g, b);
73                 }
74                 
75                 std::sprintf(str, "%u", i->frequency);
76                 width = my_draw_text(str, NULL, 24.0);
77                 my_draw_text(str, buf, 24.0, 745 - width/2, y, r, g, b);
78
79                 y += 40;
80         }
81         
82         valid = true;
83         
84         seen_topchosen.erase(seen_topchosen.begin(), seen_topchosen.end());
85         std::copy(scores.begin(), scores.end(), std::inserter(seen_topchosen, seen_topchosen.end()));
86 }
87