From: Bowon Ryu Date: Mon, 26 Aug 2024 04:48:30 +0000 (+0900) Subject: [Tizen] Fix text cursor visibility issue X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_6.5;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Fix text cursor visibility issue Ensured that the cursor remains active even when the keyboard is invisible but the control still has focus. Change-Id: Ie4a57646f866eecc7c0082615155dd6cc0ad889c Signed-off-by: Bowon Ryu --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index 02dff2e..dc3a693 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1234,6 +1234,52 @@ int utcDaliTextEditorTextChangedWithInputMethodContext(void) END_TEST; } +int utcDaliTextEditorFocusWithInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextEditorFocusWithInputMethodContext"); + TextEditor editor = TextEditor::New(); + DALI_TEST_CHECK(editor); + + application.GetScene().Add(editor); + editor.SetProperty(DevelTextEditor::Property::ENABLE_EDITING, true); + application.SendNotification(); + application.Render(); + + // get InputMethodContext + InputMethodContext inputMethodContext = DevelTextEditor::GetInputMethodContext(editor); + DALI_TEST_CHECK(inputMethodContext); + + // connect StatusChangedSignal + editor.SetKeyInputFocus(); + + // keyboard shown + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + // set focus and keyboard shown + editor.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + KeyboardFocusManager::Get().SetCurrentFocusActor(editor); + + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden, focus should remain + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(editor, KeyboardFocusManager::Get().GetCurrentFocusActor(), TEST_LOCATION); + + END_TEST; +} int utcDaliTextEditorInputStyleChanged01(void) { diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index a82de59..fc2957e 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1565,6 +1565,53 @@ int utcDaliTextFieldInputFilterWithInputMethodContext(void) END_TEST; } +int utcDaliTextFieldFocusWithInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldFocusWithInputMethodContext"); + TextField field = TextField::New(); + DALI_TEST_CHECK(field); + + application.GetScene().Add(field); + field.SetProperty(DevelTextField::Property::ENABLE_EDITING, true); + application.SendNotification(); + application.Render(); + + // get InputMethodContext + InputMethodContext inputMethodContext = DevelTextField::GetInputMethodContext(field); + DALI_TEST_CHECK(inputMethodContext); + + // connect StatusChangedSignal + field.SetKeyInputFocus(); + + // keyboard shown + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + // set focus and keyboard shown + field.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + KeyboardFocusManager::Get().SetCurrentFocusActor(field); + + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden, focus should remain + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(field, KeyboardFocusManager::Get().GetCurrentFocusActor(), TEST_LOCATION); + + END_TEST; +} + // Negative test for the textChanged signal. int utcDaliTextFieldTextChangedN(void) { diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index 0259471..e284a9d 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -1155,10 +1156,21 @@ void TextEditor::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); + bool isFocused = false; + + Dali::Toolkit::KeyboardFocusManager keyboardFocusManager = Dali::Toolkit::KeyboardFocusManager::Get(); + if(keyboardFocusManager) + { + isFocused = keyboardFocusManager.GetCurrentFocusActor() == Self(); + } + // Just hide the grab handle when keyboard is hidden. if(!keyboardShown) { - mController->KeyboardFocusLostEvent(); + if(!isFocused) + { + mController->KeyboardFocusLostEvent(); + } } else { diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index b48faa0..7cbb567 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -1052,10 +1053,21 @@ void TextField::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextFieldLogFilter, Debug::Verbose, "TextField::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); + bool isFocused = false; + + Dali::Toolkit::KeyboardFocusManager keyboardFocusManager = Dali::Toolkit::KeyboardFocusManager::Get(); + if(keyboardFocusManager) + { + isFocused = keyboardFocusManager.GetCurrentFocusActor() == Self(); + } + // Just hide the grab handle when keyboard is hidden. if(!keyboardShown) { - mController->KeyboardFocusLostEvent(); + if(!isFocused) + { + mController->KeyboardFocusLostEvent(); + } } else {