[dali_2.1.13] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / focus-manager / keyboard-focus-manager-impl.cpp
index 8c737d2..75ffbfb 100644 (file)
@@ -145,6 +145,7 @@ void KeyboardFocusManager::OnAdaptorInit()
     {
       (*iter).KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
       (*iter).TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch);
+      (*iter).WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent);
       Dali::Window window = DevelWindow::DownCast(*iter);
       if(window)
       {
@@ -161,6 +162,7 @@ void KeyboardFocusManager::OnSceneHolderCreated(Dali::Integration::SceneHolder&
 {
   sceneHolder.KeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
   sceneHolder.TouchedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnTouch);
+  sceneHolder.WheelEventGeneratedSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnWheelEvent);
   Dali::Window window = DevelWindow::DownCast(sceneHolder);
   if(window)
   {
@@ -514,7 +516,7 @@ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction
         nextFocusableActor                  = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction);
         mIsWaitingKeyboardFocusChangeCommit = false;
       }
-      else if(mEnableDefaultAlgorithm)
+      else if(mEnableDefaultAlgorithm && currentFocusActor)
       {
         // We should find it among the actors nearby.
         Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor);
@@ -782,20 +784,10 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event)
   {
     if(keyName == "Left")
     {
-      if(!mIsFocusIndicatorShown)
+      if(mIsFocusIndicatorShown == HIDE)
       {
-        if(mIsFocusIndicatorShown == HIDE)
-        {
-          // Show focus indicator
-          mIsFocusIndicatorShown = SHOW;
-        }
-        else
-        {
-          // Move the focus towards left
-          MoveFocus(Toolkit::Control::KeyboardFocus::LEFT);
-        }
-
-        isFocusStartableKey = true;
+        // Show focus indicator
+        mIsFocusIndicatorShown = SHOW;
       }
       else
       {
@@ -807,18 +799,10 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event)
     }
     else if(keyName == "Right")
     {
-      if(!mIsFocusIndicatorShown)
+      if(mIsFocusIndicatorShown == HIDE)
       {
-        if(mIsFocusIndicatorShown == HIDE)
-        {
-          // Show focus indicator
-          mIsFocusIndicatorShown = SHOW;
-        }
-        else
-        {
-          // Move the focus towards right
-          MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT);
-        }
+        // Show focus indicator
+        mIsFocusIndicatorShown = SHOW;
       }
       else
       {
@@ -901,12 +885,8 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event)
         // "Shift-Tab" key changes it in the backward direction.
         if(!DoMoveFocusToNextFocusGroup(!event.IsShiftModifier()))
         {
-          // If the focus group is not changed, Move the focus towards right, "Shift-Tap" key moves the focus towards left.
-          if(!MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::LEFT : Toolkit::Control::KeyboardFocus::RIGHT))
-          {
-            // If the focus is not moved, Move the focus towards down, "Shift-Tap" key moves the focus towards up.
-            MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::UP : Toolkit::Control::KeyboardFocus::DOWN);
-          }
+          // If the focus group is not changed, Move the focus towards forward, "Shift-Tap" key moves the focus towards backward.
+          MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::BACKWARD : Toolkit::Control::KeyboardFocus::FORWARD);
         }
       }
 
@@ -1012,6 +992,49 @@ void KeyboardFocusManager::OnTouch(const TouchEvent& touch)
   }
 }
 
+bool KeyboardFocusManager::OnWheelEvent(const WheelEvent& event)
+{
+  bool consumed = false;
+  Actor actor = GetCurrentFocusActor();
+  if(actor)
+  {
+    // Notify the actor about the wheel event
+    consumed = EmitWheelSignals(actor, event);
+  }
+  return consumed;
+}
+
+bool KeyboardFocusManager::EmitWheelSignals(Actor actor, const WheelEvent& event)
+{
+  bool consumed = false;
+
+  if(actor)
+  {
+    Dali::Actor oldParent(actor.GetParent());
+
+    // Only do the conversion and emit the signal if the actor's wheel signal has connections.
+    if(!actor.WheelEventSignal().Empty())
+    {
+      // Emit the signal to the parent
+      consumed = actor.WheelEventSignal().Emit(actor, event);
+    }
+    // if actor doesn't consume WheelEvent, give WheelEvent to its parent.
+    if(!consumed)
+    {
+      // The actor may have been removed/reparented during the signal callbacks.
+      Dali::Actor parent = actor.GetParent();
+
+      if(parent &&
+         (parent == oldParent))
+      {
+        consumed = EmitWheelSignals(parent, event);
+      }
+    }
+  }
+
+  return consumed;
+}
+
 void KeyboardFocusManager::OnWindowFocusChanged(Window window, bool focusIn)
 {
   if(focusIn && mCurrentFocusedWindow.GetHandle() != window.GetRootLayer())