From 0f62b52f6ed1aad335d60f9ce1e2851e7abcddc9 Mon Sep 17 00:00:00 2001 From: dorian Date: Sat, 11 May 2019 15:16:23 +0200 Subject: [PATCH] - finished up some minor details - fixed bigs - improved pull to refresh functionality --- headers/serverconn.h | 8 - resources/qml/Components/DataListView.qml | 32 +- .../qml/Components/FancyBusyIndicator.qml | 56 +--- resources/qml/Components/PullRefresher.qml | 313 ++++++++++++++++++ resources/qml/Components/RankingView.qml | 14 + resources/qml/Components/RegistrationView.qml | 21 +- resources/qml/Components/ResultView.qml | 21 +- resources/qml/Components/StartlistView.qml | 15 + .../qml/Pages/CompetitionCalendarPage.qml | 44 ++- resources/qml/Pages/RankingPage.qml | 24 +- resources/qml/main.qml | 8 +- resources/qml/qml.qrc | 1 + resources/shared/Banner.png | Bin 0 -> 33671 bytes resources/shared/Banner.xcf | Bin 0 -> 64450 bytes sources/serverconn.cpp | 23 +- 15 files changed, 460 insertions(+), 120 deletions(-) create mode 100644 resources/qml/Components/PullRefresher.qml create mode 100644 resources/shared/Banner.png create mode 100644 resources/shared/Banner.xcf diff --git a/headers/serverconn.h b/headers/serverconn.h index 2c69943..8008a9f 100644 --- a/headers/serverconn.h +++ b/headers/serverconn.h @@ -10,27 +10,19 @@ class ServerConn : public QObject { Q_OBJECT - Q_PROPERTY(QVariant foodplan READ getFoodplan NOTIFY foodplanChanged) public: explicit ServerConn(QObject *parent = nullptr); private: QVariantMap senddata(QUrl serviceUrl, QUrlQuery pdata = QUrlQuery()); - // variables - QVariant foodplan; - signals: - void foodplanChanged(); public slots: - void refreshFoodplan(); QVariant getCalendar(QString nation, int year); QVariant getRanking(int competitionId, int categoryId, bool registrationData = false, bool rankingData = false, const int routeNumber = -2); - // functions for qml - QVariant getFoodplan(); }; #endif // SERVERCONN_H diff --git a/resources/qml/Components/DataListView.qml b/resources/qml/Components/DataListView.qml index 8fff3a3..bc512f3 100644 --- a/resources/qml/Components/DataListView.qml +++ b/resources/qml/Components/DataListView.qml @@ -5,16 +5,17 @@ ListView { id: control property int status: -1 + property bool loading: false signal refresh() anchors.margins: 10 anchors.rightMargin: 14 + clip: true - enabled: status === 200 || status === 902 - opacity: enabled ? 1:0 - + //enabled: status === 200 || status === 902 + //opacity: enabled ? 1:0 ScrollBar.vertical: ScrollBar { parent: control.parent @@ -34,12 +35,7 @@ ListView { active: true } - onContentYChanged: { - if(contentY < -control.height * 0.3 && control.status !== 905){ - contentY = 0 - control.refresh() - } - } + Behavior on opacity { NumberAnimation { @@ -47,12 +43,6 @@ ListView { } } - Behavior on contentY { - NumberAnimation { - duration: 200 - } - } - InfoArea { id: infoArea @@ -67,4 +57,16 @@ ListView { excludedCodes: [200, 902, 905] errorCode: control.status } + + PullRefresher { + target: control + + postRefreshDelay: 0 + + busyIndicator: FancyBusyIndicator {} + + onRefreshRequested: { + control.refresh() + } + } } diff --git a/resources/qml/Components/FancyBusyIndicator.qml b/resources/qml/Components/FancyBusyIndicator.qml index 32d8421..ba6631f 100644 --- a/resources/qml/Components/FancyBusyIndicator.qml +++ b/resources/qml/Components/FancyBusyIndicator.qml @@ -5,7 +5,10 @@ import QtQuick.Controls.Styles 1.2 BusyIndicator { id: control - property double animationSpeed: 0.5 + property double animationSpeed: 1000 + property double formFactor: 4.5 + + property color lineColor: "#21be2b" contentItem: Item { implicitWidth: 64 @@ -14,54 +17,20 @@ BusyIndicator { Item { id: item - x: parent.width / 2 - 32 - y: parent.height / 2 - 32 - - width: 64 - height: 64 - - opacity: control.running ? 1 : 0 + anchors.fill: parent property int currentHeight: 0 - onCurrentHeightChanged: { - } - - Behavior on opacity { - OpacityAnimator { - duration: 250 - } - } - SequentialAnimation { + running: control.running loops: Animation.Infinite - running: true - NumberAnimation { target: item - - duration: 2000 * 1/control.animationSpeed - - to: 1000 - - properties: "currentHeight" - - easing.type: Easing.InOutQuad - - } - - NumberAnimation { - target: item - - duration: 2000 * 1/control.animationSpeed - - to: 0 - - properties: "currentHeight" - - easing.type: Easing.InOutQuad - + property: "currentHeight" + from: 0 + to: 800 + duration: control.animationSpeed } } @@ -77,7 +46,7 @@ BusyIndicator { Rectangle { - property double heightMultiplier: Math.abs( Math.sin(( (item.currentHeight + (index*20))*0.01) * (Math.PI/2) ) ) + property double heightMultiplier: Math.abs( Math.sin( ( ((item.currentHeight/100) + (index*(control.formFactor/repeater.model)))) * (Math.PI/8) ) ) anchors.verticalCenter: parent.verticalCenter @@ -86,7 +55,8 @@ BusyIndicator { radius: width * 0.5 - color: "#21be2b" + color: control.lineColor + } } } diff --git a/resources/qml/Components/PullRefresher.qml b/resources/qml/Components/PullRefresher.qml new file mode 100644 index 0000000..9a70dfb --- /dev/null +++ b/resources/qml/Components/PullRefresher.qml @@ -0,0 +1,313 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.4 +import QtGraphicalEffects 1.0 + +Item { + id: control + + state: "idle" + + property var target // targeted ListView + + property bool autoConfigureTarget: true // should the target be automaticaly be configured? + + property int postRefreshDelay: 1000 // delay after reload funcion has finished + property int preRefreshDelay: 1000 // delay before reload funcion is called + + property int refreshPosition: height * 1.2 // position of the item when refreshing + property int dragOutPosition: height * 2 // position of the item when starting to refresh + + property color backgroundColor: "white" // color for the pre-defined background + property color pullIndicatorColor: "black" // color for the pre-defined pull indicator + //property color busyIndicatorColor: "pink" // color for the pre-defined busy indicator + + readonly property double dragProgress: Math.min( userPosition / dragOutPosition, 1) + + property Component background: Item { + RectangularGlow { + anchors.fill: backgroundRe + + scale: 0.8 * backgroundRe.scale + cornerRadius: backgroundRe.radius + color: "black" + + glowRadius: 0.001 + spread: 0.2 + } + + Rectangle { + id: backgroundRe + + anchors.fill: parent + + radius: width * 0.5 + color: control.backgroundColor + } + } + property Component busyIndicator: BusyIndicator { running: true } + property Component pullIndicator: Canvas { + + property double drawProgress: control.dragProgress + + onDrawProgressChanged: { + requestPaint() + } + + onPaint: { + var ctx = getContext("2d"); + + var topMargin = height * 0.1 + var bottomMargin = topMargin + var rightMargin = 0 + var leftMargin = 0 + + var arrowHeight = height - topMargin - bottomMargin + + var peakHeight = arrowHeight * 0.35 + var peakWidth = peakHeight + + var lineWidth = 2 + + var progress = drawProgress + + // modify all values to math the progress + + arrowHeight = arrowHeight * progress + if(progress > 0.3){ + peakHeight = peakHeight * (progress - 0.3) * 1/0.7 + peakWidth = peakWidth * (progress - 0.3) * 1/0.7 + } + else { + peakHeight = 0 + peakWidth = 0 + } + + // clear canvas + ctx.reset() + + ctx.lineWidth = lineWidth; + ctx.strokeStyle = control.pullIndicatorColor; + + // middle line + ctx.moveTo(width/2, topMargin); + ctx.lineTo(width/2, arrowHeight + topMargin); + + // right line + ctx.moveTo(width/2 - lineWidth * 0.3, arrowHeight + topMargin); + ctx.lineTo(width/2 + peakWidth,arrowHeight + topMargin - peakHeight); + // left line + ctx.moveTo(width/2 + lineWidth * 0.3, arrowHeight + topMargin); + ctx.lineTo(width/2 - peakWidth,arrowHeight + topMargin - peakHeight); + + ctx.stroke(); + } + } + + signal refreshRequested + + // internal properties + property int minimumPosition: 0 + property int maximumPosition: 0 + property int userPosition: 0 + property int position: Math.max( minimumPosition, Math.min(maximumPosition, userPosition)) + + height: 50 + width: height + + Component.onCompleted: { + if(control.autoConfigureTarget){ + target.boundsBehavior = Flickable.DragOverBounds + target.boundsMovement = Flickable.StopAtBounds + } + } + + function refresh() { + control.refreshRequested() + postRefreshTimer.start() + } + + anchors { + top: control.target.top + horizontalCenter: control.target.horizontalCenter + topMargin: control.position - height * 1.1 + } + + onUserPositionChanged: { + if(control.state === "idle" && userPosition >= control.dragOutPosition){ + control.state = "ready" + } + else if(control.state === "ready" && userPosition < control.dragOutPosition){ + control.state = "refreshing" + preRefreshTimer.start() + } + } + + Loader { + id: backgroundLd + + anchors.fill: parent + + sourceComponent: control.background + } + + Loader { + id: pullIndicatorLd + + anchors.centerIn: parent + + height: parent.height * 0.6 + width: height + + rotation: 180 + + sourceComponent: control.pullIndicator + } + + Loader { + id: busyIndicatorLd + + anchors.centerIn: parent + + height: parent.height * 0.7 + width: height + + opacity: 0 + + sourceComponent: control.busyIndicator + } + + Behavior on minimumPosition { + enabled: control.state !== "hidden" && control.state !== "idle" + NumberAnimation { + duration: 200 + } + } + + Timer { + id: preRefreshTimer + interval: control.preRefreshDelay <= 0 ? 1:control.preRefreshDelay + running: false + repeat: false + onTriggered: { + control.refresh() + } + } + + Timer { + id: postRefreshTimer + interval: control.postRefreshDelay <= 0 ? 1:control.postRefreshDelay + running: false + repeat: false + onTriggered: { + control.state = "hidden" + } + } + + states: [ + State { + name: "idle" + + PropertyChanges { + target: control + minimumPosition: userPosition > maximumPosition ? maximumPosition:userPosition + userPosition: Math.abs( target.verticalOvershoot ) + maximumPosition: control.dragOutPosition + } + + PropertyChanges { + target: pullIndicatorLd + rotation: 0 + } + }, + State { + name: "ready" + PropertyChanges { + target: control + maximumPosition: control.dragOutPosition + userPosition: Math.abs( target.verticalOvershoot ) + minimumPosition: control.maximumPosition - 1 + } + + PropertyChanges { + target: pullIndicatorLd + rotation: 180 + } + }, + State { + name: "refreshing" + PropertyChanges { + target: control + minimumPosition: control.refreshPosition + userPosition: 0 + maximumPosition: control.refreshPosition + + } + + PropertyChanges { + target: pullIndicatorLd + opacity: 0 + } + + PropertyChanges { + target: busyIndicatorLd + opacity: 1 + } + }, + State { + name: "hidden" + PropertyChanges { + target: control + minimumPosition: control.refreshPosition + userPosition: 0 + maximumPosition: control.refreshPosition + scale: 0 + } + + PropertyChanges { + target: pullIndicatorLd + opacity: 0 + } + + PropertyChanges { + target: busyIndicatorLd + opacity: 1 + } + } + ] + + transitions: [ + Transition { + NumberAnimation { + duration: 200 + properties: "rotation, opacity" + } + }, + + Transition { + from: "refreshing" + to: "hidden" + + PauseAnimation { + duration: 200 + } + + NumberAnimation { + duration: 200 + properties: "scale" + } + + onRunningChanged: { + if(control.state === "hidden" && !running){ + control.state = "idle" + } + } + }, + + Transition { + from: "hidden" + to: "idle" + } + + ] + +} diff --git a/resources/qml/Components/RankingView.qml b/resources/qml/Components/RankingView.qml index bed8068..033ed88 100644 --- a/resources/qml/Components/RankingView.qml +++ b/resources/qml/Components/RankingView.qml @@ -17,12 +17,26 @@ DataListView { id: partDel property int ind: index + property var thisData: listData[ "participants" ][index] state: "closed" width: parent.width height: 70 + opacity: 0 + scale: 0.9 + + onThisDataChanged: { + fadeInPa.start() + } + + ParallelAnimation { + id: fadeInPa + NumberAnimation { target: partDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } + NumberAnimation { target: partDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } + } + text: "" onClicked: { diff --git a/resources/qml/Components/RegistrationView.qml b/resources/qml/Components/RegistrationView.qml index 649f7ef..8638a29 100644 --- a/resources/qml/Components/RegistrationView.qml +++ b/resources/qml/Components/RegistrationView.qml @@ -1,4 +1,4 @@ -import QtQuick 2.0 +import QtQuick 2.9 import QtQuick.Controls 2.4 DataListView { @@ -8,16 +8,33 @@ DataListView { model: listData[ root.listKey ] === undefined ? 0:listData[ root.listKey ].length + + delegate: ItemDelegate { id: partDel + property var thisData: listData[ "athletes" ][index] + width: parent.width + opacity: 0 + scale: 0.9 + + onThisDataChanged: { + fadeInPa.start() + } + + ParallelAnimation { + id: fadeInPa + NumberAnimation { target: partDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } + NumberAnimation { target: partDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } + } + text: "" Label { anchors.fill: parent - anchors.leftMargin: width * 0.05 + anchors.leftMargin: parent.width * 0.05 verticalAlignment: Text.AlignVCenter diff --git a/resources/qml/Components/ResultView.qml b/resources/qml/Components/ResultView.qml index 8ed2bc3..84c4772 100644 --- a/resources/qml/Components/ResultView.qml +++ b/resources/qml/Components/ResultView.qml @@ -16,12 +16,27 @@ DataListView { id: partDel property int ind: index + property var thisData: listData[ "participants" ][partDel.ind] width: parent.width height: 70 text: "" + opacity: 0 + scale: 0.9 + + onThisDataChanged: { + fadeInPa.start() + } + + ParallelAnimation { + id: fadeInPa + NumberAnimation { target: partDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } + NumberAnimation { target: partDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } + } + + Rectangle { anchors.fill: parent @@ -46,7 +61,7 @@ DataListView { Label { height: parent.height - width: parent.width * 0.1 + width: text === "" ? parent.width * 0.08:parent.width * 0.1 fontSizeMode: Text.Fit font.bold: true @@ -54,7 +69,7 @@ DataListView { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter - text: listData[ "participants" ][index]["result_rank"] + text: listData[ "participants" ][index]["result_rank"] === undefined ? "":listData[ "participants" ][index]["result_rank"] } Label { @@ -158,7 +173,7 @@ DataListView { var offsetX = width * 0.05 var offsetY = height * 0.05 - console.log("drawing result rect with width: " + width + " and height: " + height) + //console.log("drawing result rect with width: " + width + " and height: " + height) var context = getContext("2d"); diff --git a/resources/qml/Components/StartlistView.qml b/resources/qml/Components/StartlistView.qml index c080e09..9f28b3d 100644 --- a/resources/qml/Components/StartlistView.qml +++ b/resources/qml/Components/StartlistView.qml @@ -11,8 +11,23 @@ DataListView { delegate: ItemDelegate { id: partDel + property var thisData: listData[ "participants" ][index] + width: parent.width + opacity: 0 + scale: 0.9 + + onThisDataChanged: { + fadeInPa.start() + } + + ParallelAnimation { + id: fadeInPa + NumberAnimation { target: partDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } + NumberAnimation { target: partDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } + } + text: "" Row { diff --git a/resources/qml/Pages/CompetitionCalendarPage.qml b/resources/qml/Pages/CompetitionCalendarPage.qml index d5189da..a87578e 100644 --- a/resources/qml/Pages/CompetitionCalendarPage.qml +++ b/resources/qml/Pages/CompetitionCalendarPage.qml @@ -123,7 +123,7 @@ Page { } function loadData(nation, year) { - loadingDl.open() + //loadingDl.open() //console.log("loading calendar data and old data is: " + (root.calendarData !== undefined) + " because of: " + root.calendarData + " and: ") @@ -155,7 +155,7 @@ Page { return false } - loadingDl.close() + //loadingDl.close() app.errorCode = root.status return true @@ -198,7 +198,7 @@ Page { //console.log(calendarList.listData[i]["date"] + ": " + startDate + " to " + endDate) if(endDate.getTime() < new Date().getTime()){ - // end date is already over -> move the list view up! + // end date is already over -> move the list view down! calendarList.positionViewAtIndex(i, ListView.Top) //console.log("moving down!") } @@ -214,16 +214,30 @@ Page { property var cats: calendarList.listData[index]["cats"] property int catId: calendarList.listData[index]["cat_id"] property bool over + property var thisData: calendarList.listData[index] width: parent.width height: compDelCol.height + 10 enabled: calendarList.listData[index]["cats"] !== undefined && calendarList.listData[index]["cats"].length > 0 + opacity: 0 + scale: 0.9 + + onThisDataChanged: { + fadeInPa.start() + } + onClicked: { catSelectPu.appear(index, false) } + ParallelAnimation { + id: fadeInPa + NumberAnimation { target: competitionDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } + NumberAnimation { target: competitionDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } + } + Rectangle { id: delBackroundRect @@ -300,7 +314,7 @@ Page { y: root.height - height //root.height / 2 - height / 2 width: root.width - height: catsLv.height //root.height * 0.6 + height: catsLv.implicitHeight modal: true focus: true @@ -353,14 +367,10 @@ Page { property int delegateHeight: 50 - anchors { - top: parent.top - left: parent.left - right: parent.right - } + anchors.fill: parent - width: parent.width - height: root.height * 0.6 < ( (delegateHeight + spacing) * model ) ? root.height * 0.6 : (delegateHeight + spacing) * model + 75 + implicitWidth: parent.width + implicitHeight: root.height * 0.6 < ( (delegateHeight + spacing) * model ) ? root.height * 0.6 : (delegateHeight + spacing) * model + 75 model: catSelectPu.catObj !== undefined ? catSelectPu.catObj.length:0 @@ -423,7 +433,7 @@ Page { y: root.height - height //root.height / 2 - height / 2 width: root.width - height: root.height * 0.6 + height: yearsLv.implicitHeight modal: true focus: true @@ -433,8 +443,8 @@ Page { contentItem: ListView { id: yearsLv - width: parent.width - height: root.height * 0.6 + implicitWidth: parent.width + implicitHeight: root.height * 0.6 model: yearSelectPu.yearList !== undefined ? yearSelectPu.yearList.length:0 @@ -504,7 +514,7 @@ Page { y: root.height - height //root.height / 2 - height / 2 width: root.width - height: cupsLv.height //root.height * 0.6 + height: cupsLv.implicitHeight modal: true focus: true @@ -522,8 +532,8 @@ Page { right: parent.right } - width: parent.width - height: root.height * 0.6 < ( (delegateHeight + spacing) * model ) ? root.height * 0.6 : (delegateHeight + spacing) * model + 75 + implicitWidth: parent.width + implicitHeight: root.height * 0.6 < ( (delegateHeight + spacing) * model ) ? root.height * 0.6 : (delegateHeight + spacing) * model + 75 model: cupSelectPu.cupList !== undefined ? cupSelectPu.cupList.length:0 diff --git a/resources/qml/Pages/RankingPage.qml b/resources/qml/Pages/RankingPage.qml index e20f800..79affde 100644 --- a/resources/qml/Pages/RankingPage.qml +++ b/resources/qml/Pages/RankingPage.qml @@ -32,13 +32,18 @@ Page { property string compNameKey: root.reg ? "name":"comp_name" Component.onCompleted: { + loadingDl.open() root.loadData(root.comId, root.catId, root.reg, root.rak, root.routeNumber) + loadingDl.close() } function loadData(comp, cat, reg, rak, route){ - loadingDl.open() root.status = 905 console.log("[info][QML] getting ranking data of comp: " + comp + " , cat: " + cat + " and status: " + root.catStatus) + if(route === -1){ + route = -2 + } + var ret = serverConn.getRanking(comp, cat, reg, rak, route) root.status = ret["status"] @@ -77,20 +82,17 @@ Page { else if(root.status !== 200) { root.ready = false root.rankingData = {} - loadingDl.close() return false } if((ret["data"][ root.listKey ] === undefined || ret["data"][ root.listKey ].length < 1) && ( root.status === 200 || root.status === 404 ) ){ root.status = 901 root.ready = false - loadingDl.close() return false } console.log("done! status: " + root.status) root.ready = true - loadingDl.close() return true } @@ -265,9 +267,17 @@ Page { onClicked: { console.log("changing to index: " + index + " (" + routeSelectTb.tabs[index][0] + ", " + routeSelectTb.tabs[index][1] + ")") - if(root.routeNumber !== routeSelectTb.tabs[index][0]){ - root.routeNumber = routeSelectTb.tabs[index][0] - root.loadData(root.comId, root.catId, root.reg, root.rak, root.routeNumber) + if(root.routeNumber !== parseInt(routeSelectTb.tabs[index][0])){ + loadingDl.open() + if(root.loadData(root.comId, root.catId, root.reg, root.rak, routeSelectTb.tabs[index][0]) && root.status === 200){ + root.routeNumber = routeSelectTb.tabs[index][0] + } + else { + routeSelectTb.setCurrentIndex(routeSelectTb.getIndex(root.routeNumber)) + } + + loadingDl.close() + } } } diff --git a/resources/qml/main.qml b/resources/qml/main.qml index a72fe3f..36edb3c 100644 --- a/resources/qml/main.qml +++ b/resources/qml/main.qml @@ -51,7 +51,7 @@ Window { StackView { id: mainStack - enabled: !loadingDl.opened + //enabled: !loadingDl.opened anchors { top: toolBar.bottom @@ -211,6 +211,8 @@ Window { width: parent.width height: text !== "" ? undefined:0 + elide: "ElideRight" + font.bold: false color: "black" @@ -304,7 +306,7 @@ Window { } function openCalendar(nation){ - //loadingDl.open() + loadingDl.open() var calComp = Qt.createComponent("qrc:/Pages/CompetitionCalendarPage.qml").createObject(null, {"nation": nation}) app.errorCode = calComp.status @@ -315,7 +317,7 @@ Window { delete(calComp) } - //loadingDl.close() + loadingDl.close() } function openResults(comp, cat, status){ diff --git a/resources/qml/qml.qrc b/resources/qml/qml.qrc index eeaaff2..e5a1602 100644 --- a/resources/qml/qml.qrc +++ b/resources/qml/qml.qrc @@ -13,5 +13,6 @@ Components/RegistrationView.qml Components/StartlistView.qml Components/RankingView.qml + Components/PullRefresher.qml diff --git a/resources/shared/Banner.png b/resources/shared/Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..1d717b4380e3ef2dcb5e85e2a24c88d2f204edc3 GIT binary patch literal 33671 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 I<#Ob|02h(34FCWD literal 0 HcmV?d00001 diff --git a/resources/shared/Banner.xcf b/resources/shared/Banner.xcf new file mode 100644 index 0000000000000000000000000000000000000000..d8f227ae06d2c16badeba9f755e95fa05aecb63e GIT binary patch literal 64450 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

tRG?or@&9 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 literal 0 HcmV?d00001 diff --git a/sources/serverconn.cpp b/sources/serverconn.cpp index e08d83f..6dd4f62 100644 --- a/sources/serverconn.cpp +++ b/sources/serverconn.cpp @@ -4,25 +4,6 @@ ServerConn::ServerConn(QObject *parent) : QObject(parent) { } -void ServerConn::refreshFoodplan() { - QVariant tmpFoodplan; - - QVariantMap ret = this->senddata(QUrl("http://egw.ifsc-climbing.org/egw/ranking/json.php")); - - if(ret["status"] != 200){ - // request was a failure - return; - } - - QJsonDocument jsonReply = QJsonDocument::fromJson(ret["text"].toString().toUtf8()); - - this->foodplan = jsonReply.toVariant(); - - //qDebug() << this->foodplan; - - emit this->foodplanChanged(); -} - QVariant ServerConn::getCalendar(QString nation, int year){ QVariantMap ret = this->senddata(QUrl("http://egw.ifsc-climbing.org/egw/ranking/json.php?year=" + QString::number(year) + "&nation=" + nation)); @@ -128,7 +109,5 @@ QVariantMap ServerConn::senddata(QUrl serviceUrl, QUrlQuery pdata) // --- Functions for QML --- // ------------------------- -QVariant ServerConn::getFoodplan() { - return this->foodplan; -} +