diff --git a/headers/scstwappbackend.h b/headers/scstwappbackend.h index 2e00a30..783906d 100644 --- a/headers/scstwappbackend.h +++ b/headers/scstwappbackend.h @@ -15,25 +15,18 @@ class ScStwAppBackend : public QObject { Q_OBJECT - Q_PROPERTY(ScStwRace* race READ getRace NOTIFY raceChanged) - Q_PROPERTY(ScStwClient *scStwClient READ getScStwClient NOTIFY scStwClientChanged) - Q_PROPERTY(ScStwAppSettings *settings READ getSettings NOTIFY settingsChanged) + Q_PROPERTY(ScStwClient *scStwClient READ getScStwClient WRITE setScStwClient NOTIFY scStwClientChanged) public: explicit ScStwAppBackend(QObject *parent = nullptr); private: - ScStwAppSettings * appSettings; ScStwClient * scStwClient; - QTimer * timerTextRefreshTimer; - ScStwRemoteRace * race; - public slots: // functions for qml - Q_INVOKABLE ScStwRace *getRace(); Q_INVOKABLE ScStwClient *getScStwClient(); - Q_INVOKABLE ScStwAppSettings *getSettings(); + Q_INVOKABLE void setScStwClient(ScStwClient *client); // athlete management Q_INVOKABLE QVariant getAthletes(); @@ -42,13 +35,8 @@ public slots: Q_INVOKABLE bool selectAthlete( QString userName, int timerId ); Q_INVOKABLE QVariant getResults( QString userName ); -private slots: - void refreshTimerText(); - signals: - void raceChanged(); void scStwClientChanged(); - void settingsChanged(); }; #endif // SCSTWAPPBACKEND_H diff --git a/headers/scstwappsettings.h b/headers/scstwappsettings.h index 26a6401..c42fa1d 100644 --- a/headers/scstwappsettings.h +++ b/headers/scstwappsettings.h @@ -10,6 +10,7 @@ class ScStwAppSettings : public ScStwRemoteSettings { Q_OBJECT public: + explicit ScStwAppSettings(QObject *parent = nullptr); explicit ScStwAppSettings(ScStwClient * scStwClient, QObject *parent = nullptr); enum AppInternalSetting { diff --git a/resources/qml/MainPage/CenterContent.qml b/resources/qml/MainPage/CenterContent.qml index e868a37..82b5b67 100644 --- a/resources/qml/MainPage/CenterContent.qml +++ b/resources/qml/MainPage/CenterContent.qml @@ -106,12 +106,12 @@ Item { Repeater { id: stateIndicatorRepeater - model: speedBackend.race.timers.length + model: scStwRemoteRace.timers.length delegate: ColumnLayout { id: timerStatusColumn - property var thisTimer: speedBackend.race.timers[index] + property var thisTimer: scStwRemoteRace.timers[index] width: parent.delegateWidth height: parent.delegateHeight @@ -152,7 +152,7 @@ Item { onClicked: { var disabled = timerStatusColumn.thisTimer["state"] !== ScStwTimer.DISABLED console.log("setting timer to disabled: " + disabled) - speedBackend.race.setTimerDisabled(timerStatusColumn.thisTimer["id"], disabled) + scStwRemoteRace.setTimerDisabled(timerStatusColumn.thisTimer["id"], disabled) } } } @@ -200,7 +200,7 @@ Item { id: mainActionButton property double size - startProgress: speedBackend.race.currentStartDelay["progress"] + startProgress: scStwRemoteRace.currentStartDelay["progress"] Layout.alignment: Layout.Center @@ -213,26 +213,26 @@ Item { var ret; - switch(speedBackend.race.state) { + switch(scStwRemoteRace.state) { case ScStwRace.IDLE: - ret = speedBackend.race.start() + ret = scStwRemoteRace.start() break; case ScStwRace.WAITING: - if(!speedBackend.race.readySoundEnabled && speedBackend.race.isReadyForNextState) - ret = speedBackend.race.start() + if(!scStwRemoteRace.readySoundEnabled && scStwRemoteRace.isReadyForNextState) + ret = scStwRemoteRace.start() else - ret = speedBackend.race.cancel() + ret = scStwRemoteRace.cancel() break; case ScStwRace.PREPAIRING: case ScStwRace.STARTING: - ret = speedBackend.race.cancel() + ret = scStwRemoteRace.cancel() break; case ScStwRace.RUNNING: - ret = speedBackend.race.stop() + ret = scStwRemoteRace.stop() break; case ScStwRace.STOPPED: case ScStwRace.INCIDENT: - ret = speedBackend.race.reset() + ret = scStwRemoteRace.reset() break; } @@ -299,27 +299,27 @@ Item { PropertyChanges { target: mainActionButton - size: speedBackend.race.competitionMode ? 0.3:0.9 - text: speedBackend.race.readySoundEnabled ? "cancel": speedBackend.race.isReadyForNextState ? "ready":"cancel" - progressControlActivated: speedBackend.race.competitionMode && !speedBackend.race.readySoundEnabled && !speedBackend.race.isReadyForNextState + size: scStwRemoteRace.competitionMode ? 0.3:0.9 + text: scStwRemoteRace.readySoundEnabled ? "cancel": scStwRemoteRace.isReadyForNextState ? "ready":"cancel" + progressControlActivated: scStwRemoteRace.competitionMode && !scStwRemoteRace.readySoundEnabled && !scStwRemoteRace.isReadyForNextState } PropertyChanges { target: centerExtraContentTop - size: speedBackend.race.competitionMode ? 0.7:0 + size: scStwRemoteRace.competitionMode ? 0.7:0 } PropertyChanges { target: centerExtraContentBottom - size: speedBackend.race.competitionMode ? 0.05:0 + size: scStwRemoteRace.competitionMode ? 0.05:0 } PropertyChanges { target: centerExtraContentTopStack - newItem: speedBackend.race.competitionMode ? waitingDetailsComp:emptyComp + newItem: scStwRemoteRace.competitionMode ? waitingDetailsComp:emptyComp } }, @@ -337,8 +337,8 @@ Item { PropertyChanges { target: mainActionButton size: 0.9 - text: speedBackend.race.competitionMode ? "cancel":"stop" - progressControlActivated: speedBackend.race.competitionMode + text: scStwRemoteRace.competitionMode ? "cancel":"stop" + progressControlActivated: scStwRemoteRace.competitionMode } }, @@ -375,19 +375,19 @@ Item { PropertyChanges { target: centerExtraContentTop - size: speedBackend.race.competitionMode ? 0.7:0 + size: scStwRemoteRace.competitionMode ? 0.7:0 } PropertyChanges { target: centerExtraContentBottom - size: speedBackend.race.competitionMode ? 0.05:0 + size: scStwRemoteRace.competitionMode ? 0.05:0 } PropertyChanges { target: centerExtraContentTopStack - newItem: speedBackend.race.competitionMode ? incidentDetailsComp:emptyComp + newItem: scStwRemoteRace.competitionMode ? incidentDetailsComp:emptyComp } } diff --git a/resources/qml/MainPage/TopToolBar.qml b/resources/qml/MainPage/TopToolBar.qml index 266f024..e90be3b 100644 --- a/resources/qml/MainPage/TopToolBar.qml +++ b/resources/qml/MainPage/TopToolBar.qml @@ -63,7 +63,7 @@ ToolBar { anchors.topMargin: app.landscape() ? 0:parent.height * 0.1 anchors.bottomMargin: app.landscape() ? 0:parent.height * 0.1 - timers: speedBackend.race.timers + timers: scStwRemoteRace.timers colors: appTheme.theme.colors fontName: appTheme.theme.fonts.timers showTimerLetter: true @@ -94,7 +94,7 @@ ToolBar { rightMargin: app.landscape() ? 0:parent.width * 0.8 } - opacity: speedBackend.race.state === ScStwRace.IDLE ? 1:0 + opacity: scStwRemoteRace.state === ScStwRace.IDLE ? 1:0 ConnectionIcon { id: baseConnConnIcon diff --git a/resources/qml/ProfilesDialog/ProfileListPage.qml b/resources/qml/ProfilesDialog/ProfileListPage.qml index d6686dd..5d2a044 100644 --- a/resources/qml/ProfilesDialog/ProfileListPage.qml +++ b/resources/qml/ProfilesDialog/ProfileListPage.qml @@ -132,22 +132,22 @@ RemoteDataListView { Repeater { id: athleteSelectBoxRep - model: speedBackend.race.timers.length + model: scStwRemoteRace.timers.length delegate: CheckBox { id: control - property bool active: speedBackend.race.timers[index]["id"] === profileList.listData[swipeDelegate.thisIndex]["active"] + property bool active: scStwRemoteRace.timers[index]["id"] === profileList.listData[swipeDelegate.thisIndex]["active"] anchors.verticalCenter: parent.verticalCenter height: parent.height * 0.6 - enabled: speedBackend.race.timers[index]["state"] !== ScStwTimer.DISABLED + enabled: scStwRemoteRace.timers[index]["state"] !== ScStwTimer.DISABLED checked: control.active onCheckedChanged: { - if(checked && !control.active && speedBackend.selectAthlete(profileList.listData[swipeDelegate.thisIndex]["userName"], speedBackend.race.timers[index]["id"])){ + if(checked && !control.active && speedBackend.selectAthlete(profileList.listData[swipeDelegate.thisIndex]["userName"], scStwRemoteRace.timers[index]["id"])){ profileList.loadData() } } diff --git a/resources/qml/SettingsDialog/SettingsBaseStationPage.qml b/resources/qml/SettingsDialog/SettingsBaseStationPage.qml index f82ef9b..b095d4d 100644 --- a/resources/qml/SettingsDialog/SettingsBaseStationPage.qml +++ b/resources/qml/SettingsDialog/SettingsBaseStationPage.qml @@ -1,4 +1,4 @@ -import QtQuick 2.9 +import QtQuick 2.12 import QtMultimedia 5.8 import QtQuick.Window 2.2 import QtQuick.Controls 2.12 @@ -52,69 +52,76 @@ Column { height: parentObj.delegateHeight } - Loader { + Item { + width: parent.width + height: parent.height * 0.05 + + Rectangle { + anchors { + top: parent.top + left: parent.left + right: parent.right + } + + height: 2 + color: appTheme.theme.colors.line + } + } + + StackView { id: baseStationOptionsLd - property alias parentComp: control - property alias baseConnected: control.baseConnected + width: parent.width + height: parent.height - onBaseConnectedChanged: { - disappearAnim.start() + property alias parentComp: control + property Component sourceComponent: control.baseConnected ? baseStationConnectedOptionsComp : baseStationDisconnectedOptionsComp + + onSourceComponentChanged: { + baseStationOptionsLd.replace(sourceComponent) } Component.onCompleted: { - baseStationOptionsLd.sourceComponent = control.baseConnected ? baseStationConnectedOptionsComp : baseStationDisconnectedOptionsComp - item.opacity = 1 - item.scale = 1 + baseStationOptionsLd.replace(sourceComponent) } - sourceComponent: null + replaceExit: Transition { + ParallelAnimation { + id: disappearAnim - ParallelAnimation { - id: disappearAnim + NumberAnimation { + property: "opacity" + to: 0 + duration: 100 + } - NumberAnimation { - property: "opacity" - to: 0 - duration: 100 - target: baseStationOptionsLd.item - } - - NumberAnimation { - property: "scale" - to: 0.95 - duration: 100 - target: baseStationOptionsLd.item - } - - onRunningChanged: { - if(!running) { - baseStationOptionsLd.sourceComponent = control.baseConnected ? baseStationConnectedOptionsComp : baseStationDisconnectedOptionsComp - appearAnim.start() + NumberAnimation { + property: "scale" + to: 0.95 + duration: 100 } } } - ParallelAnimation { - id: appearAnim + replaceEnter: Transition { + ParallelAnimation { + id: appearAnim - NumberAnimation { - property: "opacity" - from: 0 - to: 1 - duration: 100 - target: baseStationOptionsLd.item - } + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: 100 + } - NumberAnimation { - property: "scale" - from: 0.95 - to: 1 - duration: 100 - target: baseStationOptionsLd.item + NumberAnimation { + property: "scale" + from: 0.95 + to: 1 + duration: 100 + } } } - } Component { @@ -123,8 +130,6 @@ Column { Column { id: baseStationDisconnectedOptions - width: parentComp.width - opacity: 0 // opacity and scale are adjusted by baseStationOptionsLd scale: 0.95 @@ -134,11 +139,11 @@ Column { text: qsTr("IP") inputHint: "IP" - inputText: speedBackend.settings.readSetting(ScStwAppSettings.BaseStationIpSetting) + inputText: scStwAppSettings.readSetting(ScStwAppSettings.BaseStationIpSetting) inputTextFieldWidth: width * 0.7 onInputTextChanged: { - speedBackend.settings.writeSetting(ScStwAppSettings.BaseStationIpSetting, inputText) + scStwAppSettings.writeSetting(ScStwAppSettings.BaseStationIpSetting, inputText) } width: parent.width @@ -185,6 +190,9 @@ Column { width: parent.width height: parentObj.delegateHeight + scale: 0 + visible: false + verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter @@ -221,7 +229,7 @@ Column { SmoothSliderDelegate { id: baseStationVolumeDel - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwSettings.SoundVolumeSetting, ScStwSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.SoundVolumeSetting, ScStwSettings.KeyLevel) text: qsTr("volume") @@ -239,6 +247,23 @@ Column { } } + SmoothSwitchDelegate { + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.CompetitionModeSetting, ScStwSettings.KeyLevel) + + width: parent.width + height: parentObj.delegateHeight + + checked: setting.value + + onCheckedChanged: { + enabled = false + setting.value = checked + enabled = true + } + + text: qsTr("competition mode") + } + NextPageDelegate { text: qsTr("extensions") diff --git a/resources/qml/SettingsDialog/SettingsStartSequencePage.qml b/resources/qml/SettingsDialog/SettingsStartSequencePage.qml index e0b6122..f6da2b6 100644 --- a/resources/qml/SettingsDialog/SettingsStartSequencePage.qml +++ b/resources/qml/SettingsDialog/SettingsStartSequencePage.qml @@ -23,18 +23,18 @@ Column { function updateSetting(key, val, del){ del.busy = true - speedBackend.settings.writeSetting(key, val, ScStwSettings.KeyLevel) + scStwAppSettings.writeSetting(key, val, ScStwSettings.KeyLevel) del.busy = false } function loadSetting(key, del){ - return speedBackend.settings.readSetting(key, ScStwSettings.KeyLevel) + return scStwAppSettings.readSetting(key, ScStwSettings.KeyLevel) } SmoothSwitchDelegate { id: ready_del - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwSettings.ReadySoundEnableSetting, ScStwSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.ReadySoundEnableSetting, ScStwSettings.KeyLevel) width: parent.width height: parentObj.delegateHeight @@ -54,7 +54,7 @@ Column { id: ready_delay_del property bool busy: false - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwSettings.ReadySoundDelaySetting, ScStwSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.ReadySoundDelaySetting, ScStwSettings.KeyLevel) width: parent.width height: parentObj.delegateHeight @@ -78,7 +78,7 @@ Column { SmoothSwitchDelegate { id: at_marks_del - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwSettings.AtYourMarksSoundEnableSetting, ScStwSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.AtYourMarksSoundEnableSetting, ScStwSettings.KeyLevel) width: parent.width height: parentObj.delegateHeight @@ -98,7 +98,7 @@ Column { id: at_marks_delay_del property bool busy: false - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwSettings.AtYourMarksSoundDelaySetting, ScStwSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwSettings.AtYourMarksSoundDelaySetting, ScStwSettings.KeyLevel) width: parent.width height: parentObj.delegateHeight diff --git a/resources/qml/main.qml b/resources/qml/main.qml index 29fdac0..08b3b72 100644 --- a/resources/qml/main.qml +++ b/resources/qml/main.qml @@ -45,8 +45,7 @@ ApplicationWindow { id: app anchors.fill: parent - //set default state to IDLE - state: ScStwRace.IDLE + state: scStwRemoteRace.state Rectangle { id: backgroundRect @@ -64,28 +63,50 @@ ApplicationWindow { id: scStw } - SpeedBackend { - id: speedBackend + ScStwClient { + id: scStwClient + + property ScStwSetting ipSetting: scStwAppSettings.getSetting(ScStwAppSettings.BaseStationIpSetting, ScStwAppSettings.KeyLevel) + ipAddress: ipSetting.value } - Connections { - target: speedBackend.race - onStateChanged: { - var stateString - console.log("race state changed to: " + speedBackend.race.state) + ScStwAppSettings { + id: scStwAppSettings - if(speedBackend.race.state != ScStwRace.IDLE) { + scStwClient: scStwClient + } + + ScStwTimer { + id: defaultTimer + } + + ScStwRemoteRace { + id: scStwRemoteRace + + autoRefreshTimerText: true + settings: scStwAppSettings + scStwClient: scStwClient + + Component.onCompleted: { + scStwRemoteRace.addTimer(defaultTimer) + } + + onStateChanged: { + if(scStwRemoteRace.state !== ScStwRace.IDLE) { settingsDialog.close() profilesDialog.close() } - - app.state = speedBackend.race.state } } + SpeedBackend { + id: speedBackend + scStwClient: scStwClient + } + ScStwAppThemeManager { id: appTheme - property ScStwSetting setting: speedBackend.settings.getSetting(ScStwAppSettings.AppThemeSetting, ScStwAppSettings.KeyLevel) + property ScStwSetting setting: scStwAppSettings.getSetting(ScStwAppSettings.AppThemeSetting, ScStwAppSettings.KeyLevel) themeName: setting.value } @@ -252,196 +273,8 @@ ApplicationWindow { height: centerContent.height - margin * 2 } - /* - states: [ - State { - name: "IDLE" - //state for the start page - PropertyChanges { - target: topContainerItm; - anchors.bottomMargin: app.landscape() ? undefined:parent.height * 0.1; - anchors.rightMargin: app.landscape() ? parent.height * 0.05:0 - } - PropertyChanges { - target: startButt; - enabled: true; - text: "start"; - size: app.landscape() ? parent.width * 0.5:parent.height * 0.5 - anchors.bottomMargin: parent.height * 0.5 - startButt.height * 0.5 - anchors.rightMargin: parent.width * 0.5 - startButt.width * 0.5 - } - PropertyChanges { - target: topLa - text: "click start to start" - } - - }, - State { - name: "PREPAIRING" - //state for the start sequence - PropertyChanges { target: startButt; enabled: false; text: "starting..."; - anchors.rightMargin: app.landscape() ? parent.width * 0.05:parent.width * 0.5 - startButt.width * 0.5 //put the button more to the right to hide the menu (only in landscape mode) - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.1 //put the button lower to hide the menu (only in portrait mode) - } - PropertyChanges { target: cancelButt; scale: 1} - PropertyChanges { target: menu_container; } - PropertyChanges { - target: topLa - text: "At your marks" - } - }, - State { - name: "WAITING" - PropertyChanges { - target: startButt; enabled: false; text: "waiting..."; - anchors.rightMargin: app.landscape() ? parent.width * 0.05:parent.width * 0.5 - startButt.width * 0.5 //put the button more to the right to hide the menu (only in landscape mode) - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.1 //put the button lower to hide the menu (only in portrait mode) - } - PropertyChanges { target: cancelButt; scale: 0; enabled: false} - PropertyChanges { target: menu_container; } - PropertyChanges { - target: topLa - implicitText: "Ready" - } - }, - State { - name: "STARTING" - //state for the start sequence - PropertyChanges { target: startButt; enabled: false; text: "starting..."; - anchors.rightMargin: app.landscape() ? parent.width * 0.05:parent.width * 0.5 - startButt.width * 0.5 //put the button more to the right to hide the menu (only in landscape mode) - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.1 //put the button lower to hide the menu (only in portrait mode) - } - PropertyChanges { target: cancelButt; scale: 1} - PropertyChanges { target: menu_container; } - PropertyChanges { - target: topLa - implicitText: "Starting" - } - - }, - State { - name: "RUNNING" - //state when the timer is running - PropertyChanges { target: startButt; enabled: true; - text: speedBackend.scStwClient.state === ScStwClient.CONNECTED ? "cancel":"stop" - anchors.rightMargin: app.landscape() ? parent.width * 0.05:parent.width * 0.5 - startButt.width * 0.5 //put the button more to the right to hide the menu (only in landscape mode) - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.1 //put the button lower to hide the menu (only in portrait mode) - } - PropertyChanges { - target: topLa - implicitText: "" - } - }, - - State { - name: "STOPPED" - //state when the meassuring is over - PropertyChanges { - target: startButt; - enabled: true; text: "reset"; - size: app.landscape() ? parent.height * 0.35:parent.height * 0.2; - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.2 - startButt.height * 0.5 - anchors.rightMargin: app.landscape() ? parent.height * 0.2 - startButt.height * 0.5:parent.width * 0.5 - startButt.width * 0.5 - } - PropertyChanges { - target: topContainerItm; - anchors.rightMargin: app.landscape() ? 0-startButt.width/2:undefined - anchors.bottomMargin: app.landscape() ? undefined:0-startButt.height/2 - } - PropertyChanges { - target: topLa - text: "" - } - }, - - State { - name: "INCIDENT" - //state when the meassuring is over - PropertyChanges { - target: startButt; - enabled: true; text: "reset"; - size: app.landscape() ? parent.height * 0.35:parent.height * 0.2; - anchors.bottomMargin: app.landscape() ? parent.height * 0.5 - startButt.height * 0.5:parent.height * 0.2 - startButt.height * 0.5 - anchors.rightMargin: app.landscape() ? parent.height * 0.2 - startButt.height * 0.5:parent.width * 0.5 - startButt.width * 0.5 - } - PropertyChanges { - target: topContainerItm; - anchors.rightMargin: app.landscape() ? 0-startButt.width/2:undefined - anchors.bottomMargin: app.landscape() ? undefined:0-startButt.height/2 - } - PropertyChanges { - target: topLa - text: "" - } - } - ] - - /*---------------------- - Timer animations - ----------------------*/ - /*transitions: [ - Transition { - NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize"; easing.type: Easing.InOutQuad; duration: 700 } - }, - Transition { - to: "STOPPED" - NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize"; easing.type: Easing.InOutQuad; duration: 700 } - }, - Transition { - to: "IDLE" - NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize"; easing.type: Easing.InOutQuad; duration: 700 } - }, - - Transition { - from: "STARTING" - to: "RUNNING" - //disable transitions for the RUNNING state - }, - Transition { - from: "RUNNING" - to: "WAITING" - //disable transitions for the RUNNING state - } - ]*/ - - /*---------------------- - Timer functions - ----------------------*/ function landscape(){ return(app.height < app.width) } - - /*----Functions to control the stopwatch----*/ - function start(){ - var ret = speedBackend.race.start() - if(ret !== 200){ - console.log("+ --- error starting race: " + ret) - } - } - - function cancel() { - var ret = speedBackend.race.cancel() - if(ret !== 200){ - console.log("+ --- error canellingr race: " + ret) - } - } - - function stop(){ - - var ret = speedBackend.race.stop() - - if(ret !== 200){ - console.log("+ --- error stopping race: " + ret) - } - } - - function reset(){ - - var ret = speedBackend.race.reset() - - if(ret !== 200){ - console.log("+ --- error resetting race: " + ret) - } - } } } diff --git a/resources/qml/qml.qrc b/resources/qml/qml.qrc index 338755b..26fa609 100644 --- a/resources/qml/qml.qrc +++ b/resources/qml/qml.qrc @@ -21,7 +21,6 @@ SettingsDialog/StartPage.qml SettingsDialog/SettingsStartSequencePage.qml SettingsDialog/SettingsBaseStationPage.qml - main.old.qml components/layout/ToolBar.qml MainPage/TopToolBar.qml MainPage/CenterContent.qml diff --git a/shared-libraries b/shared-libraries index f8cc236..ca040a1 160000 --- a/shared-libraries +++ b/shared-libraries @@ -1 +1 @@ -Subproject commit f8cc23646cd77c85b4d86b145e4da3779a4766aa +Subproject commit ca040a191cf9575e0b6095547522a6d1b09cecca diff --git a/sources/main.cpp b/sources/main.cpp index f13fd67..a4efc7b 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) // setup speed backend qmlRegisterType("de.itsblue.ScStwApp", 2, 0, "SpeedBackend"); - qmlRegisterUncreatableType("de.itsblue.ScStwApp", 2, 0, "ScStwAppSettings", "The ScStwAppSettings type is not creatable!"); + qmlRegisterType("de.itsblue.ScStwApp", 2, 0, "ScStwAppSettings"); qRegisterMetaType("ScStwAppSettings::BaseStationSetting"); diff --git a/sources/scstwappbackend.cpp b/sources/scstwappbackend.cpp index d3d2f0d..e196798 100644 --- a/sources/scstwappbackend.cpp +++ b/sources/scstwappbackend.cpp @@ -2,39 +2,17 @@ ScStwAppBackend::ScStwAppBackend(QObject *parent) : QObject(parent) { - this->scStwClient = new ScStwClient(this); - - this->appSettings = new ScStwAppSettings(this->scStwClient, this); - - this->race = new ScStwRemoteRace(this->scStwClient, this->appSettings, this); - this->race->addTimer(new ScStwTimer(this)); - - this->scStwClient->setIP(this->appSettings->readSetting(ScStwAppSettings::BaseStationIpSetting).toString()); - - this->timerTextRefreshTimer = new QTimer(this); - this->timerTextRefreshTimer->setInterval(1); - this->timerTextRefreshTimer->setSingleShot(true); - this->timerTextRefreshTimer->connect(this->timerTextRefreshTimer, &QTimer::timeout, this, &ScStwAppBackend::refreshTimerText); - this->refreshTimerText(); } // ------------------------ // --- helper functions --- // ------------------------ -void ScStwAppBackend::refreshTimerText() { - - // --- refresh timer text --- - if(this->getRace()->getState() == ScStwRace::RUNNING) { - emit this->getRace()->timersChanged(); +void ScStwAppBackend::setScStwClient(ScStwClient *client) { + if(client != this->scStwClient) { + this->scStwClient = client; + emit this->scStwClientChanged(); } - - // --- refresh next start action delay progress --- - if(this->getRace()->getState() == ScStwRace::WAITING || this->getRace()->getState() == ScStwRace::PREPAIRING) { - emit this->getRace()->currentStartDelayChanged(); - } - - this->timerTextRefreshTimer->start(); } // - athlete management - @@ -123,14 +101,6 @@ QVariant ScStwAppBackend::getResults( QString userName ){ // --- functions for qml --- // ------------------------- -ScStwRace* ScStwAppBackend::getRace() { - return this->race; -} - -ScStwAppSettings * ScStwAppBackend::getSettings() { - return this->appSettings; -} - ScStwClient* ScStwAppBackend::getScStwClient() { return this->scStwClient; } diff --git a/sources/scstwappsettings.cpp b/sources/scstwappsettings.cpp index 98578da..abacf85 100644 --- a/sources/scstwappsettings.cpp +++ b/sources/scstwappsettings.cpp @@ -19,6 +19,10 @@ ScStwAppSettings * pGlobalAppSettings = nullptr; +ScStwAppSettings::ScStwAppSettings(QObject *parent) : ScStwAppSettings (nullptr, parent) +{ +} + ScStwAppSettings::ScStwAppSettings(ScStwClient * client, QObject* parent) :ScStwRemoteSettings(client, parent) {