From c09350b7c9adf6327f0a0475c897a71dd23b6cae Mon Sep 17 00:00:00 2001 From: Orangerot Date: Thu, 15 Aug 2024 21:24:28 +0200 Subject: feat(SportModel): request API, parse and display Model --- res/gui/EventsPage.qml | 5 ++-- src/main/main.cpp | 5 ++++ src/model/Sport.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++- src/model/Sport.h | 26 +++++++++++++++++-- 4 files changed, 99 insertions(+), 5 deletions(-) diff --git a/res/gui/EventsPage.qml b/res/gui/EventsPage.qml index 772418e..5e4adf3 100644 --- a/res/gui/EventsPage.qml +++ b/res/gui/EventsPage.qml @@ -19,9 +19,10 @@ Page { bottomMargin: 48 rightMargin: 48 spacing: 20 - model: ["Albert Einstein", "Ernest Hemingway", "Hans Gude"] + model: sports delegate: ItemDelegate { - text: modelData + required property string sportName + text: sportName width: listView.width - listView.leftMargin - listView.rightMargin height: avatar.implicitHeight + 32 leftPadding: avatar.implicitWidth + 32 diff --git a/src/main/main.cpp b/src/main/main.cpp index cee893e..9f175ac 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -20,6 +20,7 @@ // console output #include // #include +#include "../model/Sport.h" int main(int argc, char *argv[]) { @@ -28,6 +29,10 @@ int main(int argc, char *argv[]) QQmlEngine engine; QQmlContext *objectContext = new QQmlContext(engine.rootContext()); + SportModel model; + model.request(); + objectContext->setContextProperty("sports", &model); + QQmlComponent component(&engine, "qrc:/qt/qml/itat/res/gui/application.qml"); QObject *object = component.create(objectContext); diff --git a/src/model/Sport.cpp b/src/model/Sport.cpp index 21b9b9f..38173ce 100644 --- a/src/model/Sport.cpp +++ b/src/model/Sport.cpp @@ -1,7 +1,9 @@ - #include "Sport.h" // categories +#include +#include +#include #include // sorting and filtering @@ -18,6 +20,70 @@ #include #include +namespace { + const QString &k_requestUrl = "https://sph-s-api.olympics.com/summer/schedules/api/ENG/schedule/discipline/ARC"; +} + +SportModel::SportModel(QObject *parent) : QAbstractListModel(parent) { +} + +int SportModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent); + return m_sportList.size(); +} + +QVariant SportModel::data(const QModelIndex &index, int role) const { + if (index.isValid() && index.row() >= 0 && index.row() < m_sportList.size()) { + QString sportName = m_sportList[index.row()]; + + return sportName; + // switch ((Role) role) { + // case SportName: + // } + } + + return {}; +} + + +QHash SportModel::roleNames() const { + QHash names; + names[SportName] = "sportName"; + + return names; +} + +void SportModel::request() { + m_reply = m_networkManager.get(QNetworkRequest( k_requestUrl )); + qDebug() << m_reply; + connect(m_reply, &QNetworkReply::finished, this, &SportModel::parseData); +} + +void SportModel::parseData() { + + if (m_reply->error() == QNetworkReply::NoError) { + beginResetModel(); + // qDeleteAll(m_sportList); + // m_sportList.clear(); + + + + QByteArray strReply = m_reply->readAll(); + + //parse json + // qDebug() << "Response:" << strReply; + QJsonDocument jsonDocument = QJsonDocument::fromJson(strReply); + + QJsonArray sports = jsonDocument["units"].toArray(); + for (const auto &sport : sports) { + QJsonObject entry = sport.toObject(); + qDebug() << entry["eventUnitName"].toString(); + m_sportList << entry["eventUnitName"].toString(); + } + endResetModel(); + } +} + // QJsonArray filter function, provide with input array and evaluation function QJsonArray filter(QJsonArray input, function eval) { QJsonArray output; diff --git a/src/model/Sport.h b/src/model/Sport.h index 147f6e8..0f183b7 100644 --- a/src/model/Sport.h +++ b/src/model/Sport.h @@ -1,8 +1,8 @@ - #ifndef ITAT_CHALLANGE_OLYMPICS_SPORT_H #define ITAT_CHALLANGE_OLYMPICS_SPORT_H - +#include +#include #include #include @@ -11,6 +11,28 @@ using namespace std; +class SportModel : public QAbstractListModel { + Q_OBJECT + + public: + enum Role { + SportName = Qt::UserRole + 1 + }; + + 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 roleNames() const override; + public slots: + void request(); + void parseData(); + + private: + QList m_sportList; + QNetworkAccessManager m_networkManager; + QNetworkReply *m_reply = nullptr; +}; class Sport { -- cgit v1.2.3