From b611685653776e936ec586e82cdc6e0a38232fd3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Fri, 2 Jun 2023 14:56:31 -0400
Subject: [PATCH] settingsmaterialtextedit: fix focus changes

Change-Id: I289b610e43317470d061e7ecd6338bfa805c5ce7
GitLab: #1171
---
 src/app/commoncomponents/ModalTextEdit.qml    |  2 +-
 .../components/SettingsMaterialTextEdit.qml   | 16 ++++-
 .../qml/src/tst_SettingsMaterialTextEdit.qml  | 61 +++++++++++++++++++
 3 files changed, 75 insertions(+), 4 deletions(-)
 create mode 100644 tests/qml/src/tst_SettingsMaterialTextEdit.qml

diff --git a/src/app/commoncomponents/ModalTextEdit.qml b/src/app/commoncomponents/ModalTextEdit.qml
index 105b16855..94de2686c 100644
--- a/src/app/commoncomponents/ModalTextEdit.qml
+++ b/src/app/commoncomponents/ModalTextEdit.qml
@@ -75,7 +75,7 @@ Loader {
 
     // Needed to give proper focus to loaded item
     onFocusChanged: {
-        if (root.focus && root.isPersistent) {
+        if (item && root.focus && root.isPersistent) {
             item.forceActiveFocus();
         }
         isEditing = !isEditing;
diff --git a/src/app/settingsview/components/SettingsMaterialTextEdit.qml b/src/app/settingsview/components/SettingsMaterialTextEdit.qml
index 67064b78d..1f638607a 100644
--- a/src/app/settingsview/components/SettingsMaterialTextEdit.qml
+++ b/src/app/settingsview/components/SettingsMaterialTextEdit.qml
@@ -63,6 +63,7 @@ RowLayout {
         }
 
         visible: !root.isPassword
+        focus: visible
         isSettings: true
 
         Layout.alignment: Qt.AlignCenter
@@ -73,7 +74,7 @@ RowLayout {
 
         onAccepted: {
             root.dynamicText = dynamicText;
-            editFinished();
+            root.editFinished();
         }
 
         editMode: false
@@ -82,7 +83,7 @@ RowLayout {
         onActiveFocusChanged: {
             if (!activeFocus) {
                 root.dynamicText = dynamicText;
-                editFinished();
+                root.editFinished();
                 modalTextEdit.editMode = false;
             } else {
                 modalTextEdit.editMode = true;
@@ -94,6 +95,7 @@ RowLayout {
         id: passwordTextEdit
 
         visible: root.isPassword
+        focus: visible
         isSettings: true
 
         Layout.alignment: Qt.AlignCenter
@@ -103,8 +105,16 @@ RowLayout {
 
         onAccepted: {
             root.dynamicText = dynamicText;
-            editFinished();
+            root.editFinished();
             echoMode = TextInput.Password;
         }
+
+        onActiveFocusChanged: {
+            if (!activeFocus) {
+                root.dynamicText = dynamicText;
+                root.editFinished();
+                echoMode = TextInput.Password;
+            }
+        }
     }
 }
diff --git a/tests/qml/src/tst_SettingsMaterialTextEdit.qml b/tests/qml/src/tst_SettingsMaterialTextEdit.qml
new file mode 100644
index 000000000..1200e61c0
--- /dev/null
+++ b/tests/qml/src/tst_SettingsMaterialTextEdit.qml
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2023 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+
+import QtTest
+
+import "../../../src/app/"
+import "../../../src/app/settingsview/components"
+
+ColumnLayout {
+    id: root
+
+    spacing: 0
+    width: 300
+    height: 300
+
+    Item {
+        id: dummy
+    }
+
+    SettingsMaterialTextEdit {
+        id: uut
+
+        property bool focusLeft: false
+        isPassword: true
+
+        TestCase {
+            name: "Test password un-focus"
+            when: windowShown
+
+            function test_unfocusPassword() {
+                // Open the recorder and take a picture
+                uut.forceActiveFocus()
+                dummy.forceActiveFocus()
+                compare(uut.focusLeft, true)
+            }
+        }
+
+        onEditFinished: focusLeft = true
+
+        Layout.fillWidth: true
+        Layout.fillHeight: true
+    }
+}
-- 
GitLab