From 04b3f713ab5138518e3070e8d126095f101c8fb5 Mon Sep 17 00:00:00 2001 From: Dorian Zedler Date: Sat, 28 Jul 2018 14:12:55 +0200 Subject: [PATCH] added settings to setup automatic start sequence addad app settings class --- ProgressCircle.qml | 3 + SettingsDialog.qml | 400 +++++++++++++++++++++++++++----- appsettings.cpp | 30 +++ appsettings.h | 26 +++ graphics/icons/back.png | Bin 0 -> 2608 bytes graphics/icons/back_black.png | Bin 0 -> 289 bytes graphics/icons/drawer.png | Bin 0 -> 2125 bytes graphics/icons/drawer_black.png | Bin 0 -> 126 bytes graphics/icons/menu.png | Bin 0 -> 2793 bytes graphics/icons/menu_black.png | Bin 0 -> 158 bytes main.cpp | 3 + shared.qrc | 6 + speedclimbing_stopwatch.pro | 6 +- 13 files changed, 414 insertions(+), 60 deletions(-) create mode 100644 appsettings.cpp create mode 100644 appsettings.h create mode 100644 graphics/icons/back.png create mode 100644 graphics/icons/back_black.png create mode 100644 graphics/icons/drawer.png create mode 100644 graphics/icons/drawer_black.png create mode 100644 graphics/icons/menu.png create mode 100644 graphics/icons/menu_black.png diff --git a/ProgressCircle.qml b/ProgressCircle.qml index c32679b..5febcbc 100644 --- a/ProgressCircle.qml +++ b/ProgressCircle.qml @@ -50,6 +50,9 @@ Item { } + function repaint(){ + canvas.requestPaint() + } Canvas { id: canvas diff --git a/SettingsDialog.qml b/SettingsDialog.qml index 3d15e71..6bb7d98 100644 --- a/SettingsDialog.qml +++ b/SettingsDialog.qml @@ -2,6 +2,7 @@ import QtQuick 2.9 import QtMultimedia 5.8 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 Popup { id: root @@ -13,19 +14,11 @@ Popup { dim: false enter: Transition { - NumberAnimation { properties: "scale"; from: 0; to: 1; duration: 300; easing.type: Easing.InCubic } + NumberAnimation { properties: "scale"; from: 0; to: 1; duration: 300; easing.type: Easing.Linear } } exit: Transition { - NumberAnimation { properties: "scale"; from: 1; to: 0; duration: 300; easing.type: Easing.OutCubic } - } - - function delay(delayTime, cb) { - timer = new Timer(); - timer.interval = delayTime; - timer.repeat = false; - //timer.triggered.connect(cb); - timer.start(); + NumberAnimation { properties: "scale"; from: 1; to: 0; duration: 300; easing.type: Easing.Linear } } background: Rectangle { @@ -33,8 +26,10 @@ Popup { color: "white" border.color: "grey" border.width: 1 + Label { - text: "Options" + id: head_text + text: options_stack.currentItem.title font.pixelSize: headlineUnderline.width * 0.1 anchors { horizontalCenter: parent.horizontalCenter @@ -57,6 +52,50 @@ Popup { leftMargin: parent.radius - Math.sqrt(Math.pow(parent.radius,2)-Math.pow(parent.radius-anchors.topMargin,2)) } } + + Button { + id: head_back + + anchors { + left: parent.left + leftMargin: parent.width * 0.17 + top:parent.top + topMargin: parent.height * 0.025 + } + height: parent.height * 0.1 + width:height + + background: Rectangle { + radius: width * 0.5 + color: "white" + border.color: "grey" + border.width: 1 + Image { + anchors.fill: parent + anchors.margins: parent.width * 0.2 + source: "qrc:/graphics/icons/back_black.png" + + } + } + + onClicked: { + options_stack.depth > 1 ? options_stack.pop():root.close() + } + + onPressedChanged: { + if(pressed){ + background.color = "lightgrey" + } + else { + background.color = "white" + } + } + Behavior on opacity { + NumberAnimation { + duration: 100 + } + } + } } ProgressCircle { @@ -64,7 +103,6 @@ Popup { property string text: "connecting.." anchors.centerIn: parent size: parent.height * 1.03 - //colorCircle: "grey" opacity: 0 lineWidth: 5 @@ -72,7 +110,8 @@ Popup { arcEnd: 0 Timer { - running: opacity === 1 + id: prog_refresh + running: false interval: 1 repeat: true onTriggered: { @@ -89,59 +128,304 @@ Popup { } } - Column { - id: settings_col - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.right: parent.right + StackView { + id: options_stack + property int text_pixelSize: headlineUnderline.width * 0.08 + initialItem: settings + width: headlineUnderline.width - ItemDelegate { - id: connect_del - width: parent.width - text: _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" - Timer { - running: connect_del.scale === 1 - repeat: true - interval: 10 - onTriggered: { - connect_del.text = _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" - } - } + anchors { + top: parent.top + left: parent.left + leftMargin: ( parent.width - headlineUnderline.width ) / 2 + topMargin: parent.height * 0.12 + bottom: parent.bottom + } - onClicked: { - root.closePolicy = Popup.NoAutoClose - connect_del.opacity = 0 - prog.arcEnd = 0 - prog.colorCircle = "grey" - prog.opacity = 1 - prog.text = "connecting..." + Behavior on opacity { + NumberAnimation {duration: 200} + } - connect_del.enabled = false + /*-----start page of the settings-----*/ + Component { + id: settings - if(_cppBuzzerConn.connect()){ - prog.colorCircle = "green" - prog.text = "success!" - } - else { - prog.colorCircle = "red" - prog.text = "error!" + Column { + property string title: "Options" + id: settings_col + + /*----Connect to buzzer----*/ + ItemDelegate { + id: connect_del + width: parent.width + text: _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" + font.pixelSize: options_stack.text_pixelSize + Timer { + running: connect_del.scale === 1 + repeat: true + interval: 10 + onTriggered: { + connect_del.text = _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" + } + } + + onClicked: { + root.closePolicy = Popup.NoAutoClose + options_stack.opacity = 0 + + prog.arcEnd = 0 + prog.colorCircle = "grey" + prog.opacity = 1 + prog.text = "connecting..." + prog_refresh.running = true + + if(_cppBuzzerConn.connect()){ + prog_refresh.running = false + prog.colorCircle = "green" + prog.text = "success!" + prog.arcEnd = 360 + } + else { + prog_refresh.running = false + prog.colorCircle = "red" + prog.text = "error!" + prog.arcEnd = 360 + } + + //make a short delay and go back to normal options + shortDelay.start() + } + Timer { + id: shortDelay + running: false + repeat: false + interval: 1000 + onTriggered: { + connect_del.enabled = true; + prog.opacity = 0; + options_stack.opacity = 1 + root.closePolicy = Popup.CloseOnPressOutside; + } + } } - //make a short delay and go back to normal options - shortDelay.start() - } - Timer { - id: shortDelay - running: false - repeat: false - interval: 1000 - onTriggered: { - connect_del.enabled = true; - prog.opacity = 0; - connect_del.opacity = 1; - root.closePolicy = Popup.CloseOnPressOutside; + /*----Automated Start----*/ + ItemDelegate { + id: autostart_del + text: "start sequence" + font.pixelSize: options_stack.text_pixelSize + width: parent.width + + Rectangle { + color: "grey" + height: 1 + width: parent.width * 0.9 + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.top + } + } + + Image { + id: autostart_del_image + source: "qrc:/graphics/icons/back_black.png" + rotation: 180 + height: options_stack.text_pixelSize + width: height + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + rightMargin: 10 + } + } + onClicked: { + options_stack.push(autostart) + } } } } + + /*-----Page to setup automatc start sequence-----*/ + Component { + id: autostart + + Column { + id: autostart_col + property string title: "Autostart" + + + SwitchDelegate { + id: ready_del + text: qsTr("say 'ready'") + checked: _cppAppSettings.loadSetting("ready_en") === "true" + width: parent.width + font.pixelSize: options_stack.text_pixelSize + + onCheckedChanged: { + _cppAppSettings.writeSetting("ready_en",checked) + } + + indicator: Rectangle { + implicitWidth: 48 + implicitHeight: 26 + x: ready_del.width - width - ready_del.rightPadding + y: parent.height / 2 - height / 2 + radius: 13 + color: ready_del.checked ? "#17a81a" : "transparent" + border.color: ready_del.checked ? "#17a81a" : "#cccccc" + Behavior on color{ + ColorAnimation{ + duration: 200 + } + } + + Rectangle { + x: ready_del.checked ? parent.width - width : 0 + width: 26 + height: 26 + radius: 13 + color: ready_del.down ? "#cccccc" : "#ffffff" + border.color: ready_del.checked ? (ready_del.down ? "#17a81a" : "#21be2b") : "#999999" + Behavior on x{ + NumberAnimation { + property: "x" + duration: 200 + easing.type: Easing.InOutQuad + } + } + } + } + } + + ItemDelegate { + id: ready_delay_del + text: "delay (ms)" + enabled: ready_del.checked + width: parent.width + font.pixelSize: options_stack.text_pixelSize + + TextField { + focus: true + placeholderText: "time" + width: parent.width * 0.3 + anchors.right: parent.right + inputMethodHints: Qt.ImhFormattedNumbersOnly + + text: _cppAppSettings.loadSetting("ready_delay") + + onTextChanged: { + _cppAppSettings.writeSetting("ready_delay", text) + } + } + } + + SwitchDelegate { + id: at_marks_del + text: qsTr("say\n'at your marks'") + checked: _cppAppSettings.loadSetting("at_marks_en") === "true" + width: parent.width + font.pixelSize: options_stack.text_pixelSize + + onCheckedChanged: { + _cppAppSettings.writeSetting("at_marks_en",at_marks_del.checked) + } + + indicator: Rectangle { + implicitWidth: 48 + implicitHeight: 26 + x: at_marks_del.width - width - at_marks_del.rightPadding + y: parent.height / 2 - height / 2 + radius: 13 + color: at_marks_del.checked ? "#17a81a" : "transparent" + border.color: at_marks_del.checked ? "#17a81a" : "#cccccc" + Behavior on color{ + ColorAnimation{ + duration: 200 + } + } + + Rectangle { + x: at_marks_del.checked ? parent.width - width : 0 + width: 26 + height: 26 + radius: 13 + color: at_marks_del.down ? "#cccccc" : "#ffffff" + border.color: at_marks_del.checked ? (at_marks_del.down ? "#17a81a" : "#21be2b") : "#999999" + Behavior on x{ + NumberAnimation { + property: "x" + duration: 200 + easing.type: Easing.InOutQuad + } + } + } + } + } + + ItemDelegate { + id: at_marks_delay_del + text: "delay (ms)" + enabled: at_marks_del.checked + width: parent.width + font.pixelSize: options_stack.text_pixelSize + + TextField { + focus: true + placeholderText: "time" + width: parent.width * 0.3 + anchors.right: parent.right + inputMethodHints: Qt.ImhFormattedNumbersOnly + + text: _cppAppSettings.loadSetting("at_marks_delay") + + onTextChanged: { + _cppAppSettings.writeSetting("at_marks_delay",text) + } + } + } + } + } + + /*-----Custom animations-----*/ + + pushEnter: Transition { + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: 200 + easing.type: Easing.InOutQuad + } + } + pushExit: Transition { + NumberAnimation { + property: "opacity" + from: 1 + to: 0 + duration: 200 + easing.type: Easing.InOutQuad + } + } + + popExit: Transition { + NumberAnimation { + property: "opacity" + from: 1 + to: 0 + duration: 200 + easing.type: Easing.InOutQuad + } + } + popEnter: Transition { + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: 200 + easing.type: Easing.InOutQuad + } + } } + + } diff --git a/appsettings.cpp b/appsettings.cpp new file mode 100644 index 0000000..fb352d8 --- /dev/null +++ b/appsettings.cpp @@ -0,0 +1,30 @@ +#include "appsettings.h" + +AppSettings::AppSettings(QObject* parent) + :QObject(parent) +{ + QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + qDebug(path.toLatin1()); + this->settingsManager = new QSettings(path+"/settings.ini", QSettings::IniFormat); +} + +QString AppSettings::loadSetting(const QString &key) +{ + this->settingsManager->beginGroup("AppSettings"); + QString value = this->settingsManager->value(key , false).toString(); + this->settingsManager->endGroup(); + return(value); +} + +void AppSettings::writeSetting(const QString &key, const QVariant &variant) +{ + this->settingsManager->beginGroup("AppSettings"); + this->settingsManager->setValue(key , variant); + this->settingsManager->endGroup(); +} + +AppSettings::~AppSettings() +{ + delete settingsManager; +} + diff --git a/appsettings.h b/appsettings.h new file mode 100644 index 0000000..b5459ec --- /dev/null +++ b/appsettings.h @@ -0,0 +1,26 @@ +#ifndef APPSETTINGS_H +#define APPSETTINGS_H + +#include +#include +#include + +class AppSettings : public QObject +{ + Q_OBJECT +public: + explicit AppSettings(QObject *parent = nullptr); + ~AppSettings(); + + Q_INVOKABLE QString loadSetting(const QString &key); + Q_INVOKABLE void writeSetting(const QString &key, const QVariant &variant); + + QSettings *settingsManager; + +signals: + +public slots: +}; +extern AppSettings * pGlobalAppSettings; + +#endif // APPSETTINGS_H diff --git a/graphics/icons/back.png b/graphics/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..d1740cddfba8d063203d7ca5d676f494cbd0b937 GIT binary patch literal 2608 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 literal 0 HcmV?d00001 diff --git a/graphics/icons/back_black.png b/graphics/icons/back_black.png new file mode 100644 index 0000000000000000000000000000000000000000..c55ab315f9f7f3fc23cf62f8ec2c562ab269de49 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEEX7WqAsj$Z!;#Vf4nJ zu)P6cM!8Z8Q=p(^iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0xXJY5_^ zB3j?xFyv}>5OKZe9d%GPmG|bX?2UcC-=??;=p1A07CBtbHvePn1Wnr?-4prWS$#dQ zVQ$ga1MD-l2XozI6y}^hKk3Qhx!fK*1S`zy{8#*qaE@P}y8l>KjOQ^|W4&307kj$Z zdMEFT_CGxJU!JbYgpy0j=SmMqEBB|TtnFDdb>dc|O<~g=?md2&xA*QZCVe3ftCy^4 eepRf0_OG?-TcyL4Ij zaB^>EX>4U6ba`-PAZ2)IW&i+q+U;3uj`JuG{NJb8BhWzeI1W!~Z?MPT0vu=J$>iaQ zv|8yKYhnlErd-tx-Gtgde|P!|f7S#=R(x>LIfXwPZPW=DL9M@aW@YE+{L`0veA`a@ z4UHy)vsqtV+xjQ8%k=?oxAuJ7PQL6TEkoOli$OC+*0|XEh0T!BtDU#+6u0M+{qj27 ze=mC8mb`8qzgrJ7s=%Jnq?=)*@M*^=1_(?r31^Q_Hc^k3I9m)p#pwIo(SCU#Z@)Tl zr_$DLZmA&Uwhr#V(bmp#pS#J>S44ar`R0a_E3|Li^%{C_>+OOBj6Pa6su4(<0!4c{fdZd(fHrZy$F8dsE%&EYAiY-!H@gUKo_5tXRc}?}gL02m<4v`pn4SInRW&qw ze=)&hI+39n6w{WWxE~6@q4m&A1-4cX<%VV|Y6OL7sKzqHsXP>eg0``i&bxM3%(wZ_)fE`rDD2C#i#C6ud(>vY~qHgy^r-O zMbo==MJz(3^wEg5SoaY8xVE~F2U^YJTj!EYZ)~G4){K_Ke%{gE)!8F7@s)hH$SL3y za}=ZixoKQhmC-Aj?AAc=?r{z>ydLXS3(^pNvF15=GZY1WQn5lI)|Ky9XkUS$>jBt; zwLpyl8UfV}s0$>e7AU0_tdWaMSUV`-n6Q8s!0>9lnIB=j&KTWNcAhc1rR+RobW7QJ z#^{!^^Ni6WCwqr6dgNs9Fh-A@>>bAFk(0f{7`+~rj~S!a!}1F>^bQeuUQMM3EHjK) zD@IB-J!`2pV!4ZA3a+pcT4ec6ROBkQH<8e#74F%3ykNAZPV{IJ;A(^g#N~oz17M#_ zU((EG%Y?pcfr?>C`%W#?kb*J|i_M%-VerhE-ha@v0X&(!fX68Z6801(*}$H!*zfc3 zm4@RW^qbfDW9X!z)=gvMgU+_1MDih}hTN#a*>Vm}g@l#3u_Pq1@bZjuTME~L#h8Of zb(E{lC}O`m_2$ykF~*v_!nYWBby!Xjw4~-cZeTK?9_sKBRgh(==}}3+Tc(@AEU$o- z;a)TNm)Gs~c55^ve#ZA^QC)0e{EN+H@nG*3AKd~xkB@Evp2tUz2z&=0JtFWOeDsLG zckt2c0zbw_uM7MbADwl;BR)FofJc1vnE+Wy#0LVT1^P^Y;MG15AjQYdgqi}gmFode zQA*|{En=Rkr7D{p5(`zTwpLdAC>FQhij9MnE^Evwpe%#mfwp;oENDx;|i^gol(5YvIPSd zTT`!P3uJET-of6%+VG=c@M`ZQHoAiQ9X7gx`yDpAN8A}~bdR_**yypSuVbUfqP~ue zUUj%<*yvS1^0kBxp4s9&+sZvyp#4f9B*$EkVFD1WlS#9GamQkza0 zsh_bqXe5F`>#S||PBJBn307mqtXUhEjVg`{jAIs8?Tu`d(udO8KZfp{51Ba~Q}f$; zbCm5j73YryCw-s{d1B~$#kor5m5F>SIB9q5&8bIJJuJMx6Op-brp~q@2AHdLHutJV znN*?|ZLMSHyN=qH#9BpELCSih5Iv40q?T@F+nC6i{Jw2c<~UKywr%3t+%>6r-!*Z( z=+|r4#E(^fY)(kmSh9Q3ZI5Pa#%6|%vTZcwxohHG-*-(`KW)>tYf?w}SLE3{I%G82 zZ`&pV+=4a`OlV`*WCORLZNSD!2nH{x`Uq756);{oa&p7{| z4Z$I5gv|c}=BqX3G#T6e00006VoOIv0O$ZU05z5L)HwhE010qNS#tmYE+YT{E+YYW zr9XB6000McNliru;s+BE12k}{T6q8f06IxTK~z}7?bWdn03ZwlF`NB&4i!7VAyp}T zX+8no)^p6vTs5q1lC0Z5XdnPuEOlB8pv78jAn>mZvJ4Cs@;1-D00000NkvXXu0mjf DH1u2I0Jk_T!Hle|Nntx@v-JYAjMP? zEak7F*TW^m6^?GX5i`t37Uy%49p@Mf~H$ux#Li{f|=o!c*Whe T_w8$esu?_8{an^LB{Ts5XSyS3 literal 0 HcmV?d00001 diff --git a/graphics/icons/menu.png b/graphics/icons/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0d148881001428b3fb2e7dd364f1fb268c2dca GIT binary patch literal 2793 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 literal 0 HcmV?d00001 diff --git a/graphics/icons/menu_black.png b/graphics/icons/menu_black.png new file mode 100644 index 0000000000000000000000000000000000000000..649c2a08c6995b660c0a193764545ea06a02d595 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$F`~f~8u0Z<#|Nlzz@(^?|("com.itsblue.speedclimbingstopwatch", 1, 0, "SqlProfileModel"); @@ -87,6 +89,7 @@ int main(int argc, char *argv[]) return -1; engine.rootContext()->setContextProperty("_cppBuzzerConn", pBuzzerConn); + engine.rootContext()->setContextProperty("_cppAppSettings", pAppSettings); return app.exec(); } diff --git a/shared.qrc b/shared.qrc index 4ffc9a4..478f9bb 100644 --- a/shared.qrc +++ b/shared.qrc @@ -3,5 +3,11 @@ OFFICAL_IFSC_STARTIGNAL.wav graphics/icons/settings.png graphics/icons/user.png + graphics/icons/menu_black.png + graphics/icons/drawer_black.png + graphics/icons/back_black.png + graphics/icons/menu.png + graphics/icons/drawer.png + graphics/icons/back.png diff --git a/speedclimbing_stopwatch.pro b/speedclimbing_stopwatch.pro index 51c0fef..d2b6220 100644 --- a/speedclimbing_stopwatch.pro +++ b/speedclimbing_stopwatch.pro @@ -22,7 +22,8 @@ SOURCES += \ main.cpp \ sqlstoragemodel.cpp \ sqlprofilemodel.cpp \ - buzzerconn.cpp + buzzerconn.cpp \ + appsettings.cpp RESOURCES += qml.qrc \ shared.qrc @@ -52,4 +53,5 @@ android { HEADERS += \ sqlstoragemodel.h \ sqlprofilemodel.h \ - buzzerconn.h + buzzerconn.h \ + appsettings.h