From 5cc17218a4b6d4b459e76623969ac9b927991e6e Mon Sep 17 00:00:00 2001 From: "joogab.yun" Date: Thu, 10 Mar 2022 17:54:58 +0900 Subject: [PATCH 1/1] When using the auto-focusing function by enabling EnableDefaultAlgorithm, if there is no focused actor, focus on the closest actor based on the upper left corner of the current window. Change-Id: I8538a1957a17163361ac3b479eaa5dc3228fb69a --- .../dali-toolkit/utc-Dali-KeyboardFocusManager.cpp | 22 +++++++++++++++++++- .../devel-api/focus-manager/focus-finder.cpp | 15 ++++++++++++-- .../focus-manager/keyboard-focus-manager-impl.cpp | 24 +++++++++++++++++----- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp index 65876fb..785b509 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp @@ -1959,6 +1959,8 @@ int UtcDaliKeyboardFocusManagerEnableDefaultAlgorithm(void) // button1 -- button2 button1.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f)); button2.SetProperty(Actor::Property::POSITION, Vector2(100.0f, 0.0f)); + button1.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + button2.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); // flush the queue and render once application.SendNotification(); @@ -2003,13 +2005,31 @@ int UtcDaliKeyboardFocusManagerEnableDefaultAlgorithm(void) // Move the focus towards left, The focus move will success because the default algorithm is enabled. // [button1] -- button2 DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true); - // Confirm whether focus is moved to button2 + // Confirm whether focus is moved to button1 DALI_TEST_EQUALS(button1.GetProperty(DevelControl::Property::STATE), (int)DevelControl::FOCUSED, TEST_LOCATION); DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == button2); DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == button1); focusChangedCallback.Reset(); + // Clears focus. + manager.ClearFocus(); + // There is no actor focused. + // button1 -- button2 + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + + // Move the focus towards right, The focus is on the actor closest to the top left of the window. + // [button1] -- button2 + DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true); + + // Confirm whether focus is moved to button1 + DALI_TEST_EQUALS(button1.GetProperty(DevelControl::Property::STATE), (int)DevelControl::FOCUSED, TEST_LOCATION); + DALI_TEST_CHECK(focusChangedCallback.mSignalVerified); + DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == Actor()); + DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == button1); + focusChangedCallback.Reset(); + + END_TEST; } diff --git a/dali-toolkit/devel-api/focus-manager/focus-finder.cpp b/dali-toolkit/devel-api/focus-manager/focus-finder.cpp index c52bf57..d338e39 100644 --- a/dali-toolkit/devel-api/focus-manager/focus-finder.cpp +++ b/dali-toolkit/devel-api/focus-manager/focus-finder.cpp @@ -385,12 +385,23 @@ Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect& focusedRect, Actor GetNearestFocusableActor(Actor rootActor, Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction) { Actor nearestActor; - if(!focusedActor || !rootActor) + if(!rootActor) { return nearestActor; } - Rect focusedRect = DevelActor::CalculateScreenExtents(focusedActor); + Rect focusedRect; + if (!focusedActor) + { + // If there is no currently focused actor, it is searched based on the upper left corner of the current window. + Rect rootRect = DevelActor::CalculateScreenExtents(rootActor); + focusedRect = Rect(rootRect.x, rootRect.y, 0.f, 0.f); + } + else + { + focusedRect = DevelActor::CalculateScreenExtents(focusedActor); + } + // initialize the best candidate to something impossible // (so the first plausible actor will become the best choice) diff --git a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp index 75ffbfb..74e89dc 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -516,13 +516,27 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction nextFocusableActor = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction); mIsWaitingKeyboardFocusChangeCommit = false; } - else if(mEnableDefaultAlgorithm && currentFocusActor) + else if (mEnableDefaultAlgorithm) { - // We should find it among the actors nearby. - Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor); - if(window) + Layer rootLayer; + if (currentFocusActor) { - nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(window.GetRootLayer(), currentFocusActor, direction); + // Find the window of the focused actor. + Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor); + if (window) + { + rootLayer = window.GetRootLayer(); + } + } + else + { + // Searches from the currently focused window. + rootLayer = mCurrentFocusedWindow.GetHandle(); + } + if (rootLayer) + { + // We should find it among the actors nearby. + nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(rootLayer, currentFocusActor, direction); } } } -- 2.7.4