From 1f764df15036f4f14a982e9e377f1f68f2936467 Mon Sep 17 00:00:00 2001 From: Gaelle Braud Date: Fri, 20 Sep 2024 11:03:10 +0200 Subject: [PATCH] [do not squash] validation checking in textfield rename --- Linphone/view/CMakeLists.txt | 2 +- .../view/Control/Container/FormItemLayout.qml | 4 ++ ...edTextField.qml => DecoratedTextField.qml} | 49 ++++++------------- Linphone/view/Control/Input/TextField.qml | 46 ++++++++++++++++- .../AccountSettingsParametersLayout.qml | 1 + 5 files changed, 66 insertions(+), 36 deletions(-) rename Linphone/view/Control/Input/{ValidatedTextField.qml => DecoratedTextField.qml} (53%) diff --git a/Linphone/view/CMakeLists.txt b/Linphone/view/CMakeLists.txt index 600556e4..5da31501 100644 --- a/Linphone/view/CMakeLists.txt +++ b/Linphone/view/CMakeLists.txt @@ -52,6 +52,7 @@ list(APPEND _LINPHONEAPP_QML_FILES view/Control/Form/Settings/ScreencastSettings.qml view/Control/Input/Calendar.qml + view/Control/Input/DecoratedTextField.qml view/Control/Input/DigitInput.qml view/Control/Input/NumericPad.qml view/Control/Input/PhoneNumberInput.qml @@ -59,7 +60,6 @@ list(APPEND _LINPHONEAPP_QML_FILES view/Control/Input/TextArea.qml view/Control/Input/TextField.qml view/Control/Input/TimeComboBox.qml - view/Control/Input/ValidatedTextField.qml view/Control/Popup/DesktopPopup.qml view/Control/Popup/InformationPopup.qml diff --git a/Linphone/view/Control/Container/FormItemLayout.qml b/Linphone/view/Control/Container/FormItemLayout.qml index a7e78690..30bd351a 100644 --- a/Linphone/view/Control/Container/FormItemLayout.qml +++ b/Linphone/view/Control/Container/FormItemLayout.qml @@ -16,6 +16,10 @@ FocusScope{ property bool errorTextVisible: errorText.text.length > 0 implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth + + function clearErrorText() { + errorText.clear() + } ColumnLayout { id: layout spacing: 5 * DefaultStyle.dp diff --git a/Linphone/view/Control/Input/ValidatedTextField.qml b/Linphone/view/Control/Input/DecoratedTextField.qml similarity index 53% rename from Linphone/view/Control/Input/ValidatedTextField.qml rename to Linphone/view/Control/Input/DecoratedTextField.qml index 7ff2d9c3..d9e02048 100644 --- a/Linphone/view/Control/Input/ValidatedTextField.qml +++ b/Linphone/view/Control/Input/DecoratedTextField.qml @@ -15,52 +15,33 @@ FormItemLayout { property var title property var placeHolder property bool useTitleAsPlaceHolder: true - property int idleTimeOut: 200 - property var isValid: function(text) { - return true; - } + property bool canBeEmpty: true + property alias hidden: textField.hidden property alias validator: textField.validator - property bool empty: mainItem.propertyOwner[mainItem.propertyName]?.length == 0 - property bool canBeEmpty: true + + property var isValid: function(text) { + return true + } + contentItem: TextField { id: textField - property var initialReading: true placeholderText: useTitleAsPlaceHolder ? mainItem.title : mainItem.placeHolder initialText: mainItem.propertyOwner[mainItem.propertyName] customWidth: mainItem.parent.width - Timer { - id: idleTimer - running: false - interval: mainItem.idleTimeOut - repeat: false - onTriggered: textField.editingFinished() - } - onEditingFinished: { - updateText() - } - onTextChanged: { - idleTimer.restart() - updateText() - } - function updateText() { - mainItem.empty = text.length == 0 - if (initialReading) { - initialReading = false - return - } - if (!canBeEmpty && mainItem.empty) { + propertyName: mainItem.propertyName + propertyOwner: mainItem.propertyOwner + canBeEmpty: mainItem.canBeEmpty + isValid: mainItem.isValid + onValidationChecked: (isValid) => { + if (isValid) return + if (!canBeEmpty && empty) { mainItem.errorMessage = qsTr("ne peut ĂȘtre vide") - return - } - if (isValid(text)) { - mainItem.errorMessage = "" - if (mainItem.propertyOwner[mainItem.propertyName] != text) - mainItem.propertyOwner[mainItem.propertyName] = text } else { mainItem.errorMessage = qsTr("Format non reconnu") } } + onTextChanged: mainItem.clearErrorText() } } diff --git a/Linphone/view/Control/Input/TextField.qml b/Linphone/view/Control/Input/TextField.qml index 29e18b7c..158ac642 100644 --- a/Linphone/view/Control/Input/TextField.qml +++ b/Linphone/view/Control/Input/TextField.qml @@ -33,7 +33,20 @@ Control.TextField { property string initialText property int pixelSize: 14 * DefaultStyle.dp property int weight: 400 * DefaultStyle.dp - + + // fill propertyName and propertyOwner to check text validity + property string propertyName + property var propertyOwner + property var initialReading: true + property var isValid: function(text) { + return true + } + property int idleTimeOut: 200 + property bool empty: mainItem.propertyOwner[mainItem.propertyName]?.length == 0 + property bool canBeEmpty: true + + signal validationChecked(bool valid) + Component.onCompleted: { text = initialText } @@ -124,5 +137,36 @@ Control.TextField { anchors.right: parent.right anchors.rightMargin: rightMargin } + + // Validation textfield functions + Timer { + id: idleTimer + running: false + interval: mainItem.idleTimeOut + repeat: false + onTriggered: textField.editingFinished() + } + onEditingFinished: { + updateText() + } + onTextChanged: { + idleTimer.restart() + // updateText() + } + function updateText() { + mainItem.empty = text.length == 0 + if (initialReading) { + initialReading = false + } + if (mainItem.empty && !mainItem.canBeEmpty) { + mainItem.validationChecked(false) + return + } + if (isValid(text)) { + if (mainItem.propertyOwner[mainItem.propertyName] != text) + mainItem.propertyOwner[mainItem.propertyName] = text + mainItem.validationChecked(true) + } else mainItem.validationChecked(false) + } } diff --git a/Linphone/view/Page/Layout/Settings/AccountSettingsParametersLayout.qml b/Linphone/view/Page/Layout/Settings/AccountSettingsParametersLayout.qml index 2eac4d64..6cc1a600 100644 --- a/Linphone/view/Page/Layout/Settings/AccountSettingsParametersLayout.qml +++ b/Linphone/view/Page/Layout/Settings/AccountSettingsParametersLayout.qml @@ -141,6 +141,7 @@ AbstractSettingsLayout { propertyName: "expire" propertyOwner: account.core title: qsTr("Expiration (en seconde)") + canBeEmpty: false isValid: function(text) { return !isNaN(Number(text)); } } ValidatedTextField {