- changed year select icon
- added the ability to filter competitions by type (eg. world cup, youth, etc.)
12
CHANGELOG.md
|
@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
# [0.01.6] - 2019-06-15
|
||||||
|
### Fixed
|
||||||
|
- label for IFSC calendar
|
||||||
|
|
||||||
|
# [0.01.5] - 2019-06-15
|
||||||
|
### Fixed
|
||||||
|
- layout fixes
|
||||||
|
- cat when changing from 'MEN' to 'WOMEN' 'MEN' is not missing anymore
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- infosheet url is now present in the cat select dialog if available
|
||||||
|
|
||||||
# [0.01.4b] - 2019-05-31
|
# [0.01.4b] - 2019-05-31
|
||||||
### Fixed
|
### Fixed
|
||||||
- fixed some errors that occurred when changing categories
|
- fixed some errors that occurred when changing categories
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<manifest package="com.itsblue.blueROCKtest" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.01.4b" android:versionCode="5" android:installLocation="auto">
|
<manifest package="com.itsblue.blueROCKtest" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.01.6" android:versionCode="7" android:installLocation="auto">
|
||||||
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="blueROCK" android:icon="@drawable/icon">
|
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="blueROCK" android:icon="@drawable/icon">
|
||||||
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="blueROCK (for digitalROCK)" android:screenOrientation="unspecified" android:launchMode="singleTop">
|
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="blueROCK" android:screenOrientation="unspecified" android:launchMode="singleTop">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
|
|
@ -18,6 +18,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
|
sources/appsettings.cpp \
|
||||||
sources/main.cpp \
|
sources/main.cpp \
|
||||||
sources/serverconn.cpp
|
sources/serverconn.cpp
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||||
!isEmpty(target.path): INSTALLS += target
|
!isEmpty(target.path): INSTALLS += target
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
headers/appsettings.h \
|
||||||
headers/serverconn.h
|
headers/serverconn.h
|
||||||
|
|
||||||
DISTFILES += \
|
DISTFILES += \
|
||||||
|
|
43
headers/appsettings.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#ifndef APPSETTINGS_H
|
||||||
|
#define APPSETTINGS_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QtDebug>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
|
||||||
|
class AppSettings : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(NOTIFY themeChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AppSettings(QObject *parent = nullptr);
|
||||||
|
// This is the Constructor of the AppSettings class
|
||||||
|
|
||||||
|
~AppSettings();
|
||||||
|
// This is the Destructor of the AppSettings class
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSettings *settingsManager;
|
||||||
|
// QSettings object which cares about our settings.ini file
|
||||||
|
|
||||||
|
QSettings *themeSettingsManager;
|
||||||
|
// QSettings object which cares about the themes
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void themeChanged();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
Q_INVOKABLE QString read(const QString &key);
|
||||||
|
// function to read values from the settings file
|
||||||
|
|
||||||
|
Q_INVOKABLE void write(const QString &key, const QVariant &value);
|
||||||
|
// function to write values to the settings file
|
||||||
|
|
||||||
|
Q_INVOKABLE void setDefault(const QString &key, const QVariant &defaultValue);
|
||||||
|
// function to create a key (/ setting) with a default value if it hasnt been ceated yet
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPSETTINGS_H
|
|
@ -38,9 +38,6 @@ signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
QVariant getCalendar(QString nation, int year);
|
|
||||||
QVariant getRanking(int competitionId, int categoryId, bool registrationData = false, bool rankingData = false, const int routeNumber = -2);
|
|
||||||
QVariant getAthlete(int perId);
|
|
||||||
QVariant getWidgetData(QVariantMap params);
|
QVariant getWidgetData(QVariantMap params);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,7 +15,9 @@ Item {
|
||||||
property int preRefreshDelay: 1000 // delay before reload funcion is called
|
property int preRefreshDelay: 1000 // delay before reload funcion is called
|
||||||
|
|
||||||
property int refreshPosition: height * 1.2 // position of the item when refreshing
|
property int refreshPosition: height * 1.2 // position of the item when refreshing
|
||||||
property int dragOutPosition: height * 1.8 // position of the item when starting to refresh
|
property int dragOutPosition: height * 1.8 // maximum drag out
|
||||||
|
|
||||||
|
property double dragRefreshPositionMultiplier: 0.5 // position of the item when starting to refresh
|
||||||
|
|
||||||
property color backgroundColor: "white" // color for the pre-defined background
|
property color backgroundColor: "white" // color for the pre-defined background
|
||||||
property color pullIndicatorColor: "black" // color for the pre-defined pull indicator
|
property color pullIndicatorColor: "black" // color for the pre-defined pull indicator
|
||||||
|
@ -49,6 +51,8 @@ Item {
|
||||||
|
|
||||||
property double drawProgress: control.dragProgress
|
property double drawProgress: control.dragProgress
|
||||||
|
|
||||||
|
rotation: drawProgress > control.dragRefreshPositionMultiplier ? 180:0
|
||||||
|
|
||||||
onDrawProgressChanged: {
|
onDrawProgressChanged: {
|
||||||
requestPaint()
|
requestPaint()
|
||||||
}
|
}
|
||||||
|
@ -68,8 +72,7 @@ Item {
|
||||||
|
|
||||||
var lineWidth = 2
|
var lineWidth = 2
|
||||||
|
|
||||||
var progress = drawProgress
|
var progress = drawProgress * 1 / control.dragRefreshPositionMultiplier > 1 ? 1 : drawProgress * 1 / control.dragRefreshPositionMultiplier
|
||||||
console.log(progress)
|
|
||||||
// modify all values to math the progress
|
// modify all values to math the progress
|
||||||
|
|
||||||
arrowHeight = arrowHeight * progress
|
arrowHeight = arrowHeight * progress
|
||||||
|
@ -101,6 +104,13 @@ Item {
|
||||||
|
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Behavior on rotation {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signal refreshRequested
|
signal refreshRequested
|
||||||
|
@ -132,16 +142,15 @@ Item {
|
||||||
topMargin: control.position - height
|
topMargin: control.position - height
|
||||||
}
|
}
|
||||||
|
|
||||||
onUserPositionChanged: {
|
Connections {
|
||||||
console.log(userPosition)
|
target: control.target
|
||||||
if(control.state === "idle" && userPosition >= control.dragOutPosition * 0.9){
|
onDragEnded: {
|
||||||
control.state = "ready"
|
if(userPosition >= control.dragOutPosition * control.dragRefreshPositionMultiplier){
|
||||||
}
|
|
||||||
else if(control.state === "ready" && userPosition < control.dragOutPosition * 0.9){
|
|
||||||
control.state = "refreshing"
|
control.state = "refreshing"
|
||||||
preRefreshTimer.start()
|
preRefreshTimer.start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: backgroundLd
|
id: backgroundLd
|
||||||
|
@ -177,13 +186,6 @@ Item {
|
||||||
sourceComponent: control.busyIndicator
|
sourceComponent: control.busyIndicator
|
||||||
}
|
}
|
||||||
|
|
||||||
Behavior on minimumPosition {
|
|
||||||
enabled: control.state !== "hidden" && control.state !== "idle"
|
|
||||||
NumberAnimation {
|
|
||||||
duration: 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
id: preRefreshTimer
|
id: preRefreshTimer
|
||||||
interval: control.preRefreshDelay <= 0 ? 1:control.preRefreshDelay
|
interval: control.preRefreshDelay <= 0 ? 1:control.preRefreshDelay
|
||||||
|
@ -204,6 +206,13 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Behavior on minimumPosition {
|
||||||
|
enabled: !control.target.dragging && state !== "idle"
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
states: [
|
states: [
|
||||||
State {
|
State {
|
||||||
name: "idle"
|
name: "idle"
|
||||||
|
@ -211,7 +220,7 @@ Item {
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: control
|
target: control
|
||||||
minimumPosition: userPosition > maximumPosition ? maximumPosition:userPosition
|
minimumPosition: userPosition > maximumPosition ? maximumPosition:userPosition
|
||||||
userPosition: -1 / (Math.abs( target.verticalOvershoot * 0.001 ) + 1 / control.dragOutPosition * 0.001) + control.dragOutPosition // Math.abs( target.verticalOvershoot )
|
userPosition: -1 / (Math.abs( target.verticalOvershoot * 0.001 + 0.003 ) + 1 / control.dragOutPosition * 0.001) + control.dragOutPosition // Math.abs( target.verticalOvershoot )
|
||||||
maximumPosition: control.dragOutPosition
|
maximumPosition: control.dragOutPosition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,20 +229,6 @@ Item {
|
||||||
rotation: 0
|
rotation: 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
State {
|
|
||||||
name: "ready"
|
|
||||||
PropertyChanges {
|
|
||||||
target: control
|
|
||||||
maximumPosition: control.dragOutPosition
|
|
||||||
userPosition: -1 / (Math.abs( target.verticalOvershoot * 0.001 ) + 1 / control.dragOutPosition * 0.001) + control.dragOutPosition // Math.abs( target.verticalOvershoot )
|
|
||||||
minimumPosition: userPosition > maximumPosition - 1 ? maximumPosition - 1:userPosition
|
|
||||||
}
|
|
||||||
|
|
||||||
PropertyChanges {
|
|
||||||
target: pullIndicatorLd
|
|
||||||
rotation: 180
|
|
||||||
}
|
|
||||||
},
|
|
||||||
State {
|
State {
|
||||||
name: "refreshing"
|
name: "refreshing"
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
|
|
|
@ -18,13 +18,55 @@
|
||||||
|
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 2.4
|
import QtQuick.Controls 2.4
|
||||||
|
import "../Components"
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
title: "start"
|
title: "search athlete"
|
||||||
property Component headerComponent: null
|
property Component headerComponent: null
|
||||||
|
|
||||||
|
property var searchResults: ({})
|
||||||
|
|
||||||
|
function search(term){
|
||||||
|
loadingDl.open()
|
||||||
|
root.searchResults = serverConn.getWidgetData({term:term}).data
|
||||||
|
loadingDl.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: searchTf.height
|
||||||
|
anchors.margins: 10
|
||||||
|
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
model: root.searchResults.length
|
||||||
|
|
||||||
|
delegate: ItemDelegate {
|
||||||
|
width: parent.width
|
||||||
|
text: root.searchResults[index]['label']
|
||||||
|
onClicked: app.openWidget({person: root.searchResults[index]['value']})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: searchTf
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
margins: 10
|
||||||
|
}
|
||||||
|
Keys.onReturnPressed: {
|
||||||
|
console.warn(searchTf.text)
|
||||||
|
root.search("*" + searchTf.text + "*")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ Page {
|
||||||
image: "qrc:/icons/ifsc.png"
|
image: "qrc:/icons/ifsc.png"
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
app.openWidget({nation:""})
|
app.openWidget({nation:"ICC"})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,10 @@
|
||||||
|
|
||||||
import QtQuick 2.9
|
import QtQuick 2.9
|
||||||
import QtQuick.Controls 2.4
|
import QtQuick.Controls 2.4
|
||||||
import QtGraphicalEffects 1.0
|
//import QtGraphicalEffects 1.0
|
||||||
|
//import QtQuick.Templates 2.04 as T
|
||||||
|
//import QtQuick.Controls.impl 2.04
|
||||||
|
import QtQuick.Controls.Material 2.3
|
||||||
|
|
||||||
import "../Components"
|
import "../Components"
|
||||||
|
|
||||||
|
@ -97,9 +100,14 @@ Page {
|
||||||
// update all the given values
|
// update all the given values
|
||||||
for(var prop in params){
|
for(var prop in params){
|
||||||
if(params.hasOwnProperty(prop)){
|
if(params.hasOwnProperty(prop)){
|
||||||
|
if(params[prop] === null){
|
||||||
|
delete root.params[prop]
|
||||||
|
}
|
||||||
|
else {
|
||||||
root.params[prop] = params[prop]
|
root.params[prop] = params[prop]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
loadData(root.params)
|
loadData(root.params)
|
||||||
|
|
||||||
|
@ -244,11 +252,14 @@ Page {
|
||||||
id: selectorPu
|
id: selectorPu
|
||||||
|
|
||||||
property var dataObj
|
property var dataObj
|
||||||
|
property string subTitle: ""
|
||||||
|
|
||||||
signal selectionFinished(int index, var data)
|
signal selectionFinished(int index, var data)
|
||||||
|
|
||||||
x: 0 //root.width / 2 - width / 2
|
x: 0 //root.width / 2 - width / 2
|
||||||
y: root.height - height //root.height / 2 - height / 2
|
y: root.height - selectorPu.height * 0.7//root.height - height //root.height / 2 - height / 2
|
||||||
|
|
||||||
|
opacity: 0
|
||||||
|
|
||||||
width: root.width
|
width: root.width
|
||||||
height: selectorLv.implicitHeight
|
height: selectorLv.implicitHeight
|
||||||
|
@ -258,10 +269,69 @@ Page {
|
||||||
|
|
||||||
title: ""
|
title: ""
|
||||||
|
|
||||||
function appear(dataObj, title) {
|
header: Column {
|
||||||
|
id: selectorPuHeaderCol
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: headerLa
|
||||||
|
|
||||||
|
visible: selectorPu.title
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
elide: "ElideRight"
|
||||||
|
padding: 24
|
||||||
|
bottomPadding: 0
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 16
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 2
|
||||||
|
color: selectorPu.Material.dialogColor
|
||||||
|
clip: true
|
||||||
|
}
|
||||||
|
|
||||||
|
text: selectorPu.title
|
||||||
|
|
||||||
|
onLinkActivated: {
|
||||||
|
Qt.openUrlExternally(link)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
id: headerSubLa
|
||||||
|
|
||||||
|
visible: selectorPu.subTitle
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
elide: "ElideRight"
|
||||||
|
padding: 24
|
||||||
|
topPadding: 5
|
||||||
|
bottomPadding: 0
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 16
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 2
|
||||||
|
color: selectorPu.Material.dialogColor
|
||||||
|
clip: true
|
||||||
|
}
|
||||||
|
|
||||||
|
text: selectorPu.subTitle
|
||||||
|
|
||||||
|
onLinkActivated: {
|
||||||
|
Qt.openUrlExternally(link)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function appear(dataObj, title, subTitle) {
|
||||||
if(dataObj.length > 0){
|
if(dataObj.length > 0){
|
||||||
selectorPu.dataObj = dataObj
|
selectorPu.dataObj = dataObj
|
||||||
selectorPu.title = title
|
selectorPu.title = title
|
||||||
|
selectorPu.subTitle = subTitle === undefined ? "":subTitle
|
||||||
selectorPu.open()
|
selectorPu.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,7 +344,7 @@ Page {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
implicitWidth: parent.width
|
implicitWidth: parent.width
|
||||||
implicitHeight: root.height * 0.6 < ( (delegateHeight + spacing) * model ) ? root.height * 0.6 : (delegateHeight + spacing) * model + 75
|
implicitHeight: root.height * 0.7 < ( (delegateHeight + spacing) * model ) ? root.height * 0.7 : (delegateHeight + spacing) * model + 100
|
||||||
|
|
||||||
model: selectorPu.dataObj !== undefined ? selectorPu.dataObj.length:0
|
model: selectorPu.dataObj !== undefined ? selectorPu.dataObj.length:0
|
||||||
|
|
||||||
|
@ -308,21 +378,30 @@ Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
enter: Transition {
|
enter: Transition {
|
||||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0 }
|
NumberAnimation {
|
||||||
|
property: "opacity";
|
||||||
|
//from: 0.0;
|
||||||
|
to: 1.0
|
||||||
|
}
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
property: "y"
|
property: "y"
|
||||||
from: root.height - selectorPu.height * 0.7
|
//from: root.height - selectorPu.height * 0.7
|
||||||
to: root.height - selectorPu.height
|
to: root.height - selectorPu.height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exit: Transition {
|
exit: Transition {
|
||||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0 }
|
NumberAnimation {
|
||||||
|
property: "opacity";
|
||||||
|
//from: 1.0;
|
||||||
|
to: 0.0
|
||||||
|
}
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
property: "y"
|
property: "y"
|
||||||
from: root.height - selectorPu.height
|
//from: root.height - selectorPu.height
|
||||||
to: root.height - selectorPu.height * 0.7
|
to: root.height - selectorPu.height * 0.7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,11 @@ DataListView {
|
||||||
|
|
||||||
property bool ready
|
property bool ready
|
||||||
|
|
||||||
property string title: (params.nation === "" ? "IFSC":params.nation === "GER" ? "DAV":"SAC") + " " + qsTr("competition calendar") + " " + control.year
|
property string title: (params.nation === "ICC" ? "IFSC":params.nation === "GER" ? "DAV":"SAC") + " " + qsTr("calendar") + " " + control.year
|
||||||
property Component headerComponent: RowLayout {
|
property Component headerComponent: RowLayout {
|
||||||
|
|
||||||
height: parent.height
|
height: parent.height
|
||||||
|
width: 100//childrenRect.width
|
||||||
|
|
||||||
spacing: 0
|
spacing: 0
|
||||||
|
|
||||||
|
@ -41,7 +42,29 @@ DataListView {
|
||||||
control.changeYear()
|
control.changeYear()
|
||||||
}
|
}
|
||||||
|
|
||||||
icon.name: "calendar"
|
icon.name: "year"
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
id: filterToolBt
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
var obj = app.compCats
|
||||||
|
var compCats = new Array
|
||||||
|
|
||||||
|
for(var prop in obj) {
|
||||||
|
// go through the whole array and search for data keys
|
||||||
|
if (obj.hasOwnProperty(prop) && obj[prop]["nation"] === params.nation) {
|
||||||
|
//console.log("found cat: " + obj[prop]['label'])
|
||||||
|
|
||||||
|
compCats.push( {"text": obj[prop]['label'], "data": obj[prop]} )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filterSelectPu.appear(compCats, qsTr("Select Filters"), "")
|
||||||
|
}
|
||||||
|
|
||||||
|
icon.name: "filter"
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolButton {
|
ToolButton {
|
||||||
|
@ -59,6 +82,8 @@ DataListView {
|
||||||
|
|
||||||
property int year: new Date().getFullYear()
|
property int year: new Date().getFullYear()
|
||||||
|
|
||||||
|
property var displayedCompCats: []
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
//boundsBehavior: Flickable.StopAtBounds
|
//boundsBehavior: Flickable.StopAtBounds
|
||||||
|
@ -70,6 +95,8 @@ DataListView {
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
initFilters()
|
||||||
|
|
||||||
if(model > 0){
|
if(model > 0){
|
||||||
control.ready = true
|
control.ready = true
|
||||||
control.status = 200
|
control.status = 200
|
||||||
|
@ -80,9 +107,11 @@ DataListView {
|
||||||
}
|
}
|
||||||
|
|
||||||
autoScroll()
|
autoScroll()
|
||||||
|
}
|
||||||
|
|
||||||
|
onWidgetDataChanged: {
|
||||||
// if the IFSC Calendar is open -> add the worldranking
|
// if the IFSC Calendar is open -> add the worldranking
|
||||||
if(params.nation === ""){
|
if(params.nation === "ICC"){
|
||||||
control.widgetData['cups'].unshift({"SerId":"","rkey":"","name":"Worldranking","modified":"2018-10-24 16:11:12","modifier":"","year":"","num_comps":"","cats":["ICC-COA","ICC-HD","ICC-MED","ICC_F","ICC_FB","ICC_FS","ICC_M","ICC_MB","ICC_MS"]})
|
control.widgetData['cups'].unshift({"SerId":"","rkey":"","name":"Worldranking","modified":"2018-10-24 16:11:12","modifier":"","year":"","num_comps":"","cats":["ICC-COA","ICC-HD","ICC-MED","ICC_F","ICC_FB","ICC_FS","ICC_M","ICC_MB","ICC_MS"]})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +120,7 @@ DataListView {
|
||||||
// function to scroll to the next competition that is not already over
|
// function to scroll to the next competition that is not already over
|
||||||
var compList = control.widgetData["competitions"]
|
var compList = control.widgetData["competitions"]
|
||||||
|
|
||||||
//console.log("scrolling")
|
console.log("scrolling")
|
||||||
|
|
||||||
if(parseInt(control.year) === new Date().getFullYear()){
|
if(parseInt(control.year) === new Date().getFullYear()){
|
||||||
for(var i = 0; i < compList.length; i ++){
|
for(var i = 0; i < compList.length; i ++){
|
||||||
|
@ -146,7 +175,7 @@ DataListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
selector.appear(selectOptions, qsTr("select category"))
|
selector.appear(selectOptions, control.widgetData["competitions"][compIndex]['name'], getCompInfoUrl(compIndex) !== undefined ? ("<a href='" + getCompInfoUrl(compIndex) + "'>infosheet</a>"): "")
|
||||||
}
|
}
|
||||||
|
|
||||||
function changeYear(){
|
function changeYear(){
|
||||||
|
@ -223,6 +252,66 @@ DataListView {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getCompInfoUrl(compIndex) {
|
||||||
|
switch(params.nation) {
|
||||||
|
case "GER":
|
||||||
|
if(control.widgetData["competitions"][compIndex]['info'] !== undefined){
|
||||||
|
return "http://ranking.alpenverein.de/" + control.year + "/GER/" + control.widgetData["competitions"][compIndex]['rkey'] + ".pdf"
|
||||||
|
}
|
||||||
|
return
|
||||||
|
case "SUI":
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
if(control.widgetData["competitions"][compIndex]['info'] === undefined){
|
||||||
|
return control.widgetData["competitions"][compIndex]['info2']
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return control.widgetData["competitions"][compIndex]['info']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterCats(display, cats) {
|
||||||
|
//console.log("filtering cats: " + cats + " displaying: " + display)
|
||||||
|
for(var i = 0; i < cats.length; i ++){
|
||||||
|
if(control.displayedCompCats.indexOf(cats[i]) >= 0 && !display){
|
||||||
|
control.displayedCompCats.splice(control.displayedCompCats.indexOf(cats[i]), 1)
|
||||||
|
}
|
||||||
|
else if(control.displayedCompCats.indexOf(cats[i]) == -1 && display){
|
||||||
|
control.displayedCompCats.push(cats[i])
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// trigger 'changed' signal
|
||||||
|
control.displayedCompCats = control.displayedCompCats
|
||||||
|
appSettings.write("displayedCompCats"+params.nation, JSON.stringify(displayedCompCats))
|
||||||
|
//console.log("new JSON string is: " + JSON.stringify(displayedCompCats))
|
||||||
|
//console.log("displayed cats is now: " + control.displayedCompCats)
|
||||||
|
}
|
||||||
|
|
||||||
|
function initFilters() {
|
||||||
|
|
||||||
|
if(appSettings.read("displayedCompCats"+params.nation) !== "false"){
|
||||||
|
//console.log(appSettings.read("displayedCompCats"+params.nation))
|
||||||
|
control.displayedCompCats = JSON.parse(appSettings.read("displayedCompCats"+params.nation))
|
||||||
|
}
|
||||||
|
if(control.displayedCompCats.length === 0){
|
||||||
|
var obj = app.compCats
|
||||||
|
var compCats = new Array
|
||||||
|
|
||||||
|
for(var prop in obj) {
|
||||||
|
// go through the whole array and search for data keys
|
||||||
|
if (obj.hasOwnProperty(prop) && obj[prop]["nation"] === params.nation) {
|
||||||
|
//console.log("found cat: " + obj[prop]['label'])
|
||||||
|
filterCats(true, obj[prop]['cat_id'])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// trigger 'changed' signal
|
||||||
|
control.displayedCompCats = control.displayedCompCats
|
||||||
|
//console.log(control.displayedCompCats)
|
||||||
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: parent.selector
|
target: parent.selector
|
||||||
onSelectionFinished: {
|
onSelectionFinished: {
|
||||||
|
@ -243,6 +332,18 @@ DataListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
header: Item {
|
||||||
|
id: topSpacerItm
|
||||||
|
width: parent.width
|
||||||
|
height: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: Item {
|
||||||
|
id: bottomSpacerItm
|
||||||
|
width: parent.width
|
||||||
|
height: 10
|
||||||
|
}
|
||||||
|
|
||||||
delegate: ItemDelegate {
|
delegate: ItemDelegate {
|
||||||
id: competitionDel
|
id: competitionDel
|
||||||
|
|
||||||
|
@ -255,13 +356,22 @@ DataListView {
|
||||||
property int catId: thisData["cat_id"] === undefined ? 0:thisData["cat_id"]
|
property int catId: thisData["cat_id"] === undefined ? 0:thisData["cat_id"]
|
||||||
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: compDelCol.height + 10
|
height: visible ? compDelCol.height + 10 : 0
|
||||||
|
|
||||||
enabled: thisData["cats"] !== undefined && thisData["cats"].length > 0
|
enabled: thisData["cats"] !== undefined && thisData["cats"].length > 0
|
||||||
|
visible: control.displayedCompCats.indexOf(parseInt(thisData['cat_id'])) >= 0
|
||||||
|
|
||||||
opacity: 0
|
opacity: 0
|
||||||
scale: 0.9
|
scale: 0.9
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: control
|
||||||
|
onDisplayedCompCatsChanged: {
|
||||||
|
//console.log("filters changed")
|
||||||
|
competitionDel.visible = control.displayedCompCats.indexOf(parseInt(competitionDel.thisData['cat_id'])) >= 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onThisDataChanged: {
|
onThisDataChanged: {
|
||||||
fadeInPa.start()
|
fadeInPa.start()
|
||||||
}
|
}
|
||||||
|
@ -307,14 +417,6 @@ DataListView {
|
||||||
text: name
|
text: name
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Label {
|
|
||||||
id: infola
|
|
||||||
|
|
||||||
width: parent.width
|
|
||||||
|
|
||||||
text: thisData.info
|
|
||||||
}*/
|
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
id: dateLa
|
id: dateLa
|
||||||
|
|
||||||
|
@ -339,4 +441,188 @@ DataListView {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Dialog {
|
||||||
|
id: filterSelectPu
|
||||||
|
|
||||||
|
property var dataObj
|
||||||
|
property string subTitle: ""
|
||||||
|
|
||||||
|
signal selectionFinished(int index, var data)
|
||||||
|
|
||||||
|
x: 0 - control.anchors.leftMargin //root.width / 2 - width / 2
|
||||||
|
y: root.height - filterSelectPu.height * 0.7//root.height - height //root.height / 2 - height / 2
|
||||||
|
|
||||||
|
opacity: 0
|
||||||
|
|
||||||
|
width: control.width + control.anchors.leftMargin + control.anchors.rightMargin
|
||||||
|
height: selectorLv.implicitHeight
|
||||||
|
|
||||||
|
modal: true
|
||||||
|
focus: true
|
||||||
|
|
||||||
|
title: ""
|
||||||
|
|
||||||
|
function appear(dataObj, title, subTitle) {
|
||||||
|
if(dataObj.length > 0){
|
||||||
|
filterSelectPu.dataObj = dataObj
|
||||||
|
filterSelectPu.title = title
|
||||||
|
filterSelectPu.subTitle = subTitle === undefined ? "":subTitle
|
||||||
|
filterSelectPu.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
header: Column {
|
||||||
|
id: filterSelectPuHeaderCol
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: headerLa
|
||||||
|
|
||||||
|
visible: filterSelectPu.title
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
elide: "ElideRight"
|
||||||
|
padding: 24
|
||||||
|
bottomPadding: 0
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 16
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 2
|
||||||
|
//color: filterSelectPu.Material.dialogColor
|
||||||
|
clip: true
|
||||||
|
}
|
||||||
|
|
||||||
|
text: filterSelectPu.title
|
||||||
|
|
||||||
|
onLinkActivated: {
|
||||||
|
Qt.openUrlExternally(link)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
id: headerSubLa
|
||||||
|
|
||||||
|
visible: filterSelectPu.subTitle
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
elide: "ElideRight"
|
||||||
|
padding: 24
|
||||||
|
topPadding: 5
|
||||||
|
bottomPadding: 0
|
||||||
|
font.bold: true
|
||||||
|
font.pixelSize: 16
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 2
|
||||||
|
//color: filterSelectPu.Material.dialogColor
|
||||||
|
clip: true
|
||||||
|
}
|
||||||
|
|
||||||
|
text: filterSelectPu.subTitle
|
||||||
|
|
||||||
|
onLinkActivated: {
|
||||||
|
Qt.openUrlExternally(link)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: selectorLv
|
||||||
|
|
||||||
|
property int delegateHeight: 50
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
implicitWidth: parent.width
|
||||||
|
implicitHeight: root.height * 0.7 < ( (delegateHeight + spacing) * model ) ? root.height * 0.7 : (delegateHeight + spacing) * model + 100
|
||||||
|
|
||||||
|
model: filterSelectPu.dataObj !== undefined ? filterSelectPu.dataObj.length:0
|
||||||
|
|
||||||
|
ScrollIndicator.vertical: ScrollIndicator {
|
||||||
|
parent: selectorLv.parent
|
||||||
|
anchors {
|
||||||
|
top: selectorLv.top
|
||||||
|
left: selectorLv.right
|
||||||
|
margins: 10
|
||||||
|
leftMargin: 3
|
||||||
|
bottom: selectorLv.bottom
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: CheckDelegate {
|
||||||
|
id: catBt
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
height: text !== "" ? selectorLv.delegateHeight:0
|
||||||
|
|
||||||
|
//flat: true
|
||||||
|
|
||||||
|
text: filterSelectPu.dataObj[index].text
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
checked = getCheckedState()
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: control
|
||||||
|
onDisplayedCompCatsChanged: {
|
||||||
|
//console.log("filters changed")
|
||||||
|
//competitionDel.visible = control.displayedCompCats.indexOf(parseInt(competitionDel.thisData['cat_id'])) >= 0
|
||||||
|
checked = getCheckedState()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCheckedState() {
|
||||||
|
for(var i = 0; i < filterSelectPu.dataObj[index].data.cat_id.length; i ++){
|
||||||
|
|
||||||
|
console.log("checking cat " + filterSelectPu.dataObj[index].data.label )
|
||||||
|
if(control.displayedCompCats.indexOf(filterSelectPu.dataObj[index].data.cat_id[i] ) >= 0){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
control.filterCats(checked, filterSelectPu.dataObj[index].data.cat_id)
|
||||||
|
if(control.displayedCompCats.length == 0){
|
||||||
|
control.filterCats(true, filterSelectPu.dataObj[index].data.cat_id)
|
||||||
|
checked = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enter: Transition {
|
||||||
|
NumberAnimation {
|
||||||
|
property: "opacity";
|
||||||
|
//from: 0.0;
|
||||||
|
to: 1.0
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
property: "y"
|
||||||
|
//from: root.height - filterSelectPu.height * 0.7
|
||||||
|
to: root.height - filterSelectPu.height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit: Transition {
|
||||||
|
NumberAnimation {
|
||||||
|
property: "opacity";
|
||||||
|
//from: 1.0;
|
||||||
|
to: 0.0
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
property: "y"
|
||||||
|
//from: root.height - filterSelectPu.height
|
||||||
|
to: root.height - filterSelectPu.height * 0.7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,7 +172,7 @@ DataListView {
|
||||||
|
|
||||||
fontSizeMode: Text.Fit
|
fontSizeMode: Text.Fit
|
||||||
font.bold: true
|
font.bold: true
|
||||||
font.pixelSize: Math.abs( height * 0.4 )
|
font.pixelSize: Math.abs( height * 0.35 )
|
||||||
minimumPixelSize: height * 0.3
|
minimumPixelSize: height * 0.3
|
||||||
|
|
||||||
elide: "ElideRight"
|
elide: "ElideRight"
|
||||||
|
|
|
@ -194,7 +194,7 @@ DataListView {
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
horizontalAlignment: Text.AlignLeft
|
horizontalAlignment: Text.AlignLeft
|
||||||
|
|
||||||
text: partDel.thisData["firstname"] + " " + partDel.thisData["lastname"]
|
text: partDel.thisData["firstname"] + " " + partDel.thisData["lastname"] + " (" + partDel.thisData["start_number"] + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
|
@ -235,7 +235,6 @@ DataListView {
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
id: boulderResRep
|
id: boulderResRep
|
||||||
|
|
||||||
model: parseInt(widgetData[ "route_num_problems" ])
|
model: parseInt(widgetData[ "route_num_problems" ])
|
||||||
|
|
||||||
function getDataForIcon(index){
|
function getDataForIcon(index){
|
||||||
|
|
|
@ -166,12 +166,12 @@ DataListView {
|
||||||
|
|
||||||
fontSizeMode: Text.Fit
|
fontSizeMode: Text.Fit
|
||||||
font.bold: true
|
font.bold: true
|
||||||
font.pixelSize: Math.abs( height * 0.45 )
|
font.pixelSize: Math.abs( height * 0.35 )
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
horizontalAlignment: Text.AlignLeft
|
horizontalAlignment: Text.AlignLeft
|
||||||
minimumPixelSize: 1
|
minimumPixelSize: 1
|
||||||
|
|
||||||
text: widgetData[ "participants" ][index]["firstname"] + " " + widgetData[ "participants" ][index]["lastname"]
|
text: widgetData[ "participants" ][index]["firstname"] + " " + widgetData[ "participants" ][index]["lastname"] + " (" + partDel.thisData["start_number"] + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
|
|
|
@ -43,28 +43,44 @@ Window {
|
||||||
// - https://github.com/ralfbecker/ranking/blob/master/sitemgr/digitalrock/sac_calendar.php
|
// - https://github.com/ralfbecker/ranking/blob/master/sitemgr/digitalrock/sac_calendar.php
|
||||||
|
|
||||||
property var compCats: {
|
property var compCats: {
|
||||||
'int' : {
|
|
||||||
|
// --- ICC ---
|
||||||
|
|
||||||
|
/*'int' : {
|
||||||
'label' : 'International',
|
'label' : 'International',
|
||||||
'nation' : '',
|
'nation' : 'ICC',
|
||||||
'wettk_reg' : '^[0-9]{2,2}[_^E]{1}[^YJ]{1,1}.*',
|
'wettk_reg' : '^[0-9]{2,2}[_^E]{1}[^YJ]{1,1}.*',
|
||||||
'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*',
|
'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*',
|
||||||
'rang_title': 'CUWR continuously updated WORLDRANKING',
|
'rang_title': 'CUWR continuously updated WORLDRANKING',
|
||||||
'bgcolor' : '#B8C8FF',
|
'bgcolor' : '#B8C8FF',
|
||||||
'nat_team_ranking' : '',
|
'nat_team_ranking' : '',
|
||||||
'cat_id' : [68,69,70,86,259]
|
'cat_id' : [68,86]//[68,69,70,86,259]
|
||||||
|
},*/
|
||||||
|
'worldcup': {
|
||||||
|
'label' : 'World Cups',
|
||||||
|
'nation' : 'ICC',
|
||||||
|
'bgcolor' : '#B8C8FF',
|
||||||
|
'cat_id' : [69]
|
||||||
},
|
},
|
||||||
'youth' : {
|
'youth' : {
|
||||||
'label' : 'Int. Jugend',
|
'label' : 'Youth Events',
|
||||||
'nation' : '',
|
'nation' : 'ICC',
|
||||||
'wettk_reg' : '^[0-9]{2,2}(EYC|_J|_Y){1,1}.*',
|
'wettk_reg' : '^[0-9]{2,2}(EYC|_J|_Y){1,1}.*',
|
||||||
'serie_reg' : '^[0-9]{2,2}_EYC',
|
'serie_reg' : '^[0-9]{2,2}_EYC',
|
||||||
'rang_title': '',
|
'rang_title': '',
|
||||||
'bgcolor' : '#D8E8FF',
|
'bgcolor' : '#D8E8FF',
|
||||||
'cat_id' : [71,258]
|
'cat_id' : [71,258]
|
||||||
},
|
},
|
||||||
|
'champandgames': {
|
||||||
|
'label': 'Championships and Games',
|
||||||
|
'nation': 'ICC',
|
||||||
|
'bgcolor' : '#B8C8FF',
|
||||||
|
'cat_id': [68,86]
|
||||||
|
},
|
||||||
|
|
||||||
'masters' : {
|
'masters' : {
|
||||||
'label' : 'Masters',
|
'label' : 'Masters and Promo Events',
|
||||||
'nation' : '',
|
'nation' : 'ICC',
|
||||||
'wettk_reg' : '^[0-9]{2,2}_[^PWERASL]{1}.*',
|
'wettk_reg' : '^[0-9]{2,2}_[^PWERASL]{1}.*',
|
||||||
// 'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*',
|
// 'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*',
|
||||||
// 'rang_title': 'CUWR continuously updated WORLDRANKING',
|
// 'rang_title': 'CUWR continuously updated WORLDRANKING',
|
||||||
|
@ -72,18 +88,27 @@ Window {
|
||||||
'cat_id' : [70]
|
'cat_id' : [70]
|
||||||
},
|
},
|
||||||
'para' : {
|
'para' : {
|
||||||
'label' : 'Paraclimbing',
|
'label' : 'Paraclimbing Events',
|
||||||
'nation' : '',
|
'nation' : 'ICC',
|
||||||
'wettk_reg' : '^[0-9]{2,2}_PE.*',
|
'wettk_reg' : '^[0-9]{2,2}_PE.*',
|
||||||
'bgcolor' : '#F0F0F0',
|
'bgcolor' : '#F0F0F0',
|
||||||
'cat_id' : [256,259]
|
'cat_id' : [256,259]
|
||||||
},
|
},
|
||||||
'ger_boulder' : {
|
'cont': {
|
||||||
|
'label' : 'Continental Events',
|
||||||
|
'nation' : 'ICC',
|
||||||
|
'bgcolor' : '#B8C8FF',
|
||||||
|
'cat_id' : [262]
|
||||||
|
},
|
||||||
|
|
||||||
|
// --- GER ---
|
||||||
|
|
||||||
|
/*'ger_boulder' : {
|
||||||
'label' : 'Bouldern',
|
'label' : 'Bouldern',
|
||||||
'nation' : 'GER',
|
'nation' : 'GER',
|
||||||
'wettk_reg' : '^[0-9]{2,2}_B+.*',
|
'wettk_reg' : '^[0-9]{2,2}_B+.*',
|
||||||
'serie_reg' : '^[0-9]{2,2}_BC',
|
'serie_reg' : '^[0-9]{2,2}_BC',
|
||||||
'bgcolor' : '#FFDBA8',
|
'bgcolor' : '#FFDBA8', //'#f59d30'
|
||||||
'cat_id' : [59]
|
'cat_id' : [59]
|
||||||
},
|
},
|
||||||
'ger' : {
|
'ger' : {
|
||||||
|
@ -91,7 +116,7 @@ Window {
|
||||||
'nation' : 'GER',
|
'nation' : 'GER',
|
||||||
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*',
|
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*',
|
||||||
'serie_reg' : '^[0-9]{2,2}_DC',
|
'serie_reg' : '^[0-9]{2,2}_DC',
|
||||||
'bgcolor' : '#A8F0A8',
|
'bgcolor' : '#A8F0A8', //'#69b9a9'
|
||||||
'cat_id' : [57]
|
'cat_id' : [57]
|
||||||
},
|
},
|
||||||
'ger_speed' : {
|
'ger_speed' : {
|
||||||
|
@ -100,17 +125,24 @@ Window {
|
||||||
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*',
|
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*',
|
||||||
'serie_reg' : '',
|
'serie_reg' : '',
|
||||||
'rang_title': '',
|
'rang_title': '',
|
||||||
'bgcolor' : '#A8F0A8',
|
'bgcolor' : '#A8F0A8', //'#e72e5d'
|
||||||
'cat_id' : [60]
|
'cat_id' : [60]
|
||||||
|
},*/
|
||||||
|
'ger_meisterschaft' : {
|
||||||
|
'label' : 'Deutsche Meisterschaft',
|
||||||
|
'nation' : 'GER',
|
||||||
|
'bgcolor' : '#A8F0A8',
|
||||||
|
'cat_id' : [57, 59, 60]
|
||||||
},
|
},
|
||||||
|
|
||||||
'ger_jugend' : {
|
'ger_jugend' : {
|
||||||
'label' : 'Jugend',
|
'label' : 'Deutscher Jugendcup',
|
||||||
'nation' : 'GER',
|
'nation' : 'GER',
|
||||||
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WL]+.*',
|
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WL]+.*',
|
||||||
'serie_reg' : '^[0-9]{2,2}_JC',
|
'serie_reg' : '^[0-9]{2,2}_JC',
|
||||||
// 'rang_title': 'Deutsche Jugend RANGLISTE',
|
// 'rang_title': 'Deutsche Jugend RANGLISTE',
|
||||||
'bgcolor' : '#D8FFD8',
|
'bgcolor' : '#D8FFD8',
|
||||||
'cat_id' : [57,58]
|
'cat_id' : [58]
|
||||||
},
|
},
|
||||||
'ger_state' : {
|
'ger_state' : {
|
||||||
'label' : 'Landesmeisterschaft',
|
'label' : 'Landesmeisterschaft',
|
||||||
|
@ -121,6 +153,9 @@ Window {
|
||||||
'bgcolor' : '#F0F0F0',
|
'bgcolor' : '#F0F0F0',
|
||||||
'cat_id' : [61,56]
|
'cat_id' : [61,56]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// --- SUI ---
|
||||||
|
|
||||||
'sui' : {
|
'sui' : {
|
||||||
'label' : 'Erwachsene',
|
'label' : 'Erwachsene',
|
||||||
'nation' : 'SUI',
|
'nation' : 'SUI',
|
||||||
|
@ -162,6 +197,7 @@ Window {
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
//app.openAthlete(53139) // dorian: 53139 , rustam: 6933 , helen: 53300
|
//app.openAthlete(53139) // dorian: 53139 , rustam: 6933 , helen: 53300
|
||||||
//openWidget({nation:'GER'})
|
//openWidget({nation:'GER'})
|
||||||
|
//mainStack.push("Pages/AthleteSearchPage.qml")
|
||||||
}
|
}
|
||||||
|
|
||||||
Shortcut {
|
Shortcut {
|
||||||
|
@ -178,6 +214,10 @@ Window {
|
||||||
id: serverConn
|
id: serverConn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AppSettings {
|
||||||
|
id: appSettings
|
||||||
|
}
|
||||||
|
|
||||||
StackView {
|
StackView {
|
||||||
id: mainStack
|
id: mainStack
|
||||||
|
|
||||||
|
@ -357,8 +397,20 @@ Window {
|
||||||
|
|
||||||
height: parent.height
|
height: parent.height
|
||||||
|
|
||||||
onItemChanged: {
|
onStatusChanged: {
|
||||||
width = status === Loader.Ready ? item.width:0
|
//console.log("loader status changed: " + status)
|
||||||
|
|
||||||
|
if(status == 0){
|
||||||
|
extraComponentLoader.Layout.preferredWidth = 0
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
extraComponentLoader.item.width = extraComponentLoader.item.implicitWidth
|
||||||
|
extraComponentLoader.Layout.preferredWidth = extraComponentLoader.item.width
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//console.log("set loader width to: " + extraComponentLoader.Layout.preferredWidth + " for a item width of: " + extraComponentLoader.item.implicitWidth)
|
||||||
}
|
}
|
||||||
|
|
||||||
//sourceComponent: mainStack.currentItem.headerComponent
|
//sourceComponent: mainStack.currentItem.headerComponent
|
||||||
|
|
BIN
resources/shared/icons/bluerock/20x20/filter.png
Normal file
After Width: | Height: | Size: 309 B |
BIN
resources/shared/icons/bluerock/20x20/year.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
resources/shared/icons/bluerock/20x20@2/filter.png
Normal file
After Width: | Height: | Size: 545 B |
BIN
resources/shared/icons/bluerock/20x20@2/year.png
Normal file
After Width: | Height: | Size: 591 B |
BIN
resources/shared/icons/bluerock/20x20@3/filter.png
Normal file
After Width: | Height: | Size: 691 B |
BIN
resources/shared/icons/bluerock/20x20@3/year.png
Normal file
After Width: | Height: | Size: 727 B |
BIN
resources/shared/icons/bluerock/20x20@4/filter.png
Normal file
After Width: | Height: | Size: 806 B |
BIN
resources/shared/icons/bluerock/20x20@4/year.png
Normal file
After Width: | Height: | Size: 767 B |
|
@ -34,5 +34,13 @@
|
||||||
<file>icons/bluerock/20x20@2/calendar.png</file>
|
<file>icons/bluerock/20x20@2/calendar.png</file>
|
||||||
<file>icons/bluerock/20x20@3/calendar.png</file>
|
<file>icons/bluerock/20x20@3/calendar.png</file>
|
||||||
<file>icons/bluerock/20x20@4/calendar.png</file>
|
<file>icons/bluerock/20x20@4/calendar.png</file>
|
||||||
|
<file>icons/bluerock/20x20/filter.png</file>
|
||||||
|
<file>icons/bluerock/20x20/year.png</file>
|
||||||
|
<file>icons/bluerock/20x20@2/filter.png</file>
|
||||||
|
<file>icons/bluerock/20x20@2/year.png</file>
|
||||||
|
<file>icons/bluerock/20x20@3/filter.png</file>
|
||||||
|
<file>icons/bluerock/20x20@3/year.png</file>
|
||||||
|
<file>icons/bluerock/20x20@4/filter.png</file>
|
||||||
|
<file>icons/bluerock/20x20@4/year.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
68
sources/appsettings.cpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include "headers/appsettings.h"
|
||||||
|
|
||||||
|
AppSettings::AppSettings(QObject* parent)
|
||||||
|
:QObject(parent)
|
||||||
|
{
|
||||||
|
// This is the Constructor of the AppSettings class
|
||||||
|
|
||||||
|
// get writable path to store the settings.ini file
|
||||||
|
QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
|
||||||
|
|
||||||
|
qDebug() << "app settings path: " << path;
|
||||||
|
|
||||||
|
// create or open the settings.ini file
|
||||||
|
this->settingsManager = new QSettings(path+"/settings.ini", QSettings::IniFormat);
|
||||||
|
|
||||||
|
// set the values to their defaults if they haven't been created yet
|
||||||
|
|
||||||
|
// create or open the settings.ini file
|
||||||
|
this->themeSettingsManager = new QSettings(":/themes/" + this->read("theme") + ".ini", QSettings::IniFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AppSettings::read(const QString &key)
|
||||||
|
{
|
||||||
|
// function to read values from the settings file
|
||||||
|
|
||||||
|
// open the value-group
|
||||||
|
this->settingsManager->beginGroup("AppSettings");
|
||||||
|
// read the value
|
||||||
|
QString value = this->settingsManager->value(key , false).toString();
|
||||||
|
// close the value-group
|
||||||
|
this->settingsManager->endGroup();
|
||||||
|
// return the value
|
||||||
|
return(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppSettings::write(const QString &key, const QVariant &value)
|
||||||
|
{
|
||||||
|
// function to write values to the settings file
|
||||||
|
|
||||||
|
// open the value-group
|
||||||
|
this->settingsManager->beginGroup("AppSettings");
|
||||||
|
// write the value
|
||||||
|
this->settingsManager->setValue(key, value);
|
||||||
|
// close the value-group
|
||||||
|
this->settingsManager->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppSettings::setDefault(const QString &key, const QVariant &defaultValue)
|
||||||
|
{
|
||||||
|
// function to create a key (/ setting) with a default value if it hasnt been ceated yet
|
||||||
|
|
||||||
|
// read the current value
|
||||||
|
QString value = this->read(key);
|
||||||
|
if(value == "false"){
|
||||||
|
// if it is nor defined yet, the read function will return "false" (as a string)
|
||||||
|
// -> if that is the case -> create the key with the default value
|
||||||
|
this->write(key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
AppSettings::~AppSettings()
|
||||||
|
{
|
||||||
|
// This is the Destructor of the AppSettings class
|
||||||
|
|
||||||
|
// delete the settings manager
|
||||||
|
delete settingsManager;
|
||||||
|
}
|
|
@ -23,6 +23,7 @@
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
|
|
||||||
#include "headers/serverconn.h"
|
#include "headers/serverconn.h"
|
||||||
|
#include "headers/appsettings.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -36,6 +37,7 @@ int main(int argc, char *argv[])
|
||||||
QIcon::setThemeName("bluerock");
|
QIcon::setThemeName("bluerock");
|
||||||
|
|
||||||
qmlRegisterType<ServerConn>("com.itsblue.digitalRockRanking", 1, 0, "ServerConn");
|
qmlRegisterType<ServerConn>("com.itsblue.digitalRockRanking", 1, 0, "ServerConn");
|
||||||
|
qmlRegisterType<AppSettings>("com.itsblue.digitalRockRanking", 1, 0, "AppSettings");
|
||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
|
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
|
||||||
|
|
|
@ -22,70 +22,29 @@ ServerConn::ServerConn(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant ServerConn::getCalendar(QString nation, int year){
|
|
||||||
QString requestUrl = "http://egw.ifsc-climbing.org/egw/ranking/json.php?year=" + (year == 0 ? "":QString::number(year)) + "&nation=" + nation;
|
|
||||||
qDebug() << requestUrl;
|
|
||||||
|
|
||||||
QVariantMap ret = this->senddata(QUrl(requestUrl));
|
|
||||||
|
|
||||||
if(ret["status"] != 200){
|
|
||||||
// request was a failure
|
|
||||||
return QVariantMap({{"status", ret["status"]}, {"data", ""}});
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonDocument jsonReply = QJsonDocument::fromJson(ret["text"].toString().toUtf8());
|
|
||||||
|
|
||||||
QVariantMap rankingData = {{"status", 200}, {"data", jsonReply.toVariant()}};
|
|
||||||
|
|
||||||
return rankingData;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant ServerConn::getRanking(int competiotionId, int categoryId, bool registrationData, bool rankingData, int routeNumber) {
|
|
||||||
|
|
||||||
QString requestUrl = "http://egw.ifsc-climbing.org/egw/ranking/json.php?" + QString(rankingData ? "cup":"comp") + "=" + QString::number( competiotionId ) + "&cat=" + QString::number( categoryId ) + (registrationData ? "&type=starters":"") + "&route=" + ((routeNumber == -2) ? "":QString::number(routeNumber));
|
|
||||||
|
|
||||||
qDebug() << requestUrl;
|
|
||||||
|
|
||||||
QVariantMap ret = this->senddata(QUrl(requestUrl));
|
|
||||||
|
|
||||||
if(ret["status"] != 200){
|
|
||||||
// request was a failure
|
|
||||||
return QVariantMap({{"status", ret["status"]}, {"data", ""}});
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonDocument jsonReply = QJsonDocument::fromJson(ret["text"].toString().toUtf8());
|
|
||||||
|
|
||||||
QVariantMap data = {{"status", 200}, {"data", jsonReply.toVariant()}};
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant ServerConn::getAthlete(int perId){
|
|
||||||
QString requestUrl = "http://egw.ifsc-climbing.org/egw/ranking/json.php?person=" + QString::number(perId);
|
|
||||||
|
|
||||||
qDebug() << requestUrl;
|
|
||||||
|
|
||||||
QVariantMap ret = this->senddata(QUrl(requestUrl));
|
|
||||||
|
|
||||||
if(ret["status"] != 200){
|
|
||||||
// request was a failure
|
|
||||||
return QVariantMap({{"status", ret["status"]}, {"data", ""}});
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonDocument jsonReply = QJsonDocument::fromJson(ret["text"].toString().toUtf8());
|
|
||||||
|
|
||||||
QVariantMap data = {{"status", 200}, {"data", jsonReply.toVariant()}};
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant ServerConn::getWidgetData(QVariantMap params){
|
QVariant ServerConn::getWidgetData(QVariantMap params){
|
||||||
QString requestUrl = "http://egw.ifsc-climbing.org/egw/ranking/json.php?";
|
QString requestUrl;
|
||||||
|
if(params["nation"].toString() == "ICC"){
|
||||||
|
requestUrl = "https://ifsc-egw.wavecdn.net/egw/ranking/json.php?";
|
||||||
|
params["nation"] = "";
|
||||||
|
}
|
||||||
|
else if (params["nation"].toString() == "GER") {
|
||||||
|
requestUrl = "https://www.digitalrock.de/egroupware/ranking/json.php?";
|
||||||
|
}
|
||||||
|
else if (params["nation"].toString() == "SUI") {
|
||||||
|
requestUrl = "https://www.digitalrock.de/egroupware/ranking/json.php?";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
params.remove("nation");
|
||||||
|
requestUrl = "https://www.digitalrock.de/egroupware/ranking/json.php?";
|
||||||
|
}
|
||||||
|
|
||||||
for(QVariantMap::const_iterator iter = params.begin(); iter != params.end(); ++iter){
|
for(QVariantMap::const_iterator iter = params.begin(); iter != params.end(); ++iter){
|
||||||
requestUrl += iter.key() + "=" + iter.value().toString() + "&";
|
requestUrl += iter.key() + "=" + iter.value().toString() + "&";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
requestUrl = requestUrl.left(requestUrl.length() - 1); // remove last &
|
||||||
|
|
||||||
qDebug() << requestUrl;
|
qDebug() << requestUrl;
|
||||||
|
|
||||||
QVariantMap ret = this->senddata(QUrl(requestUrl));
|
QVariantMap ret = this->senddata(QUrl(requestUrl));
|
||||||
|
|