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=9e3498462ea2115a5c6f3b374e7e8f3e158ff976;hp=15e536623c476c6248071ca465c10cce89d0b747;hb=61eb93cd9df8f71406040d485fdc518755f49f84;hpb=7845c204ad99f3452a0afb3b2893b941eeb9feb9 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 15e5366..9e34984 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 { @@ -116,9 +119,10 @@ KeyboardFocusManager::KeyboardFocusManager() mFocusedActorEnterKeySignal(), mCurrentFocusActor(), mFocusIndicatorActor(), + mIsFocusIndicatorEnabled( -1 ), mFocusGroupLoopEnabled( false ), - mIsFocusIndicatorEnabled( false ), mIsWaitingKeyboardFocusChangeCommit( false ), + mClearFocusOnTouch( true ), mFocusHistory(), mSlotDelegate( this ), mCustomAlgorithmInterface(NULL) @@ -132,10 +136,26 @@ 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()); + mClearFocusOnTouch = mIsFocusIndicatorEnabled ? false : true; + } +} + bool KeyboardFocusManager::SetCurrentFocusActor( Actor actor ) { DALI_ASSERT_DEBUG( !mIsWaitingKeyboardFocusChangeCommit && "Calling this function in the PreFocusChangeSignal callback?" ); + if( mIsFocusIndicatorEnabled == -1 ) + { + GetConfigurationFromStyleManger(); + } + return DoSetCurrentFocusActor( actor ); } @@ -190,13 +210,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__); @@ -231,28 +251,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 + Actor target = mFocusHistory[ mFocusHistory.size() -1 ].GetHandle(); - // Get pre focused actor - BaseObject* object = mFocusHistory[ mFocusHistory.Count() - 1 ]; - BaseHandle handle( object ); - Actor preFocusedActor = Dali::Actor::DownCast( handle ); - - // 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 @@ -523,7 +554,7 @@ void KeyboardFocusManager::ClearFocus() } mCurrentFocusActor.Reset(); - mIsFocusIndicatorEnabled = false; + mIsFocusIndicatorEnabled = 0; } void KeyboardFocusManager::SetFocusGroupLoop(bool enabled) @@ -623,6 +654,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) std::string keyName = event.keyPressedName; + if( mIsFocusIndicatorEnabled == -1 ) + { + GetConfigurationFromStyleManger(); + } + bool isFocusStartableKey = false; if(event.state == KeyEvent::Down) @@ -634,14 +670,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards left - MoveFocus(Toolkit::Control::KeyboardFocus::LEFT); + mIsFocusIndicatorEnabled = 1; } + // Move the focus towards left + MoveFocus(Toolkit::Control::KeyboardFocus::LEFT); isFocusStartableKey = true; } else @@ -657,13 +690,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards right - MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT); + mIsFocusIndicatorEnabled = 1; } + + // Move the focus towards right + MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT); } else { @@ -678,14 +709,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards up - MoveFocus(Toolkit::Control::KeyboardFocus::UP); + mIsFocusIndicatorEnabled = 1; } + // Move the focus towards up + MoveFocus(Toolkit::Control::KeyboardFocus::UP); isFocusStartableKey = true; } else if (keyName == "Down" && !isAccessibilityEnabled) @@ -693,14 +721,11 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards down - MoveFocus(Toolkit::Control::KeyboardFocus::DOWN); + mIsFocusIndicatorEnabled = 1; } + // Move the focus towards down + MoveFocus(Toolkit::Control::KeyboardFocus::DOWN); isFocusStartableKey = true; } else if (keyName == "Prior" && !isAccessibilityEnabled) @@ -708,14 +733,12 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards the previous page - MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_UP); + mIsFocusIndicatorEnabled = 1; } + // Move the focus towards the previous page + MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_UP); + isFocusStartableKey = true; } else if (keyName == "Next" && !isAccessibilityEnabled) @@ -723,14 +746,12 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; - } - else - { - // Move the focus towards the next page - MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_DOWN); + mIsFocusIndicatorEnabled = 1; } + // Move the focus towards the next page + MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_DOWN); + isFocusStartableKey = true; } else if (keyName == "Tab" && !isAccessibilityEnabled) @@ -738,7 +759,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -754,7 +775,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } isFocusStartableKey = true; @@ -765,7 +786,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } isFocusStartableKey = true; @@ -785,7 +806,7 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) if(!mIsFocusIndicatorEnabled && !isAccessibilityEnabled) { // Show focus indicator - mIsFocusIndicatorEnabled = true; + mIsFocusIndicatorEnabled = 1; } else { @@ -829,9 +850,17 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event) void KeyboardFocusManager::OnTouch(const TouchData& touch) { + // if mIsFocusIndicatorEnabled is -1, it means Configuration is not loaded. + // Try to load configuration. + if( mIsFocusIndicatorEnabled == -1 ) + { + GetConfigurationFromStyleManger(); + } + // Clear the focus when user touch the screen. // We only do this on a Down event, otherwise the clear action may override a manually focused actor. - if( ( touch.GetPointCount() < 1 ) || ( touch.GetState( 0 ) == PointState::DOWN ) ) + // If mClearFocusOnTouch is false, do not clear the focus even if user touch the screen. + if( (( touch.GetPointCount() < 1 ) || ( touch.GetState( 0 ) == PointState::DOWN )) && mClearFocusOnTouch ) { ClearFocus(); }