From: Bowon Ryu Date: Mon, 26 Aug 2024 04:48:30 +0000 (+0900) Subject: Fix text cursor visibility issue X-Git-Tag: dali_2.3.39~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ccbc029b6fd2d46355beef8c9013a5c7f75bdd98;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 1adc2fd014..690fd0257f 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1476,6 +1476,53 @@ 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) { // The text-editor emits signals when the input style changes. These changes of style are diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 0b0c5d0d49..e7d79b696a 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1857,6 +1857,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 fdca0ea592..33deefc46e 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -1288,10 +1288,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 95141afde3..cd098c84f4 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -1121,10 +1121,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 {