From: joogab yun Date: Mon, 25 Apr 2022 23:47:58 +0000 (+0000) Subject: Merge "If the currently focused actor is hidden or disabled, it should lose focus... X-Git-Tag: dali_2.1.20~5 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=d19410c023c18c050ae226c72c6d79ebf9b0de80;hp=cef6d2324d9ecca71abf3c9e63db8e371a636b8a Merge "If the currently focused actor is hidden or disabled, it should lose focus." into devel/master --- 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; } }