From: joogab.yun Date: Thu, 14 Apr 2022 08:39:56 +0000 (+0900) Subject: If the currently focused actor is hidden or disabled, it should lose focus. X-Git-Tag: dali_2.1.20~5^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=e3cb09bfd9a25de3fa35db1b2c3082bcb838d700 If the currently focused actor is hidden or disabled, it should lose focus. Change-Id: I9ccc144a266982085b4aae43cbd87bd1e3d2391e --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp index 1ca7bd4..d0bb94b 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp @@ -2220,13 +2220,13 @@ int UtcDaliKeyboardFocusManagerWithUserInteractionEnabled(void) KeyboardFocusManager manager = KeyboardFocusManager::Get(); DALI_TEST_CHECK(manager); - // Create the first actor and add it to the stage - Actor first = Actor::New(); + // Create the first control and add it to the stage + Control first = Control::New(); first.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); application.GetScene().Add(first); - // Create the second actor and add it to the first actor. - Actor second = Actor::New(); + // Create the second control and add it to the first control. + Control second = Control::New(); second.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); first.Add(second); @@ -2251,5 +2251,60 @@ int UtcDaliKeyboardFocusManagerWithUserInteractionEnabled(void) DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true); DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + // If the currently focused actor becomes USER_INTERACTION_ENABLED false, it loses focus. + second.SetProperty(DevelActor::Property::USER_INTERACTION_ENABLED, false); + + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + + + END_TEST; +} + + +int UtcDaliKeyboardFocusManagerWithHide(void) +{ + ToolkitTestApplication application; + + tet_infoline(" UtcDaliKeyboardFocusManagerWithHide"); + + KeyboardFocusManager manager = KeyboardFocusManager::Get(); + DALI_TEST_CHECK(manager); + + // Create the first control and add it to the stage + Control first = Control::New(); + first.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + application.GetScene().Add(first); + + // Create the second control and add it to the first control. + Control second = Control::New(); + second.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + first.Add(second); + + + // flush the queue and render once + application.SendNotification(); + application.Render(); + + // Check that no actor is being focused yet. + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + + // Check that the focus is set on the actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first); + + // If the currently focused actor becomes VISIBLE false, it loses focus. + first.SetProperty(Actor::Property::VISIBLE, false); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + + first.SetProperty(Actor::Property::VISIBLE, true); + // Check that the focus is set on the actor + DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second); + + // If the currently focused actor becomes VISIBLE false, When the parent is hidden, the child also loses focus. + first.SetProperty(Actor::Property::VISIBLE, false); + DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor()); + + END_TEST; } \ No newline at end of file diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index 271b826..9b10ffd 100644 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -581,7 +581,31 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper } case Actor::Property::VISIBLE: { - GetAccessibleObject()->EmitVisible(Self().GetProperty(Actor::Property::VISIBLE)); + const bool visible = propertyValue.Get(); + GetAccessibleObject()->EmitVisible(visible); + if(!visible) + { + Dali::Actor self = Self(); + Dali::Actor actor = Dali::Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor(); + while(actor) + { + if(self == actor) + { + Dali::Toolkit::KeyboardFocusManager::Get().ClearFocus(); + break; + } + actor = actor.GetParent(); + } + } + break; + } + case DevelActor::Property::USER_INTERACTION_ENABLED: + { + const bool enabled = propertyValue.Get(); + if (!enabled && Self() == Dali::Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor()) + { + Dali::Toolkit::KeyboardFocusManager::Get().ClearFocus(); + } break; } }