DALI_TYPE_REGISTRATION_END()
+const unsigned int MAX_HISTORY_AMOUNT = 30; ///< Max length of focus history stack
+
} // unnamed namespace
Toolkit::KeyboardFocusManager KeyboardFocusManager::Get()
}
KeyboardFocusManager::KeyboardFocusManager()
-: mCurrentFocusActor(0),
+: mPreFocusChangeSignal(),
+ mFocusChangedSignal(),
+ mFocusGroupChangedSignal(),
+ mFocusedActorEnterKeySignal(),
+ mCurrentFocusActor( 0 ),
mFocusIndicatorActor(),
- mFocusGroupLoopEnabled(false),
- mIsKeyboardFocusEnabled(false),
- mIsFocusIndicatorEnabled(false),
- mIsWaitingKeyboardFocusChangeCommit(false),
- mSlotDelegate(this)
+ mFocusGroupLoopEnabled( false ),
+ mIsKeyboardFocusEnabled( false ),
+ mIsFocusIndicatorEnabled( false ),
+ mIsWaitingKeyboardFocusChangeCommit( false ),
+ mFocusHistory(),
+ mSlotDelegate( this )
{
OnPhysicalKeyboardStatusChanged(PhysicalKeyboard::Get());
if( actor && actor.IsKeyboardFocusable() )
{
mIsFocusIndicatorEnabled = true;
- // Draw the focus indicator upon the focused actor
- actor.Add( GetFocusIndicatorActor() );
-
+ // Draw the focus indicator upon the focused actor when PhysicalKeyboard is attached
+ if( mIsKeyboardFocusEnabled )
+ {
+ actor.Add( GetFocusIndicatorActor() );
+ }
// Send notification for the change of focus actor
if( !mFocusChangedSignal.Empty() )
{
// Save the current focused actor
mCurrentFocusActor = actorID;
+ // Push Current Focused Actor to FocusHistory
+ mFocusHistory.PushBack( &actor.GetBaseObject() );
+
+ // Delete first element before add new element when Stack is full.
+ if( mFocusHistory.Count() > MAX_HISTORY_AMOUNT )
+ {
+ FocusStackIterator beginPos = mFocusHistory.Begin();
+ mFocusHistory.Erase( beginPos );
+ }
+
DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] SUCCEED\n", __FUNCTION__, __LINE__);
success = true;
}
return GetFocusGroup(GetCurrentFocusActor());
}
+void KeyboardFocusManager::MoveFocusBackward()
+{
+ // Find Pre Focused Actor when the list size is more than 1
+ if( mFocusHistory.Count() > 1 )
+ {
+ // Delete current focused actor in history
+ FocusStackIterator endPos = mFocusHistory.End();
+ endPos = mFocusHistory.Erase( --endPos );
+
+ // If pre-focused actors are not on stage, remove them in stack
+ while( !Dali::Actor::DownCast(BaseHandle(mFocusHistory[ mFocusHistory.Count() - 1 ])).OnStage() )
+ {
+ endPos = mFocusHistory.Erase( --endPos );
+ }
+
+ // 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 );
+
+ SetCurrentFocusActor( preFocusedActor );
+ }
+}
+
bool KeyboardFocusManager::IsLayoutControl(Actor actor) const
{
Toolkit::Control control = Toolkit::Control::DownCast(actor);
{
// Emit signal to go back to the previous view???
}
+ else if (keyName == "Escape" && !isAccessibilityEnabled)
+ {
+ }
}
else if(event.state == KeyEvent::Up)
{
Dali::BaseHandle handle( object );
bool connected( true );
- KeyboardFocusManager* manager = dynamic_cast<KeyboardFocusManager*>( object );
+ KeyboardFocusManager* manager = static_cast< KeyboardFocusManager* >( object ); // TypeRegistry guarantees that this is the correct type.
if( 0 == strcmp( signalName.c_str(), SIGNAL_PRE_FOCUS_CHANGE ) )
{
manager->PreFocusChangeSignal().Connect( tracker, functor );
}
- if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_CHANGED ) )
+ else if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_CHANGED ) )
{
manager->FocusChangedSignal().Connect( tracker, functor );
}
- if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_GROUP_CHANGED ) )
+ else if( 0 == strcmp( signalName.c_str(), SIGNAL_FOCUS_GROUP_CHANGED ) )
{
manager->FocusGroupChangedSignal().Connect( tracker, functor );
}