From 939375996496a55a1bb424d6a328f47d2224ed51 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Thu, 3 Jun 2010 16:27:47 +1000
Subject: Improve input panel handling in declarative demos and examples

Task-number: QTBUG-11157
Reviewed-by: Warwick Allison
---
 demos/declarative/flickr/mobile/TitleBar.qml         |  2 +-
 .../photoviewer/PhotoViewerCore/EditableButton.qml   |  2 +-
 demos/declarative/samegame/SamegameCore/Dialog.qml   |  5 +++--
 demos/declarative/samegame/samegame.qml              | 20 ++++++++++++++++----
 .../declarative/twitter/TwitterCore/HomeTitleBar.qml |  2 +-
 demos/declarative/twitter/TwitterCore/TitleBar.qml   |  2 +-
 demos/declarative/twitter/twitter.qml                |  5 +++++
 examples/declarative/text/edit/edit.qml              |  3 +++
 examples/declarative/toys/corkboards/Day.qml         |  7 ++++++-
 .../declarative/toys/dynamicscene/dynamicscene.qml   |  7 ++++++-
 .../tutorials/samegame/samegame4/content/Dialog.qml  | 12 ++++++++++--
 .../ui-components/searchbox/SearchBox.qml            |  4 ++--
 .../declarative/ui-components/searchbox/main.qml     |  5 +++++
 .../graphicsitems/qdeclarativetextedit.cpp           |  2 +-
 .../graphicsitems/qdeclarativetextinput.cpp          |  2 +-
 .../tst_qdeclarativetextedit.cpp                     |  6 ------
 .../tst_qdeclarativetextinput.cpp                    |  6 ------
 17 files changed, 62 insertions(+), 30 deletions(-)

