Fixed bug
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / focus-manager / focus-finder.cpp
index 952c261..a7324b8 100644 (file)
@@ -37,6 +37,8 @@ namespace FocusFinder
 {\r
 namespace\r
 {\r
+static constexpr float FULLY_TRANSPARENT(0.01f); ///< Alpha values must rise above this, before an object is considered to be visible.\r
+\r
 static int MajorAxisDistanceRaw(Dali::Toolkit::Control::KeyboardFocus::Direction direction, Dali::Rect<float> source, Dali::Rect<float> dest)\r
 {\r
   switch(direction)\r
@@ -127,17 +129,15 @@ static int MinorAxisDistance(Dali::Toolkit::Control::KeyboardFocus::Direction di
     case Dali::Toolkit::Control::KeyboardFocus::RIGHT:\r
     {\r
       // the distance between the center verticals\r
-      return std::abs(\r
-        (((source.top + source.bottom) * 0.5f) -\r
-         (((dest.top + dest.bottom) * 0.5f))));\r
+      return std::abs((source.top + (source.bottom - source.top) * 0.5f) -\r
+                      (dest.top + (dest.bottom - dest.top) * 0.5f));\r
     }\r
     case Dali::Toolkit::Control::KeyboardFocus::UP:\r
     case Dali::Toolkit::Control::KeyboardFocus::DOWN:\r
     {\r
       // the distance between the center horizontals\r
-      return std::abs(\r
-        (((source.left + source.right) * 0.5f) -\r
-         (((dest.left + dest.right) * 0.5f))));\r
+      return std::abs((source.left + (source.right - source.left) * 0.5f) -\r
+                      (dest.left + (dest.right - dest.left) * 0.5f));\r
     }\r
     default:\r
     {\r
@@ -188,19 +188,19 @@ static bool IsCandidate(Dali::Rect<float> srcRect, Dali::Rect<float> destRect, D
   {\r
     case Dali::Toolkit::Control::KeyboardFocus::LEFT:\r
     {\r
-      return (srcRect.right > destRect.right || srcRect.left >= destRect.right) && srcRect.left > destRect.left;\r
+      return (srcRect.right > destRect.right || srcRect.left >= destRect.right);\r
     }\r
     case Dali::Toolkit::Control::KeyboardFocus::RIGHT:\r
     {\r
-      return (srcRect.left < destRect.left || srcRect.right <= destRect.left) && srcRect.right < destRect.right;\r
+      return (srcRect.left < destRect.left || srcRect.right <= destRect.left);\r
     }\r
     case Dali::Toolkit::Control::KeyboardFocus::UP:\r
     {\r
-      return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom) && srcRect.top > destRect.top;\r
+      return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom);\r
     }\r
     case Dali::Toolkit::Control::KeyboardFocus::DOWN:\r
     {\r
-      return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top) && srcRect.bottom < destRect.bottom;\r
+      return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top);\r
     }\r
     default:\r
     {\r
@@ -340,6 +340,14 @@ bool IsBetterCandidate(Toolkit::Control::KeyboardFocus::Direction direction, Rec
                                                                                                MinorAxisDistance(direction, focusedRect, bestCandidateRect)));\r
 }\r
 \r
+bool IsFocusable(Actor& actor)\r
+{\r
+  return (actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) &&\r
+          actor.GetProperty<bool>(Actor::Property::VISIBLE) &&\r
+          actor.GetProperty<bool>(Actor::Property::SENSITIVE) &&\r
+          actor.GetProperty<Vector4>(Actor::Property::WORLD_COLOR).a > FULLY_TRANSPARENT);\r
+}\r
+\r
 Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect<float>& focusedRect, Rect<float>& bestCandidateRect, Toolkit::Control::KeyboardFocus::Direction direction)\r
 {\r
   Actor nearestActor;\r
@@ -350,7 +358,7 @@ Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect<float>& focusedRect,
     for(auto i = 0u; i < childCount; ++i)\r
     {\r
       Dali::Actor child = actor.GetChildAt(i);\r
-      if(child && child != focusedActor && child.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE))\r
+      if(child && child != focusedActor && IsFocusable(child))\r
       {\r
         Rect<float> candidateRect = DevelActor::CalculateScreenExtents(child);\r
 \r