From b25812f5554e36c48d65c904ce557f3a4be6f194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Gr=C3=BCtzner?= Date: Wed, 19 Dec 2018 20:40:06 +0100 Subject: [PATCH] added file again --- android-sources/res/drawable-hdpi/icon.png | Bin 0 -> 9966 bytes android-sources/res/drawable-ldpi/icon.png | Bin 0 -> 9966 bytes android-sources/res/drawable-mdpi/icon.png | Bin 0 -> 9966 bytes qml/StartPage.qml | 43 +++++ qml/calculator/Calculator.qml | 152 ++++++++++++++++ qml/calculator/CalculatorGameOverPage.qml | 99 +++++++++++ qml/calculator/CalculatorRunningPage.qml | 116 ++++++++++++ qml/calculator/CalculatorStartPage.qml | 143 +++++++++++++++ qml/calender/Calender.qml | 197 +++++++++++++++++++++ qml/calender/CalenderGameOverPage.qml | 57 ++++++ qml/calender/CalenderRunningPage.qml | 144 +++++++++++++++ qml/calender/CalenderStartPage.qml | 142 +++++++++++++++ qml/main.qml | 114 ++++++++++++ qml/qml.qrc | 15 ++ shared/icons/math.png | Bin 0 -> 9966 bytes 15 files changed, 1222 insertions(+) create mode 100644 android-sources/res/drawable-hdpi/icon.png create mode 100644 android-sources/res/drawable-ldpi/icon.png create mode 100644 android-sources/res/drawable-mdpi/icon.png create mode 100644 qml/StartPage.qml create mode 100644 qml/calculator/Calculator.qml create mode 100644 qml/calculator/CalculatorGameOverPage.qml create mode 100644 qml/calculator/CalculatorRunningPage.qml create mode 100644 qml/calculator/CalculatorStartPage.qml create mode 100644 qml/calender/Calender.qml create mode 100644 qml/calender/CalenderGameOverPage.qml create mode 100644 qml/calender/CalenderRunningPage.qml create mode 100644 qml/calender/CalenderStartPage.qml create mode 100644 qml/main.qml create mode 100644 qml/qml.qrc create mode 100644 shared/icons/math.png diff --git a/android-sources/res/drawable-hdpi/icon.png b/android-sources/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3e526d5283de799ad2fe698b68e0e61f23c824 GIT binary patch literal 9966 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

4$2>;lbY18k*Ye1 zX|VEDtMR;@FHl3^q@DDwye0;C;e1Ce!_W61FyImY>jky^ zXjzsw7091Q90df+&}_KXqRt2zs7W}Noq9B+$jmEhIrOB(-%o8R zF0knQp$l)BPrKGYt;?Urr;l5xMNQMB&V-u%^Tn}pQs3|Gz#iYK>vRF(+Xpn!j}A}b zU@SGzB6CSa7W{?iA4*LEq}OzPhpIoC$33PN8|7CG{B^usD#$DuytP()n)Ed^O#!vX z{%k4%-FJ^rGfx1|((+wp<_!Df#)Xv28Byb|tMk-<2*++~wGlPop~lj3E2iy(sa;AD ze<0!s5TwgF^bRFcWM~K(w_52XuXm&QEpYq{X~0{W((z_Q4TR(9E;h8VM;B+{gxd;F z?b~l+go}HewJ9~bX@5%RFT-}04ejt2d1xuZk(X#1-I&^_xErBHhyAog5dw}AaOkZ_ zNdb=9WvQWUsx`7KhVtvV{*Wc(`g^a68_PWHw?#&1Pe*n3_c7OZkPmU;5BX zJVv~cZ~>aaAE<@rl0g1mlHe0y$8fsE0s`Fx)&fEwz@AV8_ff7Y5=cCmFP3-GdSoiJ z`*IZM9;o4f5>}hRw%GosLF|2Tp%OQ7Ks^iGjBd7eN)4!t2Z7ZHnkPUN`|=E(YS7=g zGzyF@f`MAz7Z@mC%uIe2bbfAOXIUQ4UZxS^LKm3Ls7XxedQ44%n*WZ5w_9JPt-A!* zxcmLq$N&+i7T9c+&f@a`;$l&x*(MscACANuj_pc^hOB@ z)^XR>3g{p1U!~S`lj~{KE6t}G5`h>cG!D5A)bf9knuHhSY@{9;eE&zVB#=9z`lDf}_ekXVe+xo^bDDBC8zjGxOebT$8|MEKNH$s=hYY&k s;@=er{)d0~hky8ofB1)g_^;sq02Jl}JUFt{`2YX_07*qoM6N<$f|wX!#sB~S literal 0 HcmV?d00001 diff --git a/android-sources/res/drawable-ldpi/icon.png b/android-sources/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3e526d5283de799ad2fe698b68e0e61f23c824 GIT binary patch literal 9966 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

