END_TEST;
}
+
+int UtcDaliKeyboardFocusManagerMoveFocusBackward(void)
+{
+ ToolkitTestApplication application;
+
+ tet_infoline(" UtcDaliKeyboardFocusManagerMoveFocusBackward");
+
+ KeyboardFocusManager manager = KeyboardFocusManager::Get();
+ DALI_TEST_CHECK(manager);
+
+ // Make history stack full
+ for(int i = 0 ; i < 31 ; i ++)
+ {
+ Actor actor = Actor::New();
+ actor.SetKeyboardFocusable(true);
+ Stage::GetCurrent().Add(actor);
+ manager.SetCurrentFocusActor(actor);
+ }
+
+ // Create the first actor and add it to the stage
+ Actor first = Actor::New();
+ first.SetKeyboardFocusable(true);
+ Stage::GetCurrent().Add(first);
+
+ // Create the second actor and add it to the stage
+ Actor second = Actor::New();
+ second.SetKeyboardFocusable(true);
+ Stage::GetCurrent().Add(second);
+
+ // Create the second actor and add it to the stage
+ Actor third = Actor::New();
+ third.SetKeyboardFocusable(true);
+ Stage::GetCurrent().Add(third);
+
+ // Check that the focus is set on the second actor
+ DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true);
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
+
+ // Check that the focus is set on the second actor
+ DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true);
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second);
+
+ // Check that the focus is set on the third actor
+ DALI_TEST_CHECK(manager.SetCurrentFocusActor(third) == true);
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third);
+
+ // Move the focus backward
+ manager.MoveFocusBackward();
+
+ // Check that it current focused actor is second actor
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second);
+
+ // Check that the focus is set on the third actor
+ DALI_TEST_CHECK(manager.SetCurrentFocusActor(third) == true);
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third);
+
+ // Remove the second actor on stage
+ second.Unparent();
+
+ // Move the focus backward
+ manager.MoveFocusBackward();
+
+ // Check that it current focused actor is first actor
+ DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
+
+ END_TEST;
+}
DALI_TYPE_REGISTRATION_END()
+const unsigned int MAX_HISTORY_AMOUNT = 30; ///< Max length of focus history stack
+
} // unnamed namespace
Toolkit::KeyboardFocusManager KeyboardFocusManager::Get()
// 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)
{
*/
Actor GetFocusIndicatorActor();
+ /**
+ * Move current focus to backward
+ */
+ void MoveFocusBackward();
+
public:
/**
private:
+ typedef Dali::Vector< Dali::BaseObject* > FocusStack; ///< Define Dali::Vector< Dali::BaseObject* > as FocusStack to contain focus history
+ typedef FocusStack::Iterator FocusStackIterator; ///< Define FocusStack::Iterator as FocusStackIterator to navigate FocusStack
+
/**
* Get the focus group of current focused actor.
* @pre The FocusManager has been initialized.
bool mIsWaitingKeyboardFocusChangeCommit:1; /// A flag to indicate PreFocusChangeSignal emitted but the proposed focus actor is not commited by the application yet.
+ FocusStack mFocusHistory; ///< Stack to contain pre-focused actor's BaseObject*
+
+ FocusStackIterator mFocusHistoryIter; ///< Iterator for mFocusHistory
+
SlotDelegate< KeyboardFocusManager > mSlotDelegate;
+
};
} // namespace Internal
return GetImpl(*this).GetFocusIndicatorActor();
}
+void KeyboardFocusManager::MoveFocusBackward()
+{
+ return GetImpl(*this).MoveFocusBackward();
+}
+
KeyboardFocusManager::PreFocusChangeSignalType& KeyboardFocusManager::PreFocusChangeSignal()
{
return GetImpl(*this).PreFocusChangeSignal();
*/
Actor GetFocusIndicatorActor();
+ /**
+ * @brief Move the focus to prev focused actor
+ *
+ * @SINCE_1_2.17
+ */
+ void MoveFocusBackward();
+
public: // Signals
/**