X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ffocus-manager%2Fkeyboard-focus-manager-impl.cpp;h=c3ebe62fdd10e10a7bffeefbd8a334444aeb9485;hb=d9e73542cfca2591f40ca9ffeefa1e20e0c2bbd0;hp=57fe0767cac47d71a6bb6bd1faefd47cf2485ccf;hpb=14d7745ee5464be56aaff3843c592b9bf45820f8;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 57fe076..c3ebe62 100644 --- a/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,8 @@ #include #include #include +#include +#include namespace Dali { @@ -114,10 +117,10 @@ KeyboardFocusManager::KeyboardFocusManager() mFocusChangedSignal(), mFocusGroupChangedSignal(), mFocusedActorEnterKeySignal(), - mCurrentFocusActor( 0 ), + mCurrentFocusActor(), mFocusIndicatorActor(), + mIsFocusIndicatorEnabled( -1 ), mFocusGroupLoopEnabled( false ), - mIsFocusIndicatorEnabled( false ), mIsWaitingKeyboardFocusChangeCommit( false ), mFocusHistory(), mSlotDelegate( this ), @@ -132,10 +135,25 @@ KeyboardFocusManager::~KeyboardFocusManager() { } +void KeyboardFocusManager::GetConfigurationFromStyleManger() +{ + Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); + if( styleManager ) + { + Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager ); + mIsFocusIndicatorEnabled = static_cast(config["alwaysShowFocus"].Get()); + } +} + bool KeyboardFocusManager::SetCurrentFocusActor( Actor actor ) { DALI_ASSERT_DEBUG( !mIsWaitingKeyboardFocusChangeCommit && "Calling this function in the PreFocusChangeSignal callback?" ); + if( mIsFocusIndicatorEnabled == -1 ) + { + GetConfigurationFromStyleManger(); + } + return DoSetCurrentFocusActor( actor ); } @@ -143,16 +161,27 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( Actor actor ) { bool success = false; + 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.IsKeyboardFocusable() ) + if( actor && actor.IsKeyboardFocusable() && actor.OnStage() ) { if( mIsFocusIndicatorEnabled ) { actor.Add( GetFocusIndicatorActor() ); } - // Send notification for the change of focus actor - Actor currentFocusedActor = GetCurrentFocusActor(); + // Send notification for the change of focus actor if( !mFocusChangedSignal.Empty() ) { mFocusChangedSignal.Emit(currentFocusedActor, actor); @@ -169,7 +198,7 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( Actor actor ) DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Focus Changed\n", __FUNCTION__, __LINE__); // Save the current focused actor - mCurrentFocusActor = actor.GetId(); + mCurrentFocusActor = actor; Toolkit::Control newlyFocusedControl = Toolkit::Control::DownCast(actor); if( newlyFocusedControl ) @@ -179,13 +208,13 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( Actor actor ) } // Push Current Focused Actor to FocusHistory - mFocusHistory.PushBack( &actor.GetBaseObject() ); + mFocusHistory.push_back( actor ); // Delete first element before add new element when Stack is full. - if( mFocusHistory.Count() > MAX_HISTORY_AMOUNT ) + if( mFocusHistory.size() > MAX_HISTORY_AMOUNT ) { - FocusStackIterator beginPos = mFocusHistory.Begin(); - mFocusHistory.Erase( beginPos ); + FocusStackIterator beginPos = mFocusHistory.begin(); + mFocusHistory.erase( beginPos ); } DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] SUCCEED\n", __FUNCTION__, __LINE__); @@ -201,8 +230,15 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( Actor actor ) Actor KeyboardFocusManager::GetCurrentFocusActor() { - Actor rootActor = Stage::GetCurrent().GetRootLayer(); - return rootActor.FindChildById(mCurrentFocusActor); + Actor actor = mCurrentFocusActor.GetHandle(); + if( actor && ! actor.OnStage() ) + { + // If the actor has been removed from the stage, then it should not be focused + + actor.Reset(); + mCurrentFocusActor.Reset(); + } + return actor; } Actor KeyboardFocusManager::GetCurrentFocusGroup() @@ -213,28 +249,39 @@ Actor KeyboardFocusManager::GetCurrentFocusGroup() void KeyboardFocusManager::MoveFocusBackward() { // Find Pre Focused Actor when the list size is more than 1 - if( mFocusHistory.Count() > 1 ) + if( mFocusHistory.size() > 1 ) { // Delete current focused actor in history - FocusStackIterator endPos = mFocusHistory.End(); - endPos = mFocusHistory.Erase( --endPos ); + mFocusHistory.pop_back(); - // If pre-focused actors are not on stage, remove them in stack - while( !Dali::Actor::DownCast(BaseHandle(mFocusHistory[ mFocusHistory.Count() - 1 ])).OnStage() ) + // If pre-focused actors are not on stage or deleted, remove them in stack + while( mFocusHistory.size() > 0 ) { - endPos = mFocusHistory.Erase( --endPos ); - } - - // Get pre focused actor - BaseObject* object = mFocusHistory[ mFocusHistory.Count() - 1 ]; - BaseHandle handle( object ); - Actor preFocusedActor = Dali::Actor::DownCast( handle ); + // Get pre focused actor + Actor target = mFocusHistory[ mFocusHistory.size() -1 ].GetHandle(); - // Delete pre focused actor in history because it will pushed again by SetCurrentFocusActor() - mFocusHistory.Erase( --endPos ); + // Impl of Actor is not null + if( target && target.OnStage() ) + { + // Delete pre focused actor in history because it will pushed again by SetCurrentFocusActor() + mFocusHistory.pop_back(); + SetCurrentFocusActor( target ); + break; + } + else + { + // Target is empty handle or off stage. Erase from queue + mFocusHistory.pop_back(); + } + } - SetCurrentFocusActor( preFocusedActor ); - } + // if there is no actor which can get focus, then push current focus actor in stack again + if( mFocusHistory.size() == 0 ) + { + Actor currentFocusedActor = GetCurrentFocusActor(); + mFocusHistory.push_back( currentFocusedActor ); + } + } } bool KeyboardFocusManager::IsLayoutControl(Actor actor) const @@ -504,8 +551,8 @@ void KeyboardFocusManager::ClearFocus() } } - mCurrentFocusActor = 0; - mIsFocusIndicatorEnabled = false; + mCurrentFocusActor.Reset(); + mIsFocusIndicatorEnabled = 0; } void KeyboardFocusManager::SetFocusGroupLoop(bool enabled) @@ -605,6 +652,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) std::string keyName = event.keyPressedName; + if( mIsFocusIndicatorEnabled == -1 ) + { + GetConfigurationFromStyleManger(); + } + bool isFocusStartableKey = false; if(event.state == KeyEvent::Down) @@ -616,7 +668,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -639,7 +691,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -660,7 +712,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -675,7 +727,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -690,7 +742,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -705,7 +757,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -720,7 +772,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -736,7 +788,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } isFocusStartableKey = true; @@ -747,7 +799,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } isFocusStartableKey = true; @@ -767,7 +819,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled && !isAccessibilityEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else {