summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/main/main.cpp2
-rw-r--r--src/model/Sport.h127
-rw-r--r--src/model/SportModel.cpp (renamed from src/model/Sport.cpp)86
-rw-r--r--src/model/SportModel.h88
5 files changed, 135 insertions, 172 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c30ba17..af81cc4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,8 +31,8 @@ qt_add_qml_module(itat_challenge_olympics
src/model/FilterModel.h
src/model/MedalWinner.cpp
src/model/MedalWinner.h
- src/model/Sport.cpp
- src/model/Sport.h
+ src/model/SportModel.cpp
+ src/model/SportModel.h
RESOURCES
res/pictograms/ARC_small.svg
diff --git a/src/main/main.cpp b/src/main/main.cpp
index 27a4800..a01a188 100644
--- a/src/main/main.cpp
+++ b/src/main/main.cpp
@@ -20,8 +20,8 @@
// console output
#include <QDebug>
// #include <iostream>
-#include "../model/Sport.h"
#include "../model/FilterModel.h"
+#include "../model/SportModel.h"
int main(int argc, char *argv[])
{
diff --git a/src/model/Sport.h b/src/model/Sport.h
index c5d1c66..e69de29 100644
--- a/src/model/Sport.h
+++ b/src/model/Sport.h
@@ -1,127 +0,0 @@
-#pragma once
-
-#include "MedalWinner.h"
-#include "CompetitorWithResults.h"
-#include <QAbstractListModel>
-#include <QNetworkAccessManager>
-#include <qcontainerfwd.h>
-#include <set>
-
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QString>
-#include <QList>
-#include "EventInfo.h"
-
-using namespace std;
-
-class SportModel : public QAbstractListModel
-{
- Q_OBJECT
-
- Q_PROPERTY(QString discipline READ discipline WRITE setDiscipline NOTIFY disciplineChanged);
-
-public:
- enum Role
- {
- EventName = Qt::UserRole + 1,
- Competitors
- };
-
- explicit SportModel(QObject *parent = nullptr);
-
- virtual int rowCount(const QModelIndex &parent) const override;
- virtual QVariant data(const QModelIndex &index, int role) const override;
- virtual QHash<int, QByteArray> roleNames() const override;
-
- QString discipline() const;
- void setDiscipline(const QString &discipline);
-public slots:
- void request(QString discipline);
- void parseData();
-
- signals:
- void disciplineChanged();
-
- private:
- QList<EventInfo*> m_sportList;
- QString m_discipline;
- QNetworkAccessManager m_networkManager;
- QNetworkReply *m_reply = nullptr;
-};
-
-class Sport
-{
-
-public:
- Sport(QJsonObject discipline)
- {
- this->discipline = discipline;
- }
-
- set<QString> getCategories();
- QList<CompetitorWithResults> getCompetitorsByCategory(QString category);
- QList<MedalWinner> getCompetitorsWithMedal();
-
- // filter to change the current competitor array
- void lastName(QList<Competitor> &competitors);
- void filterByName(QList<Competitor> &competitors, QString name);
- void filterByCountry(QList<Competitor> &competitors, QString nocShort);
-
- // sort functions to change the order of the current competitor array
- void sortByName(QList<Competitor> &competitors);
- void sortByCountry(QList<Competitor> &competitors);
- void sortByResult(QList<CompetitorWithResults> &competitors);
- void sortByMedals(QList<MedalWinner> &competitors);
- void reverseOrder(QList<Competitor> &competitors);
-
- // statistic function(s)
- void addRelativeToFirst(QList<CompetitorWithResults> &competitors);
-
- void setDiscipline(QJsonObject discipline)
- {
- this->discipline = QJsonObject(discipline);
- }
-
-private:
- /*
- * Analysis of provided competitor objects:
- *
- * Attributes:
- * - code
- * - noc (national olympics comittee)
- * - name (sometimes the country name? mostly the competitors name)
- * - order
- * [- results] (only if the results are out!)
- *
- *
- * Analysis of provided result objects:
- *
- * Attributes:
- * - position
- * - mark
- * - medalType
- * - irk
- * [- winnerLoserTie] (only if provided in the discipline?)
- *
- * Analysis of where to find the medal winners:
- *
- * Search for ... in category name.
- * - "Bronze"
- * - "Gold"
- * - "Final"
- *
- * ! ATTENTION !
- * When searching for "Final" there might be "Final A", "Final B", etc.
- * The results will only be in ONE of these categories!
- * -> which is good... cause then we can count occurences.
- */
- QJsonObject discipline;
-
- void filterCompetitors(QList<Competitor> &competitors, QString filter);
-
- bool validateDiscipline();
- QJsonObject createCompetitorWithMedals(QJsonObject medalComp);
-
- float calcRelativeStat(QString ref, QString val);
-};
diff --git a/src/model/Sport.cpp b/src/model/SportModel.cpp
index 86ecd7c..be9d326 100644
--- a/src/model/Sport.cpp
+++ b/src/model/SportModel.cpp
@@ -1,4 +1,4 @@
-#include "Sport.h"
+#include "SportModel.h"
#include "Competitor.h"
// categories
@@ -128,13 +128,13 @@ QJsonArray filter(QJsonArray input, function<bool (QJsonObject)> eval) {
* @brief Sport::lastName Reduce the full name to the part that is marked in capital letters (probably last name).
* @param competitors The competitors of one category.
*/
-void Sport::lastName(QList<Competitor> &competitors) {
+void SportModel::lastName(QList<Competitor*> &competitors) {
// validate competitors
if (competitors.isEmpty()) return;
for (int i = 0; i < competitors.size(); i++) {
- Competitor comp = competitors.value(i);
- string fullName = comp.getName().toUtf8().constData();
+ Competitor* comp = competitors.value(i);
+ string fullName = comp->getName().toUtf8().constData();
// regex to identify names, written in CAPS
regex r("[A-Z']{2,}");
@@ -150,7 +150,7 @@ void Sport::lastName(QList<Competitor> &competitors) {
QString name = QString(lastName.substr(0, lastName.size() - 1).c_str());
// replace competitor name in list
- comp.setName(name);
+ comp->setName(name);
}
}
@@ -158,21 +158,21 @@ void Sport::lastName(QList<Competitor> &competitors) {
* @brief Sport::validateDiscipline Validates the discipline object. Checks for the units attribute.
* @return True, if discipline contains units.
*/
-bool Sport::validateDiscipline() {
- return this->discipline.contains("units");
+bool SportModel::validateDiscipline() {
+ return this->o_discipline.contains("units");
}
/**
* @brief Sport::getCategories Reads all possible categories (also called units).
* @return A set of all category names.
*/
-set<QString> Sport::getCategories() {
+set<QString> SportModel::getCategories() {
set<QString> categoryNames;
if (!validateDiscipline()) return categoryNames;
// search in each unit for the category (named "eventUnitName")
- for (const QJsonValueRef &unitRef : this->discipline["units"].toArray()) {
+ for (const QJsonValueRef &unitRef : this->o_discipline["units"].toArray()) {
QJsonObject unit = unitRef.toObject();
// validate unit
@@ -189,12 +189,12 @@ set<QString> Sport::getCategories() {
* @param category The category to search in.
* @return An QJsonArray with all competitors as QJsonValueRef, which can be casted to QJsonObject.
*/
-QList<CompetitorWithResults> Sport::getCompetitorsByCategory(QString category) {
- QList<CompetitorWithResults> competitors;
+QList<CompetitorWithResults*> SportModel::getCompetitorsByCategory(QString category) {
+ QList<CompetitorWithResults*> competitors;
if (!validateDiscipline()) return competitors;
- for (const QJsonValueRef &unitRef : this->discipline["units"].toArray()) {
+ for (const QJsonValueRef &unitRef : this->o_discipline["units"].toArray()) {
QJsonObject unit = unitRef.toObject();
// validate unit
@@ -205,8 +205,8 @@ QList<CompetitorWithResults> Sport::getCompetitorsByCategory(QString category) {
// add all competitors from one unit
for (const QJsonValueRef &compRef : unit["competitors"].toArray()) {
- CompetitorWithResults comp = new CompetitorWithResults(); // TODO declare comp
- comp.setCompetitorWithResults(compRef.toObject());
+ CompetitorWithResults *comp = new CompetitorWithResults(); // TODO declare comp
+ comp->setCompetitorWithResults(compRef.toObject());
competitors.push_back(comp);
}
}
@@ -218,13 +218,13 @@ QList<CompetitorWithResults> Sport::getCompetitorsByCategory(QString category) {
* @brief Sport::getCompetitorsWithMedal Filters all competitors, who have at least one medal. These objects are different from getCompetitorsByCategory !!!
* @return All competitors, who won at least one medal. Structure of one competitor: {code, name, m_noc, medals{ME_GOLD, ME_SILVER, ME_BRONZE}}
*/
-QList<MedalWinner> Sport::getCompetitorsWithMedal() {
+QList<MedalWinner*> SportModel::getCompetitorsWithMedal() {
map<QString, QJsonObject> competitors;
- if (!validateDiscipline()) return QList<MedalWinner>();
+ if (!validateDiscipline()) return QList<MedalWinner*>();
// filter all units, which have medal events
- QJsonArray units = filter(this->discipline["units"].toArray(), [](QJsonObject unit){
+ QJsonArray units = filter(this->o_discipline["units"].toArray(), [](QJsonObject unit){
// search all units with Final, Gold or Bronze in their name, because these are the categories with the medal winners
QString unitName = unit["eventUnitName"].toString();
return unitName.contains("Bronze", Qt::CaseSensitive)
@@ -275,10 +275,10 @@ QList<MedalWinner> Sport::getCompetitorsWithMedal() {
}
// convert map to QJsonArray
- QList<MedalWinner> output;
+ QList<MedalWinner*> output;
for (const pair<QString, QJsonObject> &competitor : competitors) {
- MedalWinner comp = new MedalWinner(); // TODO declare comp
- comp.setMedalWinner(competitor.second);
+ MedalWinner *comp = new MedalWinner(); // TODO declare comp
+ comp->setMedalWinner(competitor.second);
output.append(comp);
}
@@ -290,7 +290,7 @@ QList<MedalWinner> Sport::getCompetitorsWithMedal() {
* @param comp The original competitor object.
* @return A competitor object with medal counts.
*/
-QJsonObject Sport::createCompetitorWithMedals(QJsonObject comp) {
+QJsonObject SportModel::createCompetitorWithMedals(QJsonObject comp) {
// repair competitor if something is missing
if (!comp.contains("code")) comp.insert("code", "0");
if (!comp.contains("name")) comp.insert("code", "");
@@ -318,7 +318,7 @@ QJsonObject Sport::createCompetitorWithMedals(QJsonObject comp) {
* @param competitors The competitors of one category.
* @param name The (part of the) name to search for.
*/
-void Sport::filterByName(QList<Competitor> &competitors, QString name) {
+void SportModel::filterByName(QList<Competitor*> &competitors, QString name) {
filterCompetitors(competitors, name);
}
@@ -327,7 +327,7 @@ void Sport::filterByName(QList<Competitor> &competitors, QString name) {
* @param competitors The competitors of one category.
* @param nocShort The (part of the) national olympics comittee short name to search for.
*/
-void Sport::filterByCountry(QList<Competitor> &competitors, QString nocShort) {
+void SportModel::filterByCountry(QList<Competitor*> &competitors, QString nocShort) {
filterCompetitors(competitors, nocShort);
}
@@ -337,9 +337,9 @@ void Sport::filterByCountry(QList<Competitor> &competitors, QString nocShort) {
* @param attribute The attribute to filter by.
* @param filter The string, which should be contained.
*/
-void Sport::filterCompetitors(QList<Competitor> &competitors, QString filter) {
+void SportModel::filterCompetitors(QList<Competitor*> &competitors, QString filter) {
for (int i = 0; i < competitors.size(); i++) {
- if (!competitors.value(i).getNOC().contains(filter)) {
+ if (!competitors.value(i)->getNOC().contains(filter)) {
competitors.remove(i);
i--;
}
@@ -350,48 +350,48 @@ void Sport::filterCompetitors(QList<Competitor> &competitors, QString filter) {
* @brief Sport::sortByName Sort the competitors by their name (alphabetical, ascending).
* @param competitors The competitors of one category.
*/
-void Sport::sortByName(QList<Competitor> &competitors) {
+void SportModel::sortByName(QList<Competitor*> &competitors) {
if (competitors.isEmpty()) return;
- sort(competitors.begin(), competitors.end(), Competitor::compareName);
+ std::sort(competitors.begin(), competitors.end(), Competitor::compareName);
}
/**
* @brief Sport::sortByCountry Sort the competitors by their national olympic comittee short name (alphabetical, ascending).
* @param competitors The competitors of one category.
*/
-void Sport::sortByCountry(QList<Competitor> &competitors) {
+void SportModel::sortByCountry(QList<Competitor*> &competitors) {
if (competitors.isEmpty()) return;
- sort(competitors.begin(), competitors.end(), Competitor::compareNOC);
+ std::sort(competitors.begin(), competitors.end(), Competitor::compareNOC);
}
/**
* @brief Sport::sortByResult Sort the competitors by their results in one specific category (numerical, ascending).
* @param competitors The competitors of one category.
*/
-void Sport::sortByResult(QList<CompetitorWithResults> &competitors) {
+void SportModel::sortByResult(QList<CompetitorWithResults*> &competitors) {
if (competitors.isEmpty()) return;
- sort(competitors.begin(), competitors.end(), CompetitorWithResults::compare);
+ std::sort(competitors.begin(), competitors.end(), CompetitorWithResults::compare);
}
/**
* @brief Sport::sortByMedals Sort the competitors by their medal amounts in one specific category (numerical, ascending).
* @param competitors The competitors of one category.
*/
-void Sport::sortByMedals(QList<MedalWinner> &competitors) {
+void SportModel::sortByMedals(QList<MedalWinner*> &competitors) {
if (competitors.isEmpty()) return;
- sort(competitors.begin(), competitors.end(), MedalWinner::compare);
+ std::sort(competitors.begin(), competitors.end(), MedalWinner::compare);
}
/**
* @brief Sport::reverseOrder Reverses the order of the competitors.
* @param competitors The competitors of one category.
*/
-void Sport::reverseOrder(QList<Competitor> &competitors) {
+void SportModel::reverseOrder(QList<Competitor*> &competitors) {
int iterations = competitors.size() / 2; // automatically rounds down
for (int i = 0; i < iterations; i++) {
- Competitor left = Competitor(competitors.value(i));
- Competitor right = Competitor(competitors.value(competitors.size() - 1 - i));
+ Competitor *left = competitors.value(i);
+ Competitor *right = competitors.value(competitors.size() - 1 - i);
competitors.replace(i, right);
competitors.replace(competitors.size() - 1 - i, left);
@@ -403,13 +403,15 @@ void Sport::reverseOrder(QList<Competitor> &competitors) {
* Stores the m_statistic in obj->results->stat for each competitor.
* @param competitors The competitors of one category.
*/
-void Sport::addRelativeToFirst(QList<CompetitorWithResults> &competitors) {
+void SportModel::addRelativeToFirst(QList<CompetitorWithResults*> &competitors) {
if (competitors.isEmpty()) return;
- QString reference = competitors.value(0).getMark();
+ QString reference = competitors.value(0)->getMark();
- for (CompetitorWithResults comp : competitors) {
- QString result = comp.getMark();
+ for (int i = 0; i < competitors.size(); i++) {
+ CompetitorWithResults *comp = competitors.value(i);
+
+ QString result = comp->getMark();
// format relative float value to string with 2 digits after decimal point and sign
stringstream sstream;
@@ -418,7 +420,7 @@ void Sport::addRelativeToFirst(QList<CompetitorWithResults> &competitors) {
stat.append("%");
if (stat.at(0).isNumber()) stat = QString("+").append(stat);
- comp.setStatistic(stat);
+ comp->setStatistic(stat);
}
}
@@ -429,7 +431,7 @@ void Sport::addRelativeToFirst(QList<CompetitorWithResults> &competitors) {
* @param val The value to calculate the deviation from.
* @return The deviation from ref to val in percent.
*/
-float Sport::calcRelativeStat(QString ref, QString val) {
+float SportModel::calcRelativeStat(QString ref, QString val) {
// check if the value is not a time
if (!ref.contains(":") && !val.contains(":")) {
float fRef = ref.toFloat();
diff --git a/src/model/SportModel.h b/src/model/SportModel.h
new file mode 100644
index 0000000..5ad289c
--- /dev/null
+++ b/src/model/SportModel.h
@@ -0,0 +1,88 @@
+#pragma once
+
+#include "MedalWinner.h"
+#include "CompetitorWithResults.h"
+#include <QAbstractListModel>
+#include <QNetworkAccessManager>
+#include <qcontainerfwd.h>
+#include <set>
+
+#include <QJsonObject>
+#include <QJsonDocument>
+#include <QString>
+#include <QList>
+#include "EventInfo.h"
+
+using namespace std;
+
+class SportModel : public QAbstractListModel
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QString discipline READ discipline WRITE setDiscipline NOTIFY disciplineChanged);
+
+public:
+ enum Role
+ {
+ EventName = Qt::UserRole + 1,
+ Competitors
+ };
+
+ explicit SportModel(QObject *parent = nullptr);
+
+ void setDiscipline(QJsonObject discipline)
+ {
+ this->o_discipline = QJsonObject(discipline);
+ }
+
+ virtual int rowCount(const QModelIndex &parent) const override;
+ virtual QVariant data(const QModelIndex &index, int role) const override;
+ virtual QHash<int, QByteArray> roleNames() const override;
+
+ set<QString> getCategories();
+ QList<CompetitorWithResults*> getCompetitorsByCategory(QString category); // TODO ref instead of obj
+ QList<MedalWinner*> getCompetitorsWithMedal(); // TODO ref instead of obj
+
+ // filter to change the current competitor list
+ void lastName(QList<Competitor*> &competitors); // TODO ref instead of obj
+ void filterByName(QList<Competitor*> &competitors, QString name); // TODO ref instead of obj
+ void filterByCountry(QList<Competitor*> &competitors, QString nocShort); // TODO ref instead of obj
+
+ // sort functions to change the order of the current competitor list
+ void sortByName(QList<Competitor*> &competitors); // TODO ref instead of obj
+ void sortByCountry(QList<Competitor*> &competitors); // TODO ref instead of obj
+ void sortByResult(QList<CompetitorWithResults*> &competitors); // TODO ref instead of obj
+ void sortByMedals(QList<MedalWinner*> &competitors); // TODO ref instead of obj
+ void reverseOrder(QList<Competitor*> &competitors); // TODO ref instead of obj
+
+ // statistic function
+ void addRelativeToFirst(QList<CompetitorWithResults*> &competitors); // TODO ref instead of obj
+
+ QString discipline() const;
+ void setDiscipline(const QString &discipline);
+
+public slots:
+ void request(QString discipline);
+ void parseData();
+
+signals:
+ void disciplineChanged();
+
+private:
+ QList<EventInfo *> m_sportList;
+ QString m_discipline;
+ QNetworkAccessManager m_networkManager;
+ QNetworkReply *m_reply = nullptr;
+
+ // data from api
+ QJsonObject o_discipline;
+ bool validateDiscipline();
+
+ void filterCompetitors(QList<Competitor*> &competitors, QString filter); // TODO ref instead of obj
+
+ QJsonObject createCompetitorWithMedals(QJsonObject medalComp);
+
+ // function for statistic calculation
+ float calcRelativeStat(QString ref, QString val);
+
+};