4$2>;lbY18k*Ye1 zX|VEDtMR;@FHl3^q@DDwye0;C;e1Ce!_W61FyImY>jky^ zXjzsw7091Q90df+&}_KXqRt2zs7W}Noq9B+$jmEhIrOB(-%o8R zF0knQp$l)BPrKGYt;?Urr;l5xMNQMB&V-u%^Tn}pQs3|Gz#iYK>vRF(+Xpn!j}A}b zU@SGzB6CSa7W{?iA4*LEq}OzPhpIoC$33PN8|7CG{B^usD#$DuytP()n)Ed^O#!vX z{%k4%-FJ^rGfx1|((+wp<_!Df#)Xv28Byb|tMk-<2*++~wGlPop~lj3E2iy(sa;AD ze<0!s5TwgF^bRFcWM~K(w_52XuXm&QEpYq{X~0{W((z_Q4TR(9E;h8VM;B+{gxd;F z?b~l+go}HewJ9~bX@5%RFT-}04ejt2d1xuZk(X#1-I&^_xErBHhyAog5dw}AaOkZ_ zNdb=9WvQWUsx`7KhVtvV{*Wc(`g^a68_PWHw?#&1Pe*n3_c7OZkPmU;5BX zJVv~cZ~>aaAE<@rl0g1mlHe0y$8fsE0s`Fx)&fEwz@AV8_ff7Y5=cCmFP3-GdSoiJ z`*IZM9;o4f5>}hRw%GosLF|2Tp%OQ7Ks^iGjBd7eN)4!t2Z7ZHnkPUN`|=E(YS7=g zGzyF@f`MAz7Z@mC%uIe2bbfAOXIUQ4UZxS^LKm3Ls7XxedQ44%n*WZ5w_9JPt-A!* zxcmLq$N&+i7T9c+&f@a`;$l&x*(MscACANuj_pc^hOB@ z)^XR>3g{p1U!~S`lj~{KE6t}G5`h>cG!D5A)bf9knuHhSY@{9;eE&zVB#=9z`lDf}_ekXVe+xo^bDDBC8zjGxOebT$8|MEKNH$s=hYY&k s;@=er{)d0~hky8ofB1)g_^;sq02Jl}JUFt{`2YX_07*qoM6N<$f|wX!#sB~S literal 0 HcmV?d00001 diff --git a/android-sources/res/drawable-mdpi/icon.png b/android-sources/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3e526d5283de799ad2fe698b68e0e61f23c824 GIT binary patch literal 9966 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