diff --git a/demos/declarative/flickr/mobile/TitleBar.qml b/demos/declarative/flickr/mobile/TitleBar.qml
index da144d4..c7e1a53 100644
--- a/demos/declarative/flickr/mobile/TitleBar.qml
+++ b/demos/declarative/flickr/mobile/TitleBar.qml
@@ -118,7 +118,7 @@ Item {
         name: "Tags"
         PropertyChanges { target: container; x: -tagButton.x + 5 }
         PropertyChanges { target: tagButton; text: "OK" }
-        PropertyChanges { target: lineEdit; focus: true }
+        PropertyChanges { target: editor; focus: true }
     }
 
     transitions: Transition {
diff --git a/demos/declarative/photoviewer/PhotoViewerCore/EditableButton.qml b/demos/declarative/photoviewer/PhotoViewerCore/EditableButton.qml
index e15adbc..6109535 100644
--- a/demos/declarative/photoviewer/PhotoViewerCore/EditableButton.qml
+++ b/demos/declarative/photoviewer/PhotoViewerCore/EditableButton.qml
@@ -77,6 +77,6 @@ Item {
 
     MouseArea {
         anchors { fill: parent; leftMargin: -20; topMargin: -20; rightMargin: -20; bottomMargin: -20 }
-        onClicked: textInput.forceFocus()
+        onClicked: { textInput.forceFocus(); textInput.openSoftwareInputPanel(); }
     }
 }
diff --git a/demos/declarative/samegame/SamegameCore/Dialog.qml b/demos/declarative/samegame/SamegameCore/Dialog.qml
index 8dd12f6..c71a4b3 100644
--- a/demos/declarative/samegame/SamegameCore/Dialog.qml
+++ b/demos/declarative/samegame/SamegameCore/Dialog.qml
@@ -47,13 +47,14 @@ Rectangle {
     property Item text: dialogText
 
     signal closed
-
+    signal opened
     function forceClose() {
         page.closed();
         page.opacity = 0;
     }
 
     function show(txt) {
+        page.opened();
         dialogText.text = txt;
         page.opacity = 1;
     }
@@ -62,7 +63,7 @@ Rectangle {
     color: "white"
     border.width: 1
     opacity: 0
-
+    visible: opacity > 0
     Behavior on opacity {
         NumberAnimation { duration: 1000 }
     }
diff --git a/demos/declarative/samegame/samegame.qml b/demos/declarative/samegame/samegame.qml
index 54c18d6..9a721da 100644
--- a/demos/declarative/samegame/samegame.qml
+++ b/demos/declarative/samegame/samegame.qml
@@ -90,17 +90,31 @@ Rectangle {
             enabled: initialWidth != 0
         }
 
+        onOpened: nameInputText.focus = true;
+        onClosed: {
+            nameInputText.focus = false;
+            if (nameInputText.text != "")
+                Logic.saveHighScore(nameInputText.text);
+        }
         Text {
             id: dialogText
             anchors { left: nameInputDialog.left; leftMargin: 20; verticalCenter: parent.verticalCenter }
             text: "You won! Please enter your name: "
         }
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                if (nameInputText.text == "")
+                    nameInputText.openSoftwareInputPanel();
+                else
+                    nameInputDialog.forceClose();
+            }
+        }
 
         TextInput {
             id: nameInputText
             anchors { verticalCenter: parent.verticalCenter; left: dialogText.right }
-            focus: true
-
+            focus: false
             onTextChanged: {
                 var newWidth = nameInputText.width + dialogText.width + 40;
                 if ( (newWidth > nameInputDialog.width && newWidth < screen.width) 
@@ -108,8 +122,6 @@ Rectangle {
                     nameInputDialog.width = newWidth;
             }
             onAccepted: {
-                if (nameInputDialog.opacity == 1 && nameInputText.text != "")
-                    Logic.saveHighScore(nameInputText.text);
                 nameInputDialog.forceClose();
             }
         }
diff --git a/demos/declarative/twitter/TwitterCore/HomeTitleBar.qml b/demos/declarative/twitter/TwitterCore/HomeTitleBar.qml
index 3828a40..52164ed 100644
--- a/demos/declarative/twitter/TwitterCore/HomeTitleBar.qml
+++ b/demos/declarative/twitter/TwitterCore/HomeTitleBar.qml
@@ -148,7 +148,7 @@ Item {
             PropertyChanges { target: tagButton; text: "OK" }
             PropertyChanges { target: tagButton; width: 28 }
             PropertyChanges { target: tagButton; height: 24 }
-            PropertyChanges { target: txtEdit; focus: true }
+            PropertyChanges { target: editor; focus: true }
         }
     ]
     transitions: [
diff --git a/demos/declarative/twitter/TwitterCore/TitleBar.qml b/demos/declarative/twitter/TwitterCore/TitleBar.qml
index 0cf79a3..6cd0a50 100644
--- a/demos/declarative/twitter/TwitterCore/TitleBar.qml
+++ b/demos/declarative/twitter/TwitterCore/TitleBar.qml
@@ -107,7 +107,7 @@ Item {
         name: "Tags"
         PropertyChanges { target: container; x: -tagButton.x + 5 }
         PropertyChanges { target: tagButton; text: "OK" }
-        PropertyChanges { target: lineEdit; focus: true }
+        PropertyChanges { target: editor; focus: true }
     }
 
     transitions: Transition {
diff --git a/demos/declarative/twitter/twitter.qml b/demos/declarative/twitter/twitter.qml
index aa216cc..08cecb0 100644
--- a/demos/declarative/twitter/twitter.qml
+++ b/demos/declarative/twitter/twitter.qml
@@ -70,6 +70,11 @@ Item {
 
         Image { source: "TwitterCore/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 }
 
+        MouseArea {
+            anchors.fill: parent
+            onClicked: screen.focus = false;
+        }
+
         Twitter.RssModel { id: rssModel }
         Twitter.Loading { anchors.centerIn: parent; visible: rssModel.status==XmlListModel.Loading && state!='unauthed'}
         Text {
diff --git a/examples/declarative/text/edit/edit.qml b/examples/declarative/text/edit/edit.qml
index 0be42e9..4668ab2 100644
--- a/examples/declarative/text/edit/edit.qml
+++ b/examples/declarative/text/edit/edit.qml
@@ -121,6 +121,9 @@ Rectangle {
                     onClicked: {
                         if (editor.state == "") {
                             edit.cursorPosition = edit.positionAt(mouse.x+x,mouse.y+y);
+                            if (!edit.focus)
+                                edit.focus = true;
+                            edit.openSoftwareInputPanel();
                         }
                     }
                     function hitHandle(h,x,y) { return x>=h.x+flick.contentX && x<h.x+flick.contentX+h.width && y>=h.y+flick.contentY && y<h.y+flick.contentY+h.height }
diff --git a/examples/declarative/toys/corkboards/Day.qml b/examples/declarative/toys/corkboards/Day.qml
index f9c901f..cc297b1 100644
--- a/examples/declarative/toys/corkboards/Day.qml
+++ b/examples/declarative/toys/corkboards/Day.qml
@@ -49,6 +49,11 @@ Component {
 
         Image { source: "cork.jpg" }
 
+        MouseArea {
+            anchors.fill: parent
+            onClicked: page.focus = false;
+        }
+
         Text {
             text: name; x: 15; y: 8; height: 40; width: 370
             font.pixelSize: 18; font.bold: true; color: "white"
@@ -106,7 +111,7 @@ Component {
                             drag.maximumY: page.height - 80
                             drag.minimumX: 100
                             drag.maximumX: page.width - 140
-                            onClicked: { myText.focus = true }
+                            onClicked: { myText.focus = true; myText.openSoftwareInputPanel(); }
                         }
                     }
                 }
diff --git a/examples/declarative/toys/dynamicscene/dynamicscene.qml b/examples/declarative/toys/dynamicscene/dynamicscene.qml
index 659a257..1edb841 100644
--- a/examples/declarative/toys/dynamicscene/dynamicscene.qml
+++ b/examples/declarative/toys/dynamicscene/dynamicscene.qml
@@ -50,7 +50,12 @@ Item {
     //This is a desktop-sized example
     width: 800; height: 480
 
-    
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: window.focus = false;
+    }
+
     //This is the message box that pops up when there's an error
     Rectangle {
         id: dialog
diff --git a/examples/declarative/tutorials/samegame/samegame4/content/Dialog.qml b/examples/declarative/tutorials/samegame/samegame4/content/Dialog.qml
index d235d35..c216c08 100644
--- a/examples/declarative/tutorials/samegame/samegame4/content/Dialog.qml
+++ b/examples/declarative/tutorials/samegame/samegame4/content/Dialog.qml
@@ -58,10 +58,12 @@ Rectangle {
     function showWithInput(text) {
         show(text);
         textInput.opacity = 1;
+        textInput.focus = true;
         textInput.text = ""
     }
 
     function hide() {
+        textInput.focus = false;
         container.opacity = 0;
         container.closed();
     }
@@ -70,6 +72,7 @@ Rectangle {
     width: dialogText.width + textInput.width + 20
     height: dialogText.height + 20
     opacity: 0
+    visible: opacity > 0
 
     Text {
         id: dialogText
@@ -82,7 +85,6 @@ Rectangle {
         id: textInput
         anchors { verticalCenter: parent.verticalCenter; left: dialogText.right }
         width: 80
-        focus: true
         text: ""
 
         onAccepted: container.hide()    // close dialog when Enter is pressed
@@ -91,7 +93,13 @@ Rectangle {
 
     MouseArea {
         anchors.fill: parent
-        onClicked: hide();
+
+        onClicked:  {
+            if (textInput.text == "" && textInput.opacity > 0)
+                textInput.openSoftwareInputPanel();
+            else
+                hide();
+        }
     }
 
 //![3]
diff --git a/examples/declarative/ui-components/searchbox/SearchBox.qml b/examples/declarative/ui-components/searchbox/SearchBox.qml
index c022626..eaa6b6b 100644
--- a/examples/declarative/ui-components/searchbox/SearchBox.qml
+++ b/examples/declarative/ui-components/searchbox/SearchBox.qml
@@ -66,7 +66,7 @@ FocusScope {
         font.italic: true
     }
 
-    MouseArea { anchors.fill: parent; onClicked: focusScope.focus = true }
+    MouseArea { anchors.fill: parent; onClicked: { focusScope.focus = true; textInput.openSoftwareInputPanel(); } }
 
     TextInput {
         id: textInput
@@ -82,7 +82,7 @@ FocusScope {
 
         MouseArea { 
             anchors.fill: parent
-            onClicked: { textInput.text = ''; focusScope.focus = true }
+            onClicked: { textInput.text = ''; focusScope.focus = true; textInput.openSoftwareInputPanel(); }
         }
     }
 
diff --git a/examples/declarative/ui-components/searchbox/main.qml b/examples/declarative/ui-components/searchbox/main.qml
index 0508d5a..bf3bed8 100644
--- a/examples/declarative/ui-components/searchbox/main.qml
+++ b/examples/declarative/ui-components/searchbox/main.qml
@@ -41,9 +41,14 @@
 import Qt 4.7
 
 Rectangle {
+    id: page
     width: 500; height: 250
     color: "#edecec"
 
+    MouseArea {
+        anchors.fill: parent
+        onClicked: page.focus = false;
+    }
     Column {
         anchors { horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter }
         spacing: 10
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index 48826ff..535a39d 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -1488,7 +1488,7 @@ void QDeclarativeTextEdit::focusInEvent(QFocusEvent *event)
 {
     Q_D(const QDeclarativeTextEdit);
     if (d->showInputPanelOnFocus) {
-        if (d->focusOnPress && !isReadOnly() && event->reason() != Qt::ActiveWindowFocusReason) {
+        if (d->focusOnPress && !isReadOnly()) {
             openSoftwareInputPanel();
         }
     }
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 1202101..3911a97 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -1333,7 +1333,7 @@ void QDeclarativeTextInput::focusInEvent(QFocusEvent *event)
 {
     Q_D(const QDeclarativeTextInput);
     if (d->showInputPanelOnFocus) {
-        if (d->focusOnPress && !isReadOnly() && event->reason() != Qt::ActiveWindowFocusReason) {
+        if (d->focusOnPress && !isReadOnly()) {
             openSoftwareInputPanel();
         }
     }
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index fbab30e..474eb3f 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -956,12 +956,6 @@ void tst_qdeclarativetextedit::openInputPanelOnFocus()
     edit.setFocusOnPress(true);
     QCOMPARE(focusOnPressSpy.count(),2);
 
-    // active window focus reason should not cause input panel to open
-    QGraphicsObject * editObject = qobject_cast<QGraphicsObject*>(&edit);
-    editObject->setFocus(Qt::ActiveWindowFocusReason);
-    QCOMPARE(ic.openInputPanelReceived, false);
-    QCOMPARE(ic.closeInputPanelReceived, false);
-
     // and input panel should not open if focus has already been set
     edit.setFocus(true);
     QCOMPARE(ic.openInputPanelReceived, false);
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index 3cb4da0..c1c6634 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -902,12 +902,6 @@ void tst_qdeclarativetextinput::openInputPanelOnFocus()
     input.setFocusOnPress(true);
     QCOMPARE(focusOnPressSpy.count(),2);
 
-    // active window focus reason should not cause input panel to open
-    QGraphicsObject * inputObject = qobject_cast<QGraphicsObject*>(&input);
-    inputObject->setFocus(Qt::ActiveWindowFocusReason);
-    QCOMPARE(ic.openInputPanelReceived, false);
-    QCOMPARE(ic.closeInputPanelReceived, false);
-
     // and input panel should not open if focus has already been set
     input.setFocus(true);
     QCOMPARE(ic.openInputPanelReceived, false);
-- 
cgit v0.12