2019-05-11 15:21:43 +02:00
/ *
blueROCK - for digital rock
Copyright ( C ) 2019 Dorian Zedler
This program is free software: you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http: //www.gnu.org/licenses/>.
* /
2019-04-20 22:57:40 +02:00
import QtQuick 2.9
import QtQuick . Window 2.2
import QtQuick . Controls 2.4
import com . itsblue . digitalRockRanking 1.0
import "./Pages"
import "./Components"
Window {
visible: true
width: 540
height: 960
2019-04-27 22:48:06 +02:00
title: qsTr ( "blueROCK" )
2019-04-20 22:57:40 +02:00
Page {
id: app
2019-04-22 12:38:23 +02:00
property int errorCode: - 1
2019-04-20 22:57:40 +02:00
property var competitionCategoryColors: {
"61" : "lightgrey" ,
"58" : "lightgreen" ,
"69" : "#B8C8FF" ,
"70" : "#F0F0F0" ,
"71" : "#D8E8FF" ,
"256" : "#D8E8FF"
}
2019-05-14 18:18:42 +02:00
property var compCats: {
'int' : {
'label' : 'International' ,
'nation' : '' ,
'wettk_reg' : '^[0-9]{2,2}[_^E]{1}[^YJ]{1,1}.*' ,
'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*' ,
'rang_title' : 'CUWR continuously updated WORLDRANKING' ,
'bgcolor' : '#B8C8FF' ,
'nat_team_ranking' : '' ,
'cat_id' : [ 68 , 69 , 70 , 86 , 259 ]
} ,
'youth' : {
'label' : 'Int. Jugend' ,
'nation' : '' ,
'wettk_reg' : '^[0-9]{2,2}(EYC|_J|_Y){1,1}.*' ,
'serie_reg' : '^[0-9]{2,2}_EYC' ,
'rang_title' : '' ,
'bgcolor' : '#D8E8FF' ,
'cat_id' : [ 71 , 258 ]
} ,
'masters' : {
'label' : 'Masters' ,
'nation' : '' ,
'wettk_reg' : '^[0-9]{2,2}_[^PWERASL]{1}.*' ,
// 'serie_reg' : '^[0-9]{2,2}_(WC|TR){1,1}.*',
// 'rang_title': 'CUWR continuously updated WORLDRANKING',
'bgcolor' : '#F0F0F0' ,
'cat_id' : [ 70 ]
} ,
'para' : {
'label' : 'Paraclimbing' ,
'nation' : '' ,
'wettk_reg' : '^[0-9]{2,2}_PE.*' ,
'bgcolor' : '#F0F0F0' ,
'cat_id' : [ 256 , 259 ]
} ,
'ger_boulder' : {
'label' : 'Bouldern' ,
'nation' : 'GER' ,
'wettk_reg' : '^[0-9]{2,2}_B+.*' ,
'serie_reg' : '^[0-9]{2,2}_BC' ,
'bgcolor' : '#FFDBA8' ,
'cat_id' : [ 59 ]
} ,
'ger' : {
'label' : 'Lead' ,
'nation' : 'GER' ,
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*' ,
'serie_reg' : '^[0-9]{2,2}_DC' ,
'bgcolor' : '#A8F0A8' ,
'cat_id' : [ 57 ]
} ,
'ger_speed' : {
'label' : 'Speed' ,
'nation' : 'GER' ,
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WLJ]+.*' ,
'serie_reg' : '' ,
'rang_title' : '' ,
'bgcolor' : '#A8F0A8' ,
'cat_id' : [ 60 ]
} ,
'ger_jugend' : {
'label' : 'Jugend' ,
'nation' : 'GER' ,
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}[^WL]+.*' ,
'serie_reg' : '^[0-9]{2,2}_JC' ,
// 'rang_title': 'Deutsche Jugend RANGLISTE',
'bgcolor' : '#D8FFD8' ,
'cat_id' : [ 57 , 58 ]
} ,
'ger_state' : {
'label' : 'Landesmeisterschaft' ,
'nation' : 'GER' ,
'wettk_reg' : '^[0-9]{2,2}[_J]{1,1}LM.*' ,
'serie_reg' : '^[0-9]{2,2}[_J]{1,1}LM.*' ,
'rang_title' : '' ,
'bgcolor' : '#F0F0F0' ,
'cat_id' : [ 61 , 56 ]
} ,
'sui' : {
'label' : 'Erwachsene' ,
'nation' : 'SUI' ,
'wettk_reg' : '^[0-9]{2,2}_[^R].*' ,
'serie_reg' : '.*' ,
'rang_title' : 'SWISS RANKING' ,
'bgcolor' : '#A8F0A8' ,
'cat_id' : [ 62 , 63 ]
} ,
'sui_jugend' : {
'label' : 'Jugend' ,
'nation' : 'SUI' ,
'wettk_reg' : '^[0-9]{2,2}_[^R].*' ,
'serie_reg' : '.*' ,
'rang_title' : 'SWISS RANKING' ,
'bgcolor' : '#D8FFD8' ,
'cat_id' : [ 65 ]
} ,
'sui_local' : {
'label' : 'RegioCups' ,
'nation' : 'SUI' ,
'wettk_reg' : '^[0-9]{2,2}_RG_.*' ,
'rang_title' : '' ,
'bgcolor' : '#F0F0F0' ,
'cat_id' : [ 64 ]
} ,
'sui_ice' : {
'label' : 'Iceclimbing' ,
'nation' : 'SUI' ,
'wettk_reg' : '^[0-9]{2,2}_RC_.*' ,
'rang_title' : '' ,
'bgcolor' : '#F0F0F0' ,
'cat_id' : [ 84 ]
}
}
2019-04-20 22:57:40 +02:00
anchors.fill: parent
2019-05-12 21:33:22 +02:00
Component.onCompleted: {
//app.openAthlete(53139) // dorian: 53139 , rustam: 6933 , helen: 53300
}
2019-04-20 22:57:40 +02:00
Shortcut {
sequences: [ "Esc" , "Back" ]
enabled: mainStack . depth > 1
onActivated: {
if ( ! mainStack . currentItem . locked ) {
mainStack . pop ( )
}
}
}
ServerConn {
id: serverConn
Component.onCompleted: {
//serverConn.refreshFoodplan()
}
}
StackView {
id: mainStack
2019-05-11 15:16:23 +02:00
//enabled: !loadingDl.opened
2019-04-22 12:38:23 +02:00
2019-04-20 22:57:40 +02:00
anchors {
top: toolBar . bottom
left: parent . left
right: parent . right
bottom: parent . bottom
}
initialItem: startPgComp
Component {
id: startPgComp
StartPage { }
}
popEnter: Transition {
XAnimator {
from: ( mainStack . mirrored ? - 1 : 1 ) * - mainStack . width
to: 0
duration: 500
easing.type: Easing . OutCubic
}
}
popExit: Transition {
XAnimator {
from: 0
to: ( mainStack . mirrored ? - 1 : 1 ) * mainStack . width
duration: 500
easing.type: Easing . OutCubic
}
}
pushEnter: Transition {
XAnimator {
from: ( mainStack . mirrored ? - 1 : 1 ) * mainStack . width
to: 0
duration: 500
easing.type: Easing . OutCubic
}
}
pushExit: Transition {
XAnimator {
from: 0
to: ( mainStack . mirrored ? - 1 : 1 ) * - mainStack . width
duration: 500
easing.type: Easing . OutCubic
}
}
}
AppToolBar {
id: toolBar
anchors {
top: parent . top
left: parent . left
right: parent . right
2019-04-22 12:38:23 +02:00
topMargin: - height
2019-04-20 22:57:40 +02:00
}
height: 50
2019-04-22 12:38:23 +02:00
showErrorBar: true
2019-04-21 18:35:28 +02:00
Row {
anchors.fill: parent
spacing: width * 0.02
Item {
id: spacer
width: 1
height: parent . height
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
Button {
id:toolButton
anchors {
verticalCenter: parent . verticalCenter
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
height: parent . height * 0.5
width: height
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
onClicked: {
if ( ! mainStack . currentItem . locked ) {
mainStack . pop ( )
2019-04-20 22:57:40 +02:00
}
}
2019-04-21 18:35:28 +02:00
onPressed: toolButton . scale = 0.9
onReleased: toolButton . scale = 1.0
background: Image {
source: "qrc:/icons/backDark.png"
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
height: parent . height
width: height
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
fillMode: Image . PreserveAspectFit
Behavior on scale {
PropertyAnimation {
duration: 100
}
}
}
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
Column {
anchors.verticalCenter: parent . verticalCenter
height: childrenRect . height
2019-04-22 12:38:23 +02:00
width: parent . width - extraComponentLoader . width - toolButton . width - 3 * parent . spacing
2019-04-21 18:35:28 +02:00
Label {
id: toolBarTitleLa
2019-04-20 22:57:40 +02:00
2019-04-22 12:38:23 +02:00
width: parent . width
2019-05-12 21:33:22 +02:00
scale: 1
2019-04-21 18:35:28 +02:00
elide: "ElideRight"
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
font.bold: true
2019-04-22 12:38:23 +02:00
verticalAlignment: Text . AlignVCenter
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
color: "black"
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
text: getText ( )
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
function getText ( ) {
var titleString = "" ;
if ( ! mainStack . currentItem . titleIsPageTitle ) {
for ( var i = 1 ; i < mainStack . depth ; i ++ ) {
if ( i > 1 ) {
titleString += " > "
}
titleString += mainStack . get ( i ) . title
}
}
else {
titleString = mainStack . currentItem . title
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
return ( titleString )
2019-04-20 22:57:40 +02:00
}
2019-05-12 21:33:22 +02:00
Behavior on text {
FadeAnimation {
target: toolBarTitleLa
}
}
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
Label {
id: toolBarSubTitleLa
2019-04-20 22:57:40 +02:00
2019-04-22 12:38:23 +02:00
width: parent . width
height: text !== "" ? undefined: 0
2019-04-20 22:57:40 +02:00
2019-05-11 15:16:23 +02:00
elide: "ElideRight"
2019-04-21 18:35:28 +02:00
font.bold: false
color: "black"
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
text: getText ( )
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
function getText ( ) {
var titleString = "" ;
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
if ( mainStack . currentItem . subTitle !== undefined ) {
titleString = mainStack . currentItem . subTitle
}
return ( titleString )
}
2019-05-12 21:33:22 +02:00
Behavior on text {
FadeAnimation {
target: toolBarSubTitleLa
}
}
2019-04-21 18:35:28 +02:00
}
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
}
Loader {
id: extraComponentLoader
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
height: parent . height
2019-04-27 22:48:06 +02:00
width: status === Loader . Ready ? parent . width * 0.4 - toolButton . width - 3 * parent.spacing: 0
2019-04-20 22:57:40 +02:00
2019-04-21 18:35:28 +02:00
anchors {
top: parent . top
bottom: parent . bottom
2019-04-20 22:57:40 +02:00
}
2019-05-12 21:33:22 +02:00
//sourceComponent: mainStack.currentItem.headerComponent
Connections {
target: mainStack
onCurrentItemChanged: {
disappearNa . start ( )
}
}
ParallelAnimation {
id: appearNa
NumberAnimation {
target: extraComponentLoader
property: "opacity"
from: 0
to: 1
duration: 150
}
NumberAnimation {
target: extraComponentLoader
property: "scale"
from: 0.9
to: 1
duration: 150
}
}
ParallelAnimation {
id: disappearNa
NumberAnimation {
target: extraComponentLoader
property: "opacity"
from: 1
to: 0
duration: 150
}
NumberAnimation {
target: extraComponentLoader
property: "scale"
from: 1
to: 0.9
duration: 150
}
onRunningChanged: {
if ( ! running ) {
extraComponentLoader . sourceComponent = mainStack . currentItem . headerComponent
appearNa . start ( )
}
}
}
2019-04-20 22:57:40 +02:00
}
2019-04-21 18:35:28 +02:00
2019-04-20 22:57:40 +02:00
}
Behavior on anchors . topMargin {
NumberAnimation {
duration: 500
easing.type: Easing . OutCubic
}
}
states: [
State {
name: "closed"
when: mainStack . depth === 1
PropertyChanges {
target: toolBar
2019-04-22 12:38:23 +02:00
anchors.topMargin: - height
2019-04-20 22:57:40 +02:00
}
} ,
State {
name: "open"
when: mainStack . depth > 1
PropertyChanges {
target: toolBar
anchors.topMargin: 0
}
}
]
}
Dialog {
id: loadingDl
x: ( app . width - width ) / 2
y: ( app . height - height ) / 2
modal: true
closePolicy: Dialog . NoAutoClose
contentItem: Column {
FancyBusyIndicator {
running: true
}
Label {
anchors.horizontalCenter: parent . horizontalCenter
font.bold: true
text: "loading..."
}
}
}
function landscape ( ) {
return app . height < app . width
}
function openCalendar ( nation ) {
2019-05-11 15:16:23 +02:00
loadingDl . open ( )
2019-04-22 12:38:23 +02:00
var calComp = Qt . createComponent ( "qrc:/Pages/CompetitionCalendarPage.qml" ) . createObject ( null , { "nation" : nation } )
app . errorCode = calComp . status
if ( calComp . ready ) {
mainStack . push ( calComp )
}
else {
delete ( calComp )
}
2019-05-11 15:16:23 +02:00
loadingDl . close ( )
2019-04-20 22:57:40 +02:00
}
2019-04-22 12:38:23 +02:00
function openResults ( comp , cat , status ) {
2019-04-20 22:57:40 +02:00
// comp: (int) competiotion ID
// cat: (int) category ID
2019-04-22 12:38:23 +02:00
// reg: (int) 0: result imported into ranking; 1: result-service result available; 2: result-service startlist available; 3: old non result-server startlist (no longer used); 4: starters / registration data
2019-04-20 22:57:40 +02:00
2019-04-22 12:38:23 +02:00
loadingDl . open ( )
var rankComp = Qt . createComponent ( "qrc:/Pages/RankingPage.qml" ) . createObject ( null , { "comId" : comp , "catId" : cat , "catStatus" : status } )
app . errorCode = rankComp . status
if ( rankComp . ready ) {
mainStack . push ( rankComp )
}
else {
delete ( rankComp )
}
loadingDl . close ( )
2019-04-20 22:57:40 +02:00
}
2019-05-12 21:33:22 +02:00
function openAthlete ( perId ) {
loadingDl . open ( )
var athleteComp = Qt . createComponent ( "qrc:/Pages/AthleteProfilePage.qml" ) . createObject ( null , { "perId" : perId } )
app . errorCode = athleteComp . status
if ( athleteComp . ready ) {
mainStack . push ( athleteComp )
}
else {
delete ( athleteComp )
}
loadingDl . close ( )
}
2019-04-20 22:57:40 +02:00
function getErrorInfo ( errorCode ) {
var infoLevel
// 0 - ok
// 1 - info
// 2 - error
var errorString
var errorDescription
switch ( errorCode ) {
case 0 :
infoLevel = 2
errorString = "No connection to server"
errorDescription = "Please check your internet connection and try again."
break
2019-04-22 12:38:23 +02:00
case 200 :
infoLevel = 0
errorString = "Success"
errorDescription = "The request was successfull"
break
2019-04-20 22:57:40 +02:00
case 401 :
infoLevel = 2
errorString = "Authentication required"
errorDescription = "The server asked for user credentinals, please chack them and try again"
break
case 500 :
infoLevel = 2
errorString = "Internal server error"
errorDescription = "The server was unable to process this request, this is probaply the servers vault. Please try again later."
break
case 900 :
infoLevel = 2
errorString = "Internal processing error"
errorDescription = "The server has sent some data that could ot be processed. Please try again later"
break
case 901 :
infoLevel = 1
errorString = "No Data"
errorDescription = "There is currently no data available. Please try again later."
break
case 902 :
infoLevel = 1
2019-04-22 12:38:23 +02:00
errorString = "Cached (old) data"
2019-04-20 22:57:40 +02:00
errorDescription = "Es konnte keine Verbindung zum Server hergestellt werden, aber es sind noch alte Daten gespeichert."
break
case 903 :
infoLevel = 1
errorString = "Ungültiger Aufruf"
errorDescription = "Die aufgerufene Funktion ist momentan nicht verfügbar, bitte versuche es später erneut."
break
case 904 :
infoLevel = 2
errorString = "Incompatible API"
errorDescription = "Please make shure that you are using the latest version of this app and try again."
break
2019-04-21 12:35:11 +02:00
case 905 :
infoLevel = 1
errorString = "Loading..."
errorDescription = "Please wait while we're loading some data"
break
2019-04-20 22:57:40 +02:00
default:
infoLevel = 2
errorString = "Unexpected error (" + errorCode + ")"
errorDescription = "Unexpected error while getting data from the server. Please try again later."
}
return ( [ infoLevel , errorString , errorDescription ] )
}
}
}