4$2>;lbY18k*Ye1 zX|VEDtMR;@FHl3^q@DDwye0;C;e1Ce!_W61FyImY>jky^ zXjzsw7091Q90df+&}_KXqRt2zs7W}Noq9B+$jmEhIrOB(-%o8R zF0knQp$l)BPrKGYt;?Urr;l5xMNQMB&V-u%^Tn}pQs3|Gz#iYK>vRF(+Xpn!j}A}b zU@SGzB6CSa7W{?iA4*LEq}OzPhpIoC$33PN8|7CG{B^usD#$DuytP()n)Ed^O#!vX z{%k4%-FJ^rGfx1|((+wp<_!Df#)Xv28Byb|tMk-<2*++~wGlPop~lj3E2iy(sa;AD ze<0!s5TwgF^bRFcWM~K(w_52XuXm&QEpYq{X~0{W((z_Q4TR(9E;h8VM;B+{gxd;F z?b~l+go}HewJ9~bX@5%RFT-}04ejt2d1xuZk(X#1-I&^_xErBHhyAog5dw}AaOkZ_ zNdb=9WvQWUsx`7KhVtvV{*Wc(`g^a68_PWHw?#&1Pe*n3_c7OZkPmU;5BX zJVv~cZ~>aaAE<@rl0g1mlHe0y$8fsE0s`Fx)&fEwz@AV8_ff7Y5=cCmFP3-GdSoiJ z`*IZM9;o4f5>}hRw%GosLF|2Tp%OQ7Ks^iGjBd7eN)4!t2Z7ZHnkPUN`|=E(YS7=g zGzyF@f`MAz7Z@mC%uIe2bbfAOXIUQ4UZxS^LKm3Ls7XxedQ44%n*WZ5w_9JPt-A!* zxcmLq$N&+i7T9c+&f@a`;$l&x*(MscACANuj_pc^hOB@ z)^XR>3g{p1U!~S`lj~{KE6t}G5`h>cG!D5A)bf9knuHhSY@{9;eE&zVB#=9z`lDf}_ekXVe+xo^bDDBC8zjGxOebT$8|MEKNH$s=hYY&k s;@=er{)d0~hky8ofB1)g_^;sq02Jl}JUFt{`2YX_07*qoM6N<$f|wX!#sB~S literal 0 HcmV?d00001 diff --git a/qml/StartPage.qml b/qml/StartPage.qml new file mode 100644 index 0000000..b6a28e0 --- /dev/null +++ b/qml/StartPage.qml @@ -0,0 +1,43 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.4 +import "./" +import "./components" + +Page { + id: root + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + signal pageOpened() + GameButton { + id: calenderButton + text: "calender" + height: parent.width * 0.2 + anchors { + left: parent.left + top: parent.top + leftMargin: parent.width * 0.5 - width * 0.5 + topMargin: parent.height * 0.3 - height * 0.5 + } + onClicked: { + game.calender() + } + } + + GameButton { + id: calculatorButton + text: "calculator" + height: parent.width * 0.2 + anchors { + left: parent.left + top: parent.top + leftMargin: parent.width * 0.5 - width * 0.5 + topMargin: parent.height * 0.7 - height * 0.5 + } + onClicked: { + game.calculator() + } + } +} diff --git a/qml/calculator/Calculator.qml b/qml/calculator/Calculator.qml new file mode 100644 index 0000000..81e1019 --- /dev/null +++ b/qml/calculator/Calculator.qml @@ -0,0 +1,152 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import "./" + +Item { + id: calculator + + property int sum: 0 + property int nextNum: 0 + property int lastNum: 0 + property int actualNumCount: 0 + property int min: 1 + property int max: 9 + property int tickInterval: 1000 + property int numCount: 10 + property bool endPageVisibility: false + property string endPageLabelText: "You Lose!" + + signal pageOpened() + + onPageOpened: { + calculator.start() + } + + states: [ + State { + name: "starting" + PropertyChanges { + target: calculatorStack + currPage: calculatorStartPageComp + } + }, + + State { + name: "running" + PropertyChanges { + target: calculatorStack + currPage: calculatorRunningPageComp + } + }, + State { + name: "gameOver" + PropertyChanges { + target: calculatorStack + currPage: calculatorGameOverPageComp + } + } + ] + + StackView { + id: calculatorStack + + property var currPage; + + anchors.fill: parent + + onCurrPageChanged: { + calculatorStack.replace(currPage) + } + onCurrentItemChanged: { + calculatorStack.currentItem.pageOpened() + } + + Component { + id: calculatorStartPageComp + CalculatorStartPage { + } + } + + Component { + id: calculatorRunningPageComp + CalculatorRunningPage { + } + } + + Component { + id: calculatorGameOverPageComp + CalculatorGameOverPage { + } + } + + + replaceExit: Transition { + NumberAnimation { + from: 1 + to: 0 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + + replaceEnter: Transition { + NumberAnimation { + from: 0 + to: 1 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + } + + + /*------------------------- + ---------functions--------- + -------------------------*/ + + function start() { + calculator.reset() + calculator.state = "starting" + } + + function run() { + calculator.nextNumber() + calculator.state = "running" + } + + function gameOver() { + calculator.state = "gameOver" + } + + function reset() { + calculator.sum = 0 + calculator.actualNumCount = 0 + calculator.endPageLabelText = "You Lose!" + calculator.endPageVisibility = false + calculator.lastNum = 0 + calculator.nextNum = 0 + } + + function nextNumber(){ + var randNum = 0 + var range = calculator.max - calculator.min + lastNum = nextNum + while(randNum===0 || randNum === lastNum){ + randNum = Math.floor((Math.random()*(range+1))+min) + } + nextNum = randNum + calculator.sum += randNum + actualNumCount += 1 + } + + function checkSum(sumInputText) { + if (sumInputText !== "") { + if (calculator.sum === parseInt(sumInputText)) { + calculator.endPageLabelText = "You Won!" + } + calculator.endPageVisibility = true + } + } +} diff --git a/qml/calculator/CalculatorGameOverPage.qml b/qml/calculator/CalculatorGameOverPage.qml new file mode 100644 index 0000000..87d803a --- /dev/null +++ b/qml/calculator/CalculatorGameOverPage.qml @@ -0,0 +1,99 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import "./" +import "../components" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + TextField { + id: sumInput + placeholderText: "sum" + visible: !endPageVisibility + validator: IntValidator {bottom: -1000000; top: 1000000;} + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: parent.height * 0.1 + } + Keys.onReturnPressed: calculator.checkSum(sumInput.text) + } + + GameButton { + id: checkButton + height: parent.width * 0.2 + text: "check" + visible: !calculator.endPageVisibility + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: parent.height * 0.3 + } + onClicked: { + calculator.checkSum(sumInput.text) + } + } + + Label { + id: won + text: calculator.endPageLabelText + font.pixelSize: parent.width * 0.2 + visible: calculator.endPageVisibility + color: settings.theme("PageTextColor") + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: parent.height * 0.05 + } + } + + Label { + id: sum + text: "Sum: " + calculator.sum + font.pixelSize: parent.width * 0.1 + visible: calculator.endPageVisibility ? ( won.text==="You Lose!" ? true:false):false + color: settings.theme("PageTextColor") + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: parent.height * 0.4 + } + } + + Row { + id: buttonRow + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: parent.height * 0.15 + } + height: childrenRect.height + width: childrenRect.width + spacing: parent.width * 0.1 + visible: calculator.endPageVisibility ? true:false + + GameButton { + id: homeButton + height: root.width * 0.2 + text: "home" + onClicked: { + game.start() + } + } + + GameButton { + id: startButtons + height: root.width * 0.2 + text: "start" + onClicked: { + calculator.start() + } + } + } +} diff --git a/qml/calculator/CalculatorRunningPage.qml b/qml/calculator/CalculatorRunningPage.qml new file mode 100644 index 0000000..08a2f80 --- /dev/null +++ b/qml/calculator/CalculatorRunningPage.qml @@ -0,0 +1,116 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.4 +import "./" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + Label { + id: num + anchors.centerIn: parent + font.pixelSize: parent.height * 0.6 + text: calculator.nextNum + color: settings.theme("PageTextColor") + } + + Label { + id: gameProcess + text: calculator.actualNumCount + " of " + calculator.numCount + font.pixelSize: parent.width * 0.05 + color: settings.theme("PageTextColor") + anchors { + right: parent.right + rightMargin: parent.width * 0.025 + bottom: parent.bottom + bottomMargin: parent.height * 0.05 + } + } + + + ProgressBar { + id: prog + property int progress: 0 + property string color: "green" + value: progress/100 + anchors { + bottom: parent.bottom + bottomMargin: parent.height * 0.02 + left: parent.left + leftMargin: parent.width * 0.01 + right: parent.right + rightMargin: parent.width * 0.01 + } + + contentItem: Item { + Rectangle { + width: prog.visualPosition * parent.width + height: parent.height + color: prog.color + } + } + + NumberAnimation { + id: progNumAnim + target: prog + property: "progress" + from: 100 + to: 0 + duration: tick.interval + easing.type: Easing.Linear + } + + SequentialAnimation { + id: progColAnim + loops: 1 + ColorAnimation { + id: progColAnim1 + target: prog + property: "color" + from: "green" + to: "goldenrod" + duration: tick.interval/2 + easing.type: Easing.Linear + } + ColorAnimation { + id: progColAnim2 + target: prog + property: "color" + from: "goldenrod" + to: "darkRed" + duration: tick.interval/2 + easing.type: Easing.Linear + } + } + + } + + Timer { + id: tick + interval: calculator.tickInterval + repeat: false + running: calculator.state === "running" + + onTriggered: { + if (calculator.actualNumCount < calculator.numCount) { + nextNumber() + tick.start() + } + else { + calculator.state = "gameOver" + } + } + + onRunningChanged: { + if(running){ + progNumAnim.start() + progColAnim.start() + } + } + } +} diff --git a/qml/calculator/CalculatorStartPage.qml b/qml/calculator/CalculatorStartPage.qml new file mode 100644 index 0000000..74b4f7e --- /dev/null +++ b/qml/calculator/CalculatorStartPage.qml @@ -0,0 +1,143 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.3 +import "./" +import "../components" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + ColumnLayout { + id: column + //spacing: height / 40 + width: parent.width + anchors.fill: parent + anchors.topMargin: parent.height * 0.02 + anchors.bottomMargin: parent.height * 0.02 + + Label { + id: heading + font.pixelSize: parent.width * 0.075 + text: "Calculator" + color: settings.theme("PageTextColor") + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.5 - width * 0.5 + Layout.rightMargin: parent.width * 0.5 - width * 0.5 + } + + Label { + id: tickIntervalInfo + text: "Interval:" + color: settings.theme("PageTextColor") + font.pixelSize: parent.height * 0.05 + Layout.leftMargin: parent.width * 0.05 + } + + + TextField { + id: tickInterval + text: calculator.tickInterval + placeholderText: "interval" + validator: IntValidator {bottom: 1; top: 100000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: numCountInfo + text: "Summands:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: numCount + text: calculator.numCount + placeholderText: "summands" + validator: IntValidator {bottom: 1; top: 100000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: minInfo + text: "Minimum:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: min + text: calculator.min + placeholderText: "minimum" + validator: IntValidator {bottom: -100000; top: 100000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: maxInfo + text: "Maximum:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: max + text: calculator.max + placeholderText: "maximum" + validator: IntValidator {bottom: -100000; top: 100000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + RoundButton { + id: startButton + text: "start" + height: parent.width * 0.1 + //width: height + //font.pixelSize: parent.width * 0.03 + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + onClicked: { + root.start() + } + } + } + function start() { + if (tickInterval.text > 0 && numCount.text > 0 && max.text > min.text) { + root.updateVars() + calculator.run() + } + } + + function updateVars() { + calculator.tickInterval = tickInterval.text + calculator.numCount = numCount.text + calculator.min = min.text + calculator.max = max.text + + } +} diff --git a/qml/calender/Calender.qml b/qml/calender/Calender.qml new file mode 100644 index 0000000..8dc9dd9 --- /dev/null +++ b/qml/calender/Calender.qml @@ -0,0 +1,197 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import "./" + +Item { + id: calender + + property string nextDate: "31.12.1799" + property string lastDate: "30.12.1799" + property int actualDateCount: 0 + property int min: 1800 + property int max: 2199 + property int tickInterval: 10000 + property int dateCount: 10 + property int correct: 0 + property int wrong: 0 + property int weekDay: 1 + property bool runningPageState: true + + signal pageOpened() + + onPageOpened: { + calender.start() + } + + states: [ + State { + name: "starting" + PropertyChanges { + target: calenderStack + currPage: calenderStartPageComp + } + }, + + State { + name: "running" + PropertyChanges { + target: calenderStack + currPage: calenderRunningPageComp + } + }, + State { + name: "gameOver" + PropertyChanges { + target: calenderStack + currPage: calenderGameOverPageComp + } + } + ] + + StackView { + id: calenderStack + + property var currPage; + + anchors.fill: parent + + onCurrPageChanged: { + calenderStack.replace(currPage) + } + onCurrentItemChanged: { + calenderStack.currentItem.pageOpened() + } + + Component { + id: calenderStartPageComp + CalenderStartPage { + } + } + + Component { + id: calenderRunningPageComp + CalenderRunningPage { + } + } + + Component { + id: calenderGameOverPageComp + CalenderGameOverPage { + } + } + + + replaceExit: Transition { + NumberAnimation { + from: 1 + to: 0 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + + replaceEnter: Transition { + NumberAnimation { + from: 0 + to: 1 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + } + + + /*------------------------- + ---------functions--------- + -------------------------*/ + + function start() { + calender.reset() + calender.state = "starting" + } + + function run() { + calender.generateNextDate() + calender.state = "running" + } + + function gameOver() { + calender.state = "gameOver" + } + + function reset() { + calender.actualDateCount = 0 + calender.lastDate = 0 + calender.nextDate = 0 + calender.correct = 0 + calender.wrong = 0 + } + + function generateNextDate() { + var daysPerMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + var monthCodes = [6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4] + var yearCode = 0 + var randDate = calender.nextDate + var randDay = 31 + var randMonth = 12 + var randYear = 1799 + var range = calender.max - calender.min + var century = 17 + var weekDay = 1 + calender.lastDate = calender.nextDate + while (randDate === calender.lastDate) { + //console.log("entered mainwhile " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + randYear = Math.floor((Math.random()*(range+1))+calender.min) + //console.log("generated year " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + century = Math.floor(randYear/100) + //console.log("calculated century " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + yearCode = (randYear - century * 100) + Math.floor((randYear - century * 100)/4) + //console.log("generated yearCode " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + while (century > 21) { + century -= 4 + //console.log("down count century " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + } + switch (century) { + case 18: + yearCode += 3 + break + case 19: + yearCode += 1 + break + case 21: + yearCode += 5 + break + default: + //console.log("added century specified value to yearCode " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + } + randMonth = Math.floor((Math.random()*(12))+1) + //console.log("generated month " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + if (randYear % 4 === 0 && randMonth <= 2) { + yearCode += 6 + //console.log("if leap-year " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + } + while (yearCode >= 7) { + yearCode -= 7 + //console.log("down count yearCode " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + } + randDay = Math.floor((Math.random()*(daysPerMonth[randMonth-1]))+1) + //console.log("generated Day " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + randDate = String(randDay) + "." + String(randMonth) + "." + String(randYear) + //console.log("generated randDate " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + } + weekDay = (yearCode + monthCodes[randMonth-1] + randDay) // - 7*Math.floor((yearCode + monthCodes[randMonth-1] + randDay)/7) + //console.log("generated weekday " + "yearCode: " + yearCode + " randDate: " + randDate + " randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + " century: " + century + " weekDay: " + weekDay) + //weekDay -= 7*Math.floor(weekDay/7) + while (weekDay >= 7) { + weekDay -= 7 + //console.log("down count weekday " + "yearCode: " + yearCode + " randDate: " + randDate + /*" randDay: " + randDay + " randMonth: " + randMonth + " randYear: " + randYear + " Range: " + range + */ " century: " + century + " weekDay: " + weekDay) + } + console.log("randDate: " + randDate + " yearCode: " + yearCode + " century: " + century + " weekDay: " + weekDay) + calender.weekDay = weekDay + calender.nextDate = randDate + calender.actualDateCount += 1 + } +} + diff --git a/qml/calender/CalenderGameOverPage.qml b/qml/calender/CalenderGameOverPage.qml new file mode 100644 index 0000000..cc90446 --- /dev/null +++ b/qml/calender/CalenderGameOverPage.qml @@ -0,0 +1,57 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import "./" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + Label { + id: percent + text: "You had " + calender.dateCount/calender.correct*100 + "% right!" + font.pixelSize: parent.width * 0.05 + color: settings.theme("PageTextColor") + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + topMargin: parent.height * 0.2 + } + } + + Row { + id: buttonRow + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: parent.height * 0.15 + } + height: childrenRect.height + width: childrenRect.width + spacing: parent.width * 0.1 + + RoundButton { + id: homeButton + height: root.width * 0.2 + width: height + text: "home" + onClicked: { + game.start() + } + } + + RoundButton { + id: startButtons + height: root.width * 0.2 + width: height + text: "start" + onClicked: { + calender.start() + } + } + } +} diff --git a/qml/calender/CalenderRunningPage.qml b/qml/calender/CalenderRunningPage.qml new file mode 100644 index 0000000..75039b0 --- /dev/null +++ b/qml/calender/CalenderRunningPage.qml @@ -0,0 +1,144 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.4 +import "./" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + Label { + id: date + anchors.centerIn: parent + font.pixelSize: parent.height * 0.2 + text: calender.nextDate + visible: calender.runningPageState ? true:false + color: settings.theme("PageTextColor") + } + + Label { + id: gameProcess + text: calender.actualDateCount + " of " + calender.dateCount + font.pixelSize: parent.width * 0.05 + color: settings.theme("PageTextColor") + anchors { + right: parent.right + rightMargin: parent.width * 0.025 + bottom: parent.bottom + bottomMargin: parent.height * 0.05 + } + } + + + ProgressBar { + id: prog + property int progress: 0 + property string color: "green" + value: progress/100 + anchors { + bottom: parent.bottom + bottomMargin: parent.height * 0.02 + left: parent.left + leftMargin: parent.width * 0.01 + right: parent.right + rightMargin: parent.width * 0.01 + } + visible: calender.runningPageState ? true:false + contentItem: Item { + Rectangle { + width: prog.visualPosition * parent.width + height: parent.height + color: prog.color + } + } + + NumberAnimation { + id: progNumAnim + target: prog + property: "progress" + from: 100 + to: 0 + duration: tick.interval + easing.type: Easing.Linear + } + + SequentialAnimation { + id: progColAnim + loops: 1 + ColorAnimation { + id: progColAnim1 + target: prog + property: "color" + from: "green" + to: "goldenrod" + duration: tick.interval/2 + easing.type: Easing.Linear + } + ColorAnimation { + id: progColAnim2 + target: prog + property: "color" + from: "goldenrod" + to: "darkRed" + duration: tick.interval/2 + easing.type: Easing.Linear + } + } + } + + ComboBox { + id: comboBox + model: ["None", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] + anchors.centerIn: parent + visible: calender.runningPageState ? false:true + onCurrentTextChanged: { + if (currentIndex !== 0) { + if (currentIndex === calender.weekDay) { + calender.correct += 1 + } + else { + calender.wrong += 1 + } + /* + Timer, { + id: pause + interval: 200 + repeat: false + } + */ + + if (calender.actualDateCount < calender.dateCount) { + calender.generateNextDate() + tick.start() + calender.runningPageState = true + } + else { + calender.state = "gameOver" + } + } + } + } + + Timer { + id: tick + interval: calender.tickInterval + repeat: false + running: calender.state === "running" + + onTriggered: { + calender.runningPageState = false + comboBox.currentIndex = 0 + } + + onRunningChanged: { + if(running){ + progNumAnim.start() + progColAnim.start() + } + } + } +} diff --git a/qml/calender/CalenderStartPage.qml b/qml/calender/CalenderStartPage.qml new file mode 100644 index 0000000..8abd8ac --- /dev/null +++ b/qml/calender/CalenderStartPage.qml @@ -0,0 +1,142 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.3 +import "./" + +Page { + id: root + + signal pageOpened() + + background: Rectangle { + color: settings.theme("PageBackgroundColor") + } + + ColumnLayout { + id: column + //spacing: height / 40 + width: parent.width + anchors.fill: parent + anchors.topMargin: parent.height * 0.02 + anchors.bottomMargin: parent.height * 0.02 + + Label { + id: heading + font.pixelSize: parent.width * 0.075 + text: "Calender" + color: settings.theme("PageTextColor") + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.5 - width * 0.5 + Layout.rightMargin: parent.width * 0.5 - width * 0.5 + } + + Label { + id: tickIntervalInfo + text: "Interval:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + + TextField { + id: tickInterval + text: calender.tickInterval + placeholderText: "interval" + validator: IntValidator {bottom: 1; top: 1000000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: dateCountInfo + text: "Dates:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: dateCount + text: calender.dateCount + placeholderText: "dates" + validator: IntValidator {bottom: 1; top: 100000;} + color: settings.theme("PageTextColor") + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: minInfo + text: "Minimum:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: min + text: calender.min + placeholderText: "minimum" + validator: IntValidator {bottom: 1800; top: 10000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + Label { + id: maxInfo + text: "Maximum:" + font.pixelSize: parent.height * 0.05 + color: settings.theme("PageTextColor") + Layout.leftMargin: parent.width * 0.05 + } + + TextField { + id: max + text: calender.max + placeholderText: "maximum" + validator: IntValidator {bottom: 1800; top: 10000;} + horizontalAlignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + Keys.onReturnPressed: root.start() + } + + RoundButton { + id: startButton + text: "start" + height: parent.width * 0.1 + width: height + //font.pixelSize: parent.width * 0.03 + Layout.fillWidth: true + Layout.leftMargin: parent.width * 0.05 + Layout.rightMargin: parent.width * 0.05 + onClicked: { + root.start() + } + } + } + function start() { + if (tickInterval.text > 0 && dateCount.text > 0 && min.text >= 1800 && max.text >= min.text) { + root.updateVars() + calender.run() + } + } + + function updateVars() { + calender.tickInterval = tickInterval.text + calender.dateCount = dateCount.text + calender.min = min.text + calender.max = max.text + } +} diff --git a/qml/main.qml b/qml/main.qml new file mode 100644 index 0000000..1eb02b5 --- /dev/null +++ b/qml/main.qml @@ -0,0 +1,114 @@ +import QtQuick 2.9 +import QtQuick.Window 2.3 +import QtQuick.Controls 2.4 +import "./calender" +import "./calculator" +import com.max.mathtrainingstuff 1.0 + + +Window { + visible: true + width: 540 * 0.6 + height: 960 * 0.6 + title: qsTr("Training") + + color: settings.theme("PageBackgroundColor") + + Item { + id: game + anchors.fill: parent + + AppSettings { + id: settings + } + + state: "starting" + + states: [ + State { + name: "starting" + PropertyChanges { + target: mainStack + currPage: startPageComp + } + }, + + State { + name: "calender" + PropertyChanges { + target: mainStack + currPage: calenderPageComp + } + }, + State { + name: "calculator" + PropertyChanges { + target: mainStack + currPage: calculatorPageComp + } + } + ] + + StackView { + id: mainStack + + property var currPage + + anchors.fill: parent + + onCurrPageChanged: { + mainStack.replace(currPage) + } + onCurrentItemChanged: { + mainStack.currentItem.pageOpened() + } + + Component { + id: startPageComp + StartPage { + } + } + + Component { + id: calenderPageComp + Calender { + } + } + + Component { + id: calculatorPageComp + Calculator { + } + } + + replaceExit: Transition { + NumberAnimation { + from: 1 + to: 0 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + + replaceEnter: Transition { + NumberAnimation { + from: 0 + to: 1 + property: "opacity" + duration: 200 + easing.type: Easing.InOutQuad + } + } + } + function start() { + game.state = "starting" + } + function calender() { + game.state = "calender" + } + function calculator() { + game.state = "calculator" + } + } +} diff --git a/qml/qml.qrc b/qml/qml.qrc new file mode 100644 index 0000000..a9a893e --- /dev/null +++ b/qml/qml.qrc @@ -0,0 +1,15 @@ + + + main.qml + calender/Calender.qml + StartPage.qml + calculator/CalculatorRunningPage.qml + calculator/CalculatorStartPage.qml + calculator/CalculatorGameOverPage.qml + calculator/Calculator.qml + calender/CalenderStartPage.qml + calender/CalenderRunningPage.qml + calender/CalenderGameOverPage.qml + components/GameButton.qml + + diff --git a/shared/icons/math.png b/shared/icons/math.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3e526d5283de799ad2fe698b68e0e61f23c824 GIT binary patch literal 9966 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

