diff --git a/SpeedClimbingReactionTrainer.pro b/SpeedClimbingReactionTrainer.pro
index e89aeed..e2cf3c6 100644
--- a/SpeedClimbingReactionTrainer.pro
+++ b/SpeedClimbingReactionTrainer.pro
@@ -6,6 +6,12 @@ android {
CONFIG += c++11
+TARGET = ScStwRt
+VERSION = 1.2.0
+
+# Add version to define
+DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\"
+
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
@@ -41,7 +47,33 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
android {
- ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
+ ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
+ DISTFILES += \
+ android/AndroidManifest.xml \
+ android/build.gradle \
+ android/gradle.properties \
+ android/gradle/wrapper/gradle-wrapper.jar \
+ android/gradle/wrapper/gradle-wrapper.properties \
+ android/gradlew \
+ android/gradlew.bat \
+ android/res/values/libs.xml
+
+ defineReplace(droidVersionCode) {
+ segments = $$split(1, ".")
+ for (segment, segments): vCode = "$$first(vCode)$$format_number($$segment, width=3 zeropad)"
+
+ contains(ANDROID_TARGET_ARCH, arm64-v8a): \
+ suffix = 1
+ else:contains(ANDROID_TARGET_ARCH, armeabi-v7a): \
+ suffix = 0
+ # add more cases as needed
+
+ return($$first(vCode)$$first(suffix))
+ }
+
+ ANDROID_VERSION_NAME = $$VERSION
+ ANDROID_VERSION_CODE = $$droidVersionCode($$ANDROID_VERSION_NAME)
+ ANDROID_TARGET_SDK_VERSION = 30
}
ios {
@@ -51,6 +83,5 @@ ios {
QMAKE_INFO_PLIST = ios/Info.plist
}
-DISTFILES += \
- android-sources/AndroidManifest.xml
-
+# this has to be the last line!
+ANDROID_ABIS = armeabi-v7a arm64-v8a
diff --git a/android-sources/res/drawable-hdpi/icon.png b/android-sources/res/drawable-hdpi/icon.png
deleted file mode 100644
index c98ba7e..0000000
Binary files a/android-sources/res/drawable-hdpi/icon.png and /dev/null differ
diff --git a/android-sources/res/drawable-ldpi/icon.png b/android-sources/res/drawable-ldpi/icon.png
deleted file mode 100644
index c98ba7e..0000000
Binary files a/android-sources/res/drawable-ldpi/icon.png and /dev/null differ
diff --git a/android-sources/res/drawable-mdpi/icon.png b/android-sources/res/drawable-mdpi/icon.png
deleted file mode 100644
index c98ba7e..0000000
Binary files a/android-sources/res/drawable-mdpi/icon.png and /dev/null differ
diff --git a/android-sources/AndroidManifest.xml b/android/AndroidManifest.xml
similarity index 69%
rename from android-sources/AndroidManifest.xml
rename to android/AndroidManifest.xml
index d4da551..4d56fe3 100644
--- a/android-sources/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -1,44 +1,54 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
+
-
+
-
-
-
+
+
+
+
-
+
+
+
-
-
-
-
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..443a800
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,77 @@
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.6.0'
+ }
+}
+
+repositories {
+ google()
+ jcenter()
+}
+
+apply plugin: 'com.android.application'
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
+}
+
+android {
+ /*******************************************************
+ * The following variables:
+ * - androidBuildToolsVersion,
+ * - androidCompileSdkVersion
+ * - qt5AndroidDir - holds the path to qt android files
+ * needed to build any Qt application
+ * on Android.
+ *
+ * are defined in gradle.properties file. This file is
+ * updated by QtCreator and androiddeployqt tools.
+ * Changing them manually might break the compilation!
+ *******************************************************/
+
+ compileSdkVersion androidCompileSdkVersion.toInteger()
+
+ buildToolsVersion '28.0.3'
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
+ aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
+ res.srcDirs = [qt5AndroidDir + '/res', 'res']
+ resources.srcDirs = ['resources']
+ renderscript.srcDirs = ['src']
+ assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+
+ tasks.withType(JavaCompile) {
+ options.incremental = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ // Do not compress Qt binary resources file
+ aaptOptions {
+ noCompress 'rcc'
+ }
+
+ defaultConfig {
+ resConfig "en"
+ minSdkVersion = qtMinSdkVersion
+ targetSdkVersion = qtTargetSdkVersion
+ }
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..fded106
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,11 @@
+# Project-wide Gradle settings.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m
+
+# Gradle caching allows reusing the build artifacts from a previous
+# build with the same inputs. However, over time, the cache size will
+# grow. Uncomment the following line to enable it.
+#org.gradle.caching=true
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..5028f28
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/android/gradlew b/android/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/android/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000..82522c7
Binary files /dev/null and b/android/res/drawable-hdpi/icon.png differ
diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000..3d7076b
Binary files /dev/null and b/android/res/drawable-ldpi/icon.png differ
diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000..d8e1487
Binary files /dev/null and b/android/res/drawable-mdpi/icon.png differ
diff --git a/android/res/drawable-xhdpi/icon.png b/android/res/drawable-xhdpi/icon.png
new file mode 100644
index 0000000..b7374c5
Binary files /dev/null and b/android/res/drawable-xhdpi/icon.png differ
diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png
new file mode 100644
index 0000000..bc18d46
Binary files /dev/null and b/android/res/drawable-xxhdpi/icon.png differ
diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 0000000..85bbfcd
Binary files /dev/null and b/android/res/drawable-xxxhdpi/icon.png differ
diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml
new file mode 100644
index 0000000..6b1a4a2
--- /dev/null
+++ b/android/res/values/libs.xml
@@ -0,0 +1,22 @@
+
+
+
+ - https://download.qt.io/ministro/android/qt5/qt-5.14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/qml/Components/DisclaimerDialog.qml b/qml/Components/DisclaimerDialog.qml
new file mode 100644
index 0000000..f658dde
--- /dev/null
+++ b/qml/Components/DisclaimerDialog.qml
@@ -0,0 +1,59 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.Material 2.15
+
+Dialog {
+ id: control
+
+ title: "Disclaimer"
+ property string content: ""
+
+ parent: Overlay.overlay
+
+ x: (parent.width - width) * 0.5
+ y: (parent.height - height) * 0.5
+
+ implicitWidth: parent.width * 0.9
+
+ implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+ contentHeight + topPadding + bottomPadding
+ + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+ + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+ //width: app.width * 0.8
+ //height: implicitHeight
+
+ modal: true
+
+ standardButtons: Dialog.Close
+
+ header: Label {
+ text: control.title
+ visible: control.title
+ elide: Label.ElideRight
+ padding: 24
+ bottomPadding: 0
+ font.bold: true
+ font.pixelSize: 16
+ background: Rectangle {
+ radius: 2
+ color: control.Material.dialogColor
+ clip: true
+ }
+ onLinkActivated: {
+ Qt.openUrlExternally(link)
+ }
+ }
+
+ contentItem: Label {
+ wrapMode: Text.Wrap
+
+ width: control.parent * 0.8
+
+ text: control.content
+
+ onLinkActivated: {
+ Qt.openUrlExternally(link)
+ }
+ }
+}
diff --git a/qml/main.qml b/qml/main.qml
index ee96ede..0f4af0c 100644
--- a/qml/main.qml
+++ b/qml/main.qml
@@ -19,8 +19,9 @@
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
-import QtMultimedia 5.4
+import QtMultimedia 5.15
import QtGraphicalEffects 1.0
+import QtQuick.Controls.Material 2.15
import com.itsblue.SpeedClimbingStartTrainer 2.0
@@ -57,48 +58,36 @@ Window {
Item {
id: soundsItm
- MediaPlayer {
+ SoundEffect {
id: readySe
- property bool playing: readySe.status === 6
-
source: "qrc:/sounds/ready_1.wav"
- muted: app.state === "WAITING"
+ onPlayingChanged: {
+ if(playing) return
- onStopped: {
if(app.state === "RUNNING"){
startSe.play()
}
}
}
- MediaPlayer {
+ SoundEffect {
id: startSe
- property bool playing: startSe.status === 6
-
source: "qrc:/sounds/IFSC_STARTSIGNAL_SINE.wav"
- muted: app.state === "WAITING"
+ onPlayingChanged: {
+ if(!playing) return
- onStopped: {
- app.startTime = new Date().getTime()
- console.log("offset: ", new Date().getTime() - app.startTime)
-
- if(app.state === "WAITING"){
- app.reactionTime = app.stopTime - app.startTime
- app.state = "STOPPED"
- }
- }
+ app.startTime = new Date().getTime()
+ }
}
- MediaPlayer {
+ SoundEffect {
id: failedSe
- property bool playing: failedSe.status === 6
-
source: "qrc:/sounds/IFSC frequenzy conform false start sound.wav"
}
@@ -187,18 +176,22 @@ Window {
}
}
- Switch {
- anchors {
- top: topLa.bottom
- horizontalCenter: parent.horizontalCenter
- horizontalCenterOffset: width * 0.1
- }
+ Row {
+ anchors {
+ top: topLa.bottom
+ horizontalCenter: parent.horizontalCenter
+ horizontalCenterOffset: width * 0.1
+ }
+
+ opacity: app.state === "IDLE" ? 1:0
+
+ Switch {
+
+ anchors.verticalCenter: parent.verticalCenter
checked: settings.read("theme") === "1"
- scale: 0.8
-
- opacity: app.state === "IDLE" ? 1:0
+ scale: 0.7
onCheckedChanged: {
if(checked){
@@ -246,12 +239,33 @@ Window {
}
}
- Behavior on opacity {
- NumberAnimation {
- duration: 200
- }
+ }
+
+ ToolButton {
+ anchors.verticalCenter: parent.verticalCenter
+ bottomPadding: 0
+ topPadding: 0
+
+ text: "\uf05a"
+
+ scale: 1.2
+
+
+ font.family: fontAwesome.name
+ font.pixelSize: height * 0.4
+
+ Material.theme: theme.style.name === "dark" ? Material.Dark:Material.Light
+ onClicked: infoDisclaimerDialog.open()
+ }
+
+ Behavior on opacity {
+ NumberAnimation {
+ duration: 200
}
+ }
}
+
+
}
FancyButton {
@@ -306,26 +320,33 @@ Window {
return
}
- if(startSe.playing){
- app.state = "WAITING"
+ if(readySe.playing){
+ app.state = "IDLE"
+ return
+ }
+ app.state = "STOPPED"
+ startSe.stop()
+
+ app.reactionTime = app.stopTime - app.startTime - 3000
+
+ if(app.reactionTime < 100) {
failedSe.play()
}
- else if(readySe.playing){
- app.state = "IDLE"
- }
- else {
- app.state = "STOPPED"
-
- app.reactionTime = app.stopTime - app.startTime
-
- app.refreshHighscore()
- }
+ app.refreshHighscore()
}
function refreshHighscore(){
- if(app.reactionTime > 0 && ( app.reactionTime < parseInt(settings.read("highscore")) || settings.read("highscore") === "-1" )){
+ const currentHighscore = parseInt(settings.read("highscore"))
+
+ // migrate old Highscores
+ if(currentHighscore < 100) {
+ settings.write("highscore", currentHighscore+100)
+ app.highscore = currentHighscore + 100
+ }
+
+ if(app.reactionTime > 100 && ( app.reactionTime < currentHighscore || settings.read("highscore") === "-1" )){
settings.write("highscore", app.reactionTime)
app.highscore = app.reactionTime
}
@@ -333,6 +354,7 @@ Window {
function reset() {
app.state = "IDLE"
+ app.startTime = 0
}
states: [
@@ -368,23 +390,26 @@ Window {
target: highscoreLa
text: "highscore: " + app.highscore
}
- },
-
- State {
- name: "WAITING"
- PropertyChanges {
- target: topLa
- text: "please wait..."
- }
-
- PropertyChanges {
- target: startBt
- enabled: false
- text: "waiting..."
- }
}
]
+ FontLoader {
+ id: fontAwesome
+ source: "qrc:/fonts/fa5solid.woff"
+
+ Component.onCompleted: {
+ console.log("Font name: " + fontAwesome.name)
+ }
+ }
+
+ DisclaimerDialog {
+ id: infoDisclaimerDialog
+
+ Material.theme: theme.style.name === "dark" ? Material.Dark:Material.Light
+ title: "Speedclimbing reaction trainer v" + APP_VERSION + "
By Itsblue Development, " + qsTr("privacy policy") + ""
+ content: qsTr("This app was built using the Qt Framework licensed under the GNU lgplV3 license.
This app is open source and licensed under the GNU agplV3 license, the source code can be found here.")
+ }
+
}
}
diff --git a/qml/qml.qrc b/qml/qml.qrc
index 0e60d44..372bf0e 100644
--- a/qml/qml.qrc
+++ b/qml/qml.qrc
@@ -3,5 +3,6 @@
main.qml
Components/FadeAnimation.qml
Components/FancyButton.qml
+ Components/DisclaimerDialog.qml
diff --git a/shared/fonts/fa5solid.woff b/shared/fonts/fa5solid.woff
new file mode 100644
index 0000000..105028f
Binary files /dev/null and b/shared/fonts/fa5solid.woff differ
diff --git a/shared/graphics/SpeedClimbingStartTrainer.xcf b/shared/graphics/SpeedClimbingStartTrainer.xcf
deleted file mode 100644
index f3f3f65..0000000
Binary files a/shared/graphics/SpeedClimbingStartTrainer.xcf and /dev/null differ
diff --git a/shared/graphics/SpeedClimbingStartTrainerNoOutline.png b/shared/graphics/SpeedClimbingStartTrainerNoOutline.png
deleted file mode 100644
index 2edf8ff..0000000
Binary files a/shared/graphics/SpeedClimbingStartTrainerNoOutline.png and /dev/null differ
diff --git a/shared/graphics/favicon.png b/shared/graphics/favicon.png
index c98ba7e..d91d38b 100644
Binary files a/shared/graphics/favicon.png and b/shared/graphics/favicon.png differ
diff --git a/shared/graphics/faviconForGooglePlay.png b/shared/graphics/faviconForGooglePlay.png
deleted file mode 100644
index 2d44424..0000000
Binary files a/shared/graphics/faviconForGooglePlay.png and /dev/null differ
diff --git a/shared/graphics/faviconNoOutline.png b/shared/graphics/faviconNoOutline.png
new file mode 100644
index 0000000..fb59dfe
Binary files /dev/null and b/shared/graphics/faviconNoOutline.png differ
diff --git a/shared/shared.qrc b/shared/shared.qrc
index f780bf6..5c136f4 100644
--- a/shared/shared.qrc
+++ b/shared/shared.qrc
@@ -3,5 +3,6 @@
sounds/ready_1.wav
sounds/IFSC_STARTSIGNAL_SINE.wav
sounds/IFSC frequenzy conform false start sound.wav
+ fonts/fa5solid.woff
diff --git a/sources/apptheme.cpp b/sources/apptheme.cpp
index 6c713c1..dbc1e36 100644
--- a/sources/apptheme.cpp
+++ b/sources/apptheme.cpp
@@ -22,6 +22,7 @@ AppTheme::AppTheme(QObject *parent) : QObject(parent)
{
QVariantMap tmpLightTheme = {
+ {"name", "light"},
{"backgroundColor", "white"},
{"buttonColor", "white"},
@@ -58,6 +59,7 @@ AppTheme::AppTheme(QObject *parent) : QObject(parent)
this->themes.append(tmpLightTheme);
QVariantMap tmpDarkTheme = {
+ {"name", "dark"},
{"backgroundColor", "#2d3037"},
{"buttonColor", "#202227"},
diff --git a/sources/main.cpp b/sources/main.cpp
index 1f40642..236af25 100644
--- a/sources/main.cpp
+++ b/sources/main.cpp
@@ -18,6 +18,8 @@
#include
#include
+#include
+#include
#include "headers/apptheme.h"
#include "headers/appsettings.h"
@@ -54,7 +56,10 @@ int main(int argc, char *argv[])
qmlRegisterType("com.itsblue.SpeedClimbingStartTrainer", 2, 0, "AppSettings");
+ QQuickStyle::setStyle("Material");
+
QQmlApplicationEngine engine;
+ engine.rootContext()->setContextProperty("APP_VERSION", APP_VERSION);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;