mFocusedActorEnterKeySignal(),
mCurrentFocusActor(),
mFocusIndicatorActor(),
+ mFocusFinderRootActor(),
mFocusHistory(),
mSlotDelegate(this),
mCustomAlgorithmInterface(NULL),
{
bool success = false;
- // If the parent's KEYBOARD_FOCUSABLE_CHILDREN is false, it cannot have focus.
- if(actor)
+ // Check whether the actor is in the stage and is keyboard focusable.
+ if(actor &&
+ actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) &&
+ actor.GetProperty<bool>(DevelActor::Property::USER_INTERACTION_ENABLED) &&
+ actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE) &&
+ actor.GetProperty<bool>(Actor::Property::VISIBLE))
{
+ // If the parent's KEYBOARD_FOCUSABLE_CHILDREN is false, it cannot have focus.
Actor parent = actor.GetParent();
while(parent)
{
if(!parent.GetProperty<bool>(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN))
{
- DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Parent Actor has KEYBOARD_FOCUSABLE_CHILDREN false,\n", __FUNCTION__, __LINE__);
+ DALI_LOG_INFO(gLogFilter, Debug::General, "[%s:%d] Parent Actor has KEYBOARD_FOCUSABLE_CHILDREN false\n", __FUNCTION__, __LINE__);
return false;
}
parent = parent.GetParent();
}
- }
- if(actor && actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) && actor.GetProperty<bool>(DevelActor::Property::USER_INTERACTION_ENABLED) && actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE))
- {
- Integration::SceneHolder currentWindow = Integration::SceneHolder::Get(actor);
+ // If developer set focus on same actor, doing nothing
+ Actor currentFocusedActor = GetCurrentFocusActor();
+ if(actor == currentFocusedActor)
+ {
+ return true;
+ }
+ Integration::SceneHolder currentWindow = Integration::SceneHolder::Get(actor);
if(currentWindow.GetRootLayer() != mCurrentFocusedWindow.GetHandle())
{
Layer rootLayer = currentWindow.GetRootLayer();
mCurrentFocusedWindow = rootLayer;
}
- }
- Actor currentFocusedActor = GetCurrentFocusActor();
-
- // If developer set focus on same actor, doing nothing
- if(actor == currentFocusedActor)
- {
- if(!actor)
- {
- return false;
- }
- return true;
- }
-
- // Check whether the actor is in the stage and is keyboard focusable.
- if(actor && actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) && actor.GetProperty<bool>(DevelActor::Property::USER_INTERACTION_ENABLED) && actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE))
- {
if((mIsFocusIndicatorShown == SHOW) && (mEnableFocusIndicator == ENABLE))
{
actor.Add(GetFocusIndicatorActor());
}
-
Toolkit::Control currentlyFocusedControl = Toolkit::Control::DownCast(currentFocusedActor);
if(currentlyFocusedControl)
{
bool succeed = false;
// Go through the actor's hierarchy until we find a layout control that knows how to move the focus
- Toolkit::Control parentLayoutControl = GetParentLayoutControl(currentFocusActor);
- while(parentLayoutControl && !succeed)
+ Toolkit::Control layoutControl = IsLayoutControl(currentFocusActor) ? Toolkit::Control::DownCast(currentFocusActor) : GetParentLayoutControl(currentFocusActor);
+ while(layoutControl && !succeed)
{
- succeed = DoMoveFocusWithinLayoutControl(parentLayoutControl, currentFocusActor, direction);
- parentLayoutControl = GetParentLayoutControl(parentLayoutControl);
+ succeed = DoMoveFocusWithinLayoutControl(layoutControl, currentFocusActor, direction);
+ layoutControl = GetParentLayoutControl(layoutControl);
}
if(!succeed)
}
else if (mEnableDefaultAlgorithm)
{
- Layer rootLayer;
- if (currentFocusActor)
+ Actor rootActor = mFocusFinderRootActor.GetHandle();
+ if(!rootActor)
{
- // Find the window of the focused actor.
- Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor);
- if (window)
+ if (currentFocusActor)
{
- rootLayer = window.GetRootLayer();
+ // Find the window of the focused actor.
+ Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor);
+ if (window)
+ {
+ rootActor = window.GetRootLayer();
+ }
+ }
+ else
+ {
+ // Searches from the currently focused window.
+ rootActor = mCurrentFocusedWindow.GetHandle();
}
}
- else
- {
- // Searches from the currently focused window.
- rootLayer = mCurrentFocusedWindow.GetHandle();
- }
- if (rootLayer)
+ if(rootActor)
{
// We should find it among the actors nearby.
- nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(rootLayer, currentFocusActor, direction);
+ nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(rootActor, currentFocusActor, direction);
}
}
}
Toolkit::Control layoutControl = Toolkit::Control::DownCast(nextFocusableActor);
succeed = DoMoveFocusWithinLayoutControl(layoutControl, currentFocusActor, direction);
}
- else
+ if(!succeed)
{
- // Otherwise, just set focus to the next focusable actor
+ // Just set focus to the next focusable actor
succeed = SetCurrentFocusActor(nextFocusableActor);
}
}
if(committedFocusActor && committedFocusActor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) && committedFocusActor.GetProperty<bool>(DevelActor::Property::USER_INTERACTION_ENABLED))
{
// Whether the commited focusable actor is a layout control
- if(IsLayoutControl(committedFocusActor))
+ if(IsLayoutControl(committedFocusActor) && committedFocusActor != control)
{
// If so, move the focus inside it.
Toolkit::Control layoutControl = Toolkit::Control::DownCast(committedFocusActor);
return mEnableDefaultAlgorithm;
}
+void KeyboardFocusManager::SetFocusFinderRootActor(Actor actor)
+{
+ mFocusFinderRootActor = actor;
+}
+
+void KeyboardFocusManager::ResetFocusFinderRootActor()
+{
+ mFocusFinderRootActor.Reset();
+}
+
} // namespace Internal
} // namespace Toolkit