--- /dev/null
+#include "fetch_group.h"
+
+FetchGroup::FetchGroup(unsigned tournament, unsigned round, unsigned parallel, Group *group) :
+ tournament(tournament), round(round), parallel(parallel), dest_group(group) {}
+
+void FetchGroup::operator() (pqxx::transaction<> &t)
+{
+ pqxx::result res( t.exec("SELECT round,parallel,position,playmode,difficulty,songnumber,player,nick,song,title,artist,chosen,score FROM roundparticipation NATURAL JOIN players NATURAL JOIN scores NATURAL LEFT JOIN songs WHERE " +
+ "tournament=" + pqxx::to_string(tournament) + " AND " +
+ "round=" + pqxx::to_string(round) + " AND " +
+ "parallel=" + pqxx::to_string(parallel) + " " +
+ "ORDER BY position,songnumber") );
+
+ curr_group.tournament = tournament;
+ curr_group.round = round;
+ curr_group.parallel = parallel;
+
+ // massage the data we get back into a Group object and children
+ int curr_player = -1;
+ for (pqxx::result::const_iterator i = res.begin(); i != res.end(); ++i) {
+ if (i["player"] != curr_player) {
+ Player p;
+
+ p.id = i["player"];
+ p.nick = i["nick"].as(p.nick);
+ p.total = 0;
+ p.rank = 1;
+ curr_group.players.push_back(p);
+
+ curr_player = i["player"];
+ }
+
+ // note: we _will_ get some duplication here (multiple identical Song
+ // objects), but it isn't the end of the world
+ Score sc;
+ Song so;
+
+ so.id = i["song"].as(so.id);
+ so.title = i["song"].as(so.title);
+ so.artist = i["song"].as(so.artist);
+
+ sc.song = so;
+ sc.chosen = i["chosen"].as(s.chosen);
+ sc.score = i["score"].as(s.score);
+
+ curr_group.players[curr.group.players.size() - 1].scores.push_back(sc);
+ }
+}
+
+void FetchGroup::OnCommit()
+{
+ *dest_group = curr_group;
+}
--- /dev/null
+#ifndef _FETCH_GROUP_H
+#define _FETCH_GROUP_H 1
+
+#include <pqxx/transactor>
+#include "group.h"
+
+/* A transactor that fetches a group, all its scores etc. */
+class FetchGroup : public pqxx::transactor<> {
+private:
+ unsigned tournament, round, parallel;
+ Group *dest_group;
+ Group curr_group;
+
+public:
+ FetchGroup(unsigned tournament, unsigned round, unsigned parallel, Group *group);
+ void operator() (pqxx::transaction<> &t);
+ void OnCommit();
+};
+
+#endif /* !defined(_FETCH_CURRENT_TOURNAMENT_H) */
--- /dev/null
+#ifndef _GROUP_H
+#define _GROUP_H 1
+
+#include <vector>
+#include "widestring.h"
+
+/* This more or less mimics the structures from show-tournament.pl */
+struct Song {
+ unsigned id;
+ widestring title, artist;
+};
+struct Score {
+ Song song;
+ bool chosen;
+ unsigned score;
+}:
+struct Player {
+ unsigned id;
+ widestring nick;
+ unsigned score, rank;
+
+ std::vector<Score> scores;
+};
+
+struct Group {
+ unsigned tournament, round, parallel;
+ std::vector<Player> players;
+};
+
+#endif /* !defined(_GROUPSCREEN_H) */
--- /dev/null
+#ifndef _GROUPSCREEN_H
+#define _GROUPSCREEN_H 1
+
+#include "flagtrigger.h"
+#include "group.h"
+
+/* A screen class showing a group in the tournament */
+class GroupScreen : public Screen {
+private:
+ unsigned tournament;
+ FlagTrigger scores_changed;
+
+
+public:
+ Screen(unsigned tournament);
+
+ bool check_invalidated();
+ void draw(unsigned char *buf);
+};
+
+#endif /* !defined(_GROUPSCREEN_H) */