From 690c477f9e4abb1b20b5158ee4503be93db480c3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Wed, 17 Jul 2024 23:07:24 +0200 Subject: [PATCH] Implemented EditValueItem for friendly name and price limit --- CMakeLists.txt | 4 ++- ChangeNumberItem.qml | 45 -------------------------- ChargerTabPage.qml | 8 ++++- DoubleSpinBox.qml | 33 +++++++++++++++++++ EditValueItem.qml | 71 +++++++++++++++++++++++++++++++++++++++++ GeneralOnOffSwitch.qml | 9 ++---- NamePage.qml | 17 ++++++++-- SelectLogicModeItem.qml | 9 +++--- SetPriceLimitPage.qml | 13 ++++++-- SetValueHelper.qml | 13 ++++++++ WiFiOnOffSwitch.qml | 15 +++------ qmldir | 4 ++- 12 files changed, 166 insertions(+), 75 deletions(-) delete mode 100644 ChangeNumberItem.qml create mode 100644 DoubleSpinBox.qml create mode 100644 EditValueItem.qml create mode 100644 SetValueHelper.qml diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b14adb..be93502 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,6 @@ qt_add_qml_module(evcharger-app CablePage.qml CarPage.qml CenteredDialog.qml - ChangeNumberItem.qml ChargerTabPage.qml ChargingConfigurationPage.qml ChargingSpeedPage.qml @@ -79,7 +78,9 @@ qt_add_qml_module(evcharger-app DeviceListScreen.qml DeviceScreen.qml DisplaySettingsPage.qml + DoubleSpinBox.qml EcoTabPage.qml + EditValueItem.qml EthernetPage.qml EVChargerApp.qml FirmwarePage.qml @@ -114,6 +115,7 @@ qt_add_qml_module(evcharger-app SensorsConfigurationPage.qml SetPriceLimitPage.qml SettingsTabPage.qml + SetValueHelper.qml SimpleNavigationItem.qml SwitchLanguagePage.qml TimeComponentLabel.qml diff --git a/ChangeNumberItem.qml b/ChangeNumberItem.qml deleted file mode 100644 index d8b051b..0000000 --- a/ChangeNumberItem.qml +++ /dev/null @@ -1,45 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts - -WhiteItemDelegate { - property alias descriptionText: descriptionText.text - property alias valueText: valueText.text - - Layout.fillWidth: true - - contentItem: RowLayout { - Text { - id: descriptionText - wrapMode: Text.Wrap - Layout.fillWidth: true - font.bold: true - } - - Text { - id: valueText - } - - Text { - text: ">" - } - } - - onClicked: dialog.open() - - CenteredDialog { - id: dialog - - title: qsTr("Password required") - standardButtons: Dialog.Ok | Dialog.Cancel - focus: true - modal: true - - contentItem: SpinBox { - - } - - // onAccepted: theDeviceConnection.sendAuth(passwordInput.text) - // onRejected: loader.close() - } -} diff --git a/ChargerTabPage.qml b/ChargerTabPage.qml index d77d4b6..4607b61 100644 --- a/ChargerTabPage.qml +++ b/ChargerTabPage.qml @@ -168,10 +168,16 @@ AnimatedStackView { } NavigationItem { + ApiKeyValueHelper { + id: priceLimitHelper + deviceConnection: theDeviceConnection + apiKey: "awp" + } + visible: logicMode.value == 4 iconSource: "material-icons/grid_guides.svg" title: qsTr("Price limit") - description: qsTr("%0 ct/kWh").arg(0) + description: qsTr("%0 ct/kWh").arg(priceLimitHelper.value) component: "SetPriceLimitPage.qml" } diff --git a/DoubleSpinBox.qml b/DoubleSpinBox.qml new file mode 100644 index 0000000..11c711e --- /dev/null +++ b/DoubleSpinBox.qml @@ -0,0 +1,33 @@ +import QtQuick +import QtQuick.Controls + +Item { + id: doubleSpinBox + + property int decimals: 2 + property real value: 0.0 + property real from: 0.0 + property real to: 100.0 + property real stepSize: 1.0 + + SpinBox { + property real factor: Math.pow(10, decimals) + + id: spinbox + + stepSize: doubleSpinBox.stepSize * factor + value: doubleSpinBox.value * factor + onValueChanged: doubleSpinBox.value = spinbox.value / factor + to : doubleSpinBox.to * factor + from : doubleSpinBox.from * factor + + validator: DoubleValidator { + bottom: Math.min(spinbox.from, spinbox.to) * spinbox.factor + top: Math.max(spinbox.from, spinbox.to) * spinbox.factor + } + + textFromValue: function(value, locale) { + return parseFloat(value * 1.0 / factor).toFixed(decimals) + } + } +} diff --git a/EditValueItem.qml b/EditValueItem.qml new file mode 100644 index 0000000..0b938ae --- /dev/null +++ b/EditValueItem.qml @@ -0,0 +1,71 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import EVChargerApp + +WhiteItemDelegate { + id: itemDelegate + + required property string apiKey + property string valueText: apiKeyValueHelper.value + property alias editableItem: dialog.contentItem + property alias value: apiKeyValueHelper.value + property bool fullWidth: false + + Layout.fillWidth: true + + ApiKeyValueHelper { + id: apiKeyValueHelper + deviceConnection: theDeviceConnection + apiKey: itemDelegate.apiKey + } + + SetValueHelper { + id: setValueHelper + deviceConnection: theDeviceConnection + apiKey: itemDelegate.apiKey + } + + contentItem: RowLayout { + Text { + wrapMode: Text.Wrap + Layout.fillWidth: true + font.bold: true + text: itemDelegate.text + } + + Text { + text: itemDelegate.valueText + } + + Text { + text: ">" + } + } + + onClicked: { + editableItem.value = value + dialog.open() + } + + CenteredDialog { + id: dialog + + title: itemDelegate.text + standardButtons: Dialog.Ok | Dialog.Cancel + focus: true + modal: true + + Binding { + target: dialog + property: "width" + value: dialog.parent.width + when: fullWidth + } + + onAccepted: { + console.log(editableItem.value) + setValueHelper.setValue(editableItem.value) + } + } +} diff --git a/GeneralOnOffSwitch.qml b/GeneralOnOffSwitch.qml index 0868515..c93bfff 100644 --- a/GeneralOnOffSwitch.qml +++ b/GeneralOnOffSwitch.qml @@ -21,9 +21,10 @@ WhiteCheckDelegate { apiKey: checkDelegate.apiKey } - SendMessageHelper { + SetValueHelper { id: valueChanger deviceConnection: theDeviceConnection + apiKey: checkDelegate.apiKey onResponseChanged: checkDelegate.checked = Qt.binding(function(){ return valueHelper.value; }) } @@ -31,11 +32,7 @@ WhiteCheckDelegate { text: valueHelper.value ? qsTr("On") : qsTr("Off") onClicked: { - valueChanger.sendMessage({ - type: "setValue", - key: checkDelegate.apiKey, - value: checked - }) + valueChanger.setValue(checked) } BusyIndicator { diff --git a/NamePage.qml b/NamePage.qml index 7a320fc..3e9610f 100644 --- a/NamePage.qml +++ b/NamePage.qml @@ -5,9 +5,20 @@ import QtQuick.Layouts NavigationPage { title: qsTr("Name") - Text { - text: "TODO" + NavigationItem { + iconSource: "material-icons/grid_guides.svg" + title: qsTr("Name") + component: "NamePage.qml" + } - Layout.fillHeight: true + EditValueItem { + id: test + text: qsTr("Name") + apiKey: "fna" + fullWidth: true + editableItem: TextField { + id: textField + property alias value: textField.text + } } } diff --git a/SelectLogicModeItem.qml b/SelectLogicModeItem.qml index 93f9d1e..e32cd4b 100644 --- a/SelectLogicModeItem.qml +++ b/SelectLogicModeItem.qml @@ -9,9 +9,10 @@ WhiteBox { RowLayout { anchors.fill: parent - SendMessageHelper { + SetValueHelper { id: valueChanger deviceConnection: theDeviceConnection + apiKey: "lmo" onResponseChanged: { ecoButton.checked = Qt.binding(() => ecoButton.selectedMode) basicButton.checked = Qt.binding(() => basicButton.selectedMode) @@ -35,7 +36,7 @@ WhiteBox { if (selectedMode) tabBar.setCurrentIndex(1) else - valueChanger.sendMessage({type: "setValue", key: "lmo", value: 4}) + valueChanger.setValue(4) } } @@ -47,7 +48,7 @@ WhiteBox { text: qsTr("Basic") icon.source: "icons/EcoModeFilled.svg" description: qsTr("Basic charging") - onClicked: valueChanger.sendMessage({type: "setValue", key: "lmo", value: 3}) + onClicked: valueChanger.setValue(3) } LogicModeButton { @@ -62,7 +63,7 @@ WhiteBox { if (selectedMode) stackView.push(dailyTripPageComponent) else - valueChanger.sendMessage({type: "setValue", key: "lmo", value: 5}) + valueChanger.setValue(5) } Component { diff --git a/SetPriceLimitPage.qml b/SetPriceLimitPage.qml index aa772f4..325d970 100644 --- a/SetPriceLimitPage.qml +++ b/SetPriceLimitPage.qml @@ -11,9 +11,16 @@ NavigationPage { wrapMode: Text.Wrap } - ChangeNumberItem { - descriptionText: qsTr("Price limit") - valueText: qsTr("%0 ct/kWh").arg(0) + EditValueItem { + id: test + text: qsTr("Price limit") + valueText: qsTr("%0 ct/kWh").arg(test.value) + apiKey: "awp" + editableItem: DoubleSpinBox { + from: -1000. + to: 1000. + stepSize: .1 + } } Item { diff --git a/SetValueHelper.qml b/SetValueHelper.qml new file mode 100644 index 0000000..4b28094 --- /dev/null +++ b/SetValueHelper.qml @@ -0,0 +1,13 @@ +import EVChargerApp + +SendMessageHelper { + required property string apiKey + + function setValue(value) { + sendMessage({ + type: "setValue", + key: apiKey, + value: value + }) + } +} diff --git a/WiFiOnOffSwitch.qml b/WiFiOnOffSwitch.qml index 1ee64d3..3f66dcd 100644 --- a/WiFiOnOffSwitch.qml +++ b/WiFiOnOffSwitch.qml @@ -18,9 +18,10 @@ WhiteCheckDelegate { apiKey: "wen" } - SendMessageHelper { + SetValueHelper { id: staEnabledChanger deviceConnection: theDeviceConnection + apiKey: "wen" } checked: staEnabled.value @@ -28,11 +29,7 @@ WhiteCheckDelegate { onClicked: { if (checked) - staEnabledChanger.sendMessage({ - type: "setValue", - key: "wen", - value: checked - }) + staEnabledChanger.setValue(checked) else { checked = true disableStaDialog.open() @@ -57,11 +54,7 @@ WhiteCheckDelegate { onAccepted: { checkDelegate.checked = false - staEnabledChanger.sendMessage({ - type: "setValue", - key: "wen", - value: false - }) + staEnabledChanger.setValue(false) } onRejected: checkDelegate.checked = Qt.binding(function() { return staEnabled.value }) diff --git a/qmldir b/qmldir index 87f0796..62af13c 100644 --- a/qmldir +++ b/qmldir @@ -13,7 +13,6 @@ EVChargerApp 1.0 BaseNavigationPage.qml EVChargerApp 1.0 CablePage.qml EVChargerApp 1.0 CarPage.qml EVChargerApp 1.0 CenteredDialog.qml -EVChargerApp 1.0 ChangeNumberItem.qml EVChargerApp 1.0 ChargerTabPage.qml EVChargerApp 1.0 ChargingConfigurationPage.qml EVChargerApp 1.0 ChargingSpeedPage.qml @@ -29,7 +28,9 @@ EVChargerApp 1.0 DateAndTimePage.qml EVChargerApp 1.0 DeviceListScreen.qml EVChargerApp 1.0 DeviceScreen.qml EVChargerApp 1.0 DisplaySettingsPage.qml +EVChargerApp 1.0 DoubleSpinBox.qml EVChargerApp 1.0 EcoTabPage.qml +EVChargerApp 1.0 EditValueItem.qml EVChargerApp 1.0 EthernetPage.qml EVChargerApp 1.0 EVChargerApp.qml EVChargerApp 1.0 FirmwarePage.qml @@ -64,6 +65,7 @@ EVChargerApp 1.0 SelectLogicModeItem.qml EVChargerApp 1.0 SensorsConfigurationPage.qml EVChargerApp 1.0 SetPriceLimitPage.qml EVChargerApp 1.0 SettingsTabPage.qml +EVChargerApp 1.0 SetValueHelper.qml EVChargerApp 1.0 SimpleNavigationItem.qml EVChargerApp 1.0 SwitchLanguagePage.qml EVChargerApp 1.0 TimeComponentLabel.qml