X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ffocus-manager%2Fkeyboard-focus-manager-impl.cpp;h=57fe0767cac47d71a6bb6bd1faefd47cf2485ccf;hp=28d305db09a171153ac72d46d645ebf8935da1b6;hb=9795d65d103bdf0524aa92e96475019eff2705f3;hpb=edc5e7ec2426fcf1a21b1e4fb659bce603a28849 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 28d305d..57fe076 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,6 @@ #include #include #include -#include #include namespace Dali @@ -121,10 +120,11 @@ KeyboardFocusManager::KeyboardFocusManager() mIsFocusIndicatorEnabled( false ), mIsWaitingKeyboardFocusChangeCommit( false ), mFocusHistory(), - mSlotDelegate( this ) + mSlotDelegate( this ), + mCustomAlgorithmInterface(NULL) { // TODO: Get FocusIndicatorEnable constant from stylesheet to set mIsFocusIndicatorEnabled. - Toolkit::KeyInputFocusManager::Get().UnhandledKeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); + Stage::GetCurrent().KeyEventSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnKeyEvent); Stage::GetCurrent().TouchSignal().Connect( mSlotDelegate, &KeyboardFocusManager::OnTouch ); } @@ -136,18 +136,11 @@ bool KeyboardFocusManager::SetCurrentFocusActor( Actor actor ) { DALI_ASSERT_DEBUG( !mIsWaitingKeyboardFocusChangeCommit && "Calling this function in the PreFocusChangeSignal callback?" ); - if( actor ) - { - return DoSetCurrentFocusActor( actor.GetId() ); - } - - return false; + return DoSetCurrentFocusActor( actor ); } -bool KeyboardFocusManager::DoSetCurrentFocusActor( const unsigned int actorID ) +bool KeyboardFocusManager::DoSetCurrentFocusActor( Actor actor ) { - Actor rootActor = Stage::GetCurrent().GetRootLayer(); - Actor actor = rootActor.FindChildById( actorID ); bool success = false; // Check whether the actor is in the stage and is keyboard focusable. @@ -170,17 +163,19 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( const unsigned int actorID ) { // Do we need it to remember if it was previously DISABLED? currentlyFocusedControl.SetProperty(DevelControl::Property::STATE, DevelControl::NORMAL ); + currentlyFocusedControl.ClearKeyInputFocus(); } DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Focus Changed\n", __FUNCTION__, __LINE__); // Save the current focused actor - mCurrentFocusActor = actorID; + mCurrentFocusActor = actor.GetId(); Toolkit::Control newlyFocusedControl = Toolkit::Control::DownCast(actor); if( newlyFocusedControl ) { newlyFocusedControl.SetProperty(DevelControl::Property::STATE, DevelControl::FOCUSED ); + newlyFocusedControl.SetKeyInputFocus(); } // Push Current Focused Actor to FocusHistory @@ -273,33 +268,106 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction 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 parentLayoutControl = GetParentLayoutControl( currentFocusActor ); + while( parentLayoutControl && !succeed ) { - succeed = DoMoveFocusWithinLayoutControl(parentLayoutControl, currentFocusActor, direction); - parentLayoutControl = GetParentLayoutControl(parentLayoutControl); + succeed = DoMoveFocusWithinLayoutControl( parentLayoutControl, currentFocusActor, direction ); + parentLayoutControl = GetParentLayoutControl( parentLayoutControl ); } - if(!succeed && !mPreFocusChangeSignal.Empty()) + if( !succeed ) { - // Don't know how to move the focus further. The application needs to tell us which actor to move the focus to - mIsWaitingKeyboardFocusChangeCommit = true; - Actor nextFocusableActor = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction); - mIsWaitingKeyboardFocusChangeCommit = false; + Actor nextFocusableActor; + + Toolkit::Control currentFocusControl = Toolkit::Control::DownCast(currentFocusActor); + + // If the current focused actor is a control, then find the next focusable actor via the focusable properties. + if( currentFocusControl ) + { + int actorId = -1; + Property::Index index = Property::INVALID_INDEX; + Property::Value value; + + // Find property index based upon focus direction + switch ( direction ) + { + case Toolkit::Control::KeyboardFocus::LEFT: + { + index = Toolkit::DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID; + break; + } + case Toolkit::Control::KeyboardFocus::RIGHT: + { + index = Toolkit::DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID; + break; + } + case Toolkit::Control::KeyboardFocus::UP: + { + index = Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID; + break; + } + case Toolkit::Control::KeyboardFocus::DOWN: + { + index = Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID; + break; + } + default: + break; + } + + // If the focusable property is set then determine next focusable actor + if( index != Property::INVALID_INDEX) + { + value = currentFocusActor.GetProperty( index ); + actorId = value.Get(); + + // If actor's id is valid then find actor form actor's id. The actor should be on the stage. + if( actorId != -1 ) + { + if( currentFocusActor.GetParent() ) + { + nextFocusableActor = currentFocusActor.GetParent().FindChildById( actorId ); + } + + if( !nextFocusableActor ) + { + nextFocusableActor = Stage::GetCurrent().GetRootLayer().FindChildById( actorId ); + } + } + } + } + + if( !nextFocusableActor ) + { + // If the implementation of CustomAlgorithmInterface is provided then the PreFocusChangeSignal is no longer emitted. + if( mCustomAlgorithmInterface ) + { + mIsWaitingKeyboardFocusChangeCommit = true; + nextFocusableActor = mCustomAlgorithmInterface->GetNextFocusableActor( currentFocusActor, Actor(), direction ); + mIsWaitingKeyboardFocusChangeCommit = false; + } + else if( !mPreFocusChangeSignal.Empty() ) + { + // Don't know how to move the focus further. The application needs to tell us which actor to move the focus to + mIsWaitingKeyboardFocusChangeCommit = true; + nextFocusableActor = mPreFocusChangeSignal.Emit( currentFocusActor, Actor(), direction ); + mIsWaitingKeyboardFocusChangeCommit = false; + } + } - if ( nextFocusableActor && nextFocusableActor.IsKeyboardFocusable() ) + if( nextFocusableActor && nextFocusableActor.IsKeyboardFocusable() ) { // Whether the next focusable actor is a layout control - if(IsLayoutControl(nextFocusableActor)) + if( IsLayoutControl( nextFocusableActor ) ) { // If so, move the focus inside it. - Toolkit::Control layoutControl = Toolkit::Control::DownCast(nextFocusableActor); - succeed = DoMoveFocusWithinLayoutControl(layoutControl, currentFocusActor, direction); + Toolkit::Control layoutControl = Toolkit::Control::DownCast( nextFocusableActor) ; + succeed = DoMoveFocusWithinLayoutControl( layoutControl, currentFocusActor, direction ); } else { // Otherwise, just set focus to the next focusable actor - succeed = SetCurrentFocusActor(nextFocusableActor); + succeed = SetCurrentFocusActor( nextFocusableActor ); } } } @@ -432,6 +500,7 @@ void KeyboardFocusManager::ClearFocus() if( currentlyFocusedControl ) { currentlyFocusedControl.SetProperty( DevelControl::Property::STATE, DevelControl::NORMAL ); + currentlyFocusedControl.ClearKeyInputFocus(); } } @@ -515,12 +584,15 @@ Actor KeyboardFocusManager::GetFocusIndicatorActor() { // Create the default if it hasn't been set and one that's shared by all the keyboard focusable actors mFocusIndicatorActor = Toolkit::ImageView::New( FOCUS_BORDER_IMAGE_PATH ); - mFocusIndicatorActor.SetParentOrigin( ParentOrigin::CENTER ); // Apply size constraint to the focus indicator mFocusIndicatorActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); } + mFocusIndicatorActor.SetParentOrigin( ParentOrigin::CENTER ); + mFocusIndicatorActor.SetAnchorPoint( AnchorPoint::CENTER ); + mFocusIndicatorActor.SetPosition(0.0f, 0.0f); + return mFocusIndicatorActor; } @@ -799,6 +871,11 @@ bool KeyboardFocusManager::DoConnectSignal( BaseObject* object, ConnectionTracke return connected; } +void KeyboardFocusManager::SetCustomAlgorithm(CustomAlgorithmInterface& interface) +{ + mCustomAlgorithmInterface = &interface; +} + } // namespace Internal } // namespace Toolkit