4$2>;lbY18k*Ye1 zX|VEDtMR;@FHl3^q@DDwye0;C;e1Ce!_W61FyImY>jky^ zXjzsw7091Q90df+&}_KXqRt2zs7W}Noq9B+$jmEhIrOB(-%o8R zF0knQp$l)BPrKGYt;?Urr;l5xMNQMB&V-u%^Tn}pQs3|Gz#iYK>vRF(+Xpn!j}A}b zU@SGzB6CSa7W{?iA4*LEq}OzPhpIoC$33PN8|7CG{B^usD#$DuytP()n)Ed^O#!vX z{%k4%-FJ^rGfx1|((+wp<_!Df#)Xv28Byb|tMk-<2*++~wGlPop~lj3E2iy(sa;AD ze<0!s5TwgF^bRFcWM~K(w_52XuXm&QEpYq{X~0{W((z_Q4TR(9E;h8VM;B+{gxd;F z?b~l+go}HewJ9~bX@5%RFT-}04ejt2d1xuZk(X#1-I&^_xErBHhyAog5dw}AaOkZ_ zNdb=9WvQWUsx`7KhVtvV{*Wc(`g^a68_PWHw?#&1Pe*n3_c7OZkPmU;5BX zJVv~cZ~>aaAE<@rl0g1mlHe0y$8fsE0s`Fx)&fEwz@AV8_ff7Y5=cCmFP3-GdSoiJ z`*IZM9;o4f5>}hRw%GosLF|2Tp%OQ7Ks^iGjBd7eN)4!t2Z7ZHnkPUN`|=E(YS7=g zGzyF@f`MAz7Z@mC%uIe2bbfAOXIUQ4UZxS^LKm3Ls7XxedQ44%n*WZ5w_9JPt-A!* zxcmLq$N&+i7T9c+&f@a`;$l&x*(MscACANuj_pc^hOB@ z)^XR>3g{p1U!~S`lj~{KE6t}G5`h>cG!D5A)bf9knuHhSY@{9;eE&zVB#=9z`lDf}_ekXVe+xo^bDDBC8zjGxOebT$8|MEKNH$s=hYY&k s;@=er{)d0~hky8ofB1)g_^;sq02Jl}JUFt{`2YX_07*qoM6N<$f|wX!#sB~S literal 0 HcmV?d00001