It may be outside the range of type int.
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / focus-manager / focus-finder.cpp
index 313fee9..71934f0 100644 (file)
@@ -129,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
@@ -154,9 +152,9 @@ static int MinorAxisDistance(Dali::Toolkit::Control::KeyboardFocus::Direction di
  * @param minorAxisDistance The minorAxisDistance\r
  * @return The distance\r
  */\r
-static int GetWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance)\r
+static uint64_t GetWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance)\r
 {\r
-  return 13 * majorAxisDistance * majorAxisDistance + minorAxisDistance * minorAxisDistance;\r
+  return 13 * static_cast<int64_t>(majorAxisDistance) * static_cast<int64_t>(majorAxisDistance) + static_cast<int64_t>(minorAxisDistance) * static_cast<int64_t>(minorAxisDistance);\r
 }\r
 \r
 /**\r
@@ -345,21 +343,21 @@ bool IsBetterCandidate(Toolkit::Control::KeyboardFocus::Direction direction, Rec
 bool IsFocusable(Actor& actor)\r
 {\r
   return (actor.GetProperty<bool>(Actor::Property::KEYBOARD_FOCUSABLE) &&\r
+          actor.GetProperty<bool>(DevelActor::Property::USER_INTERACTION_ENABLED) &&\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
-  if(actor)\r
+  if(actor && actor.GetProperty<bool>(Actor::Property::VISIBLE) && actor.GetProperty<bool>(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN))\r
   {\r
     // Recursively children\r
     const auto childCount = actor.GetChildCount();\r
-    for(auto i = 0u; i < childCount; ++i)\r
+    for(auto i = childCount; i > 0u; --i)\r
     {\r
-      Dali::Actor child = actor.GetChildAt(i);\r
+      Dali::Actor child = actor.GetChildAt(i-1);\r
       if(child && child != focusedActor && IsFocusable(child))\r
       {\r
         Rect<float> candidateRect = DevelActor::CalculateScreenExtents(child);\r
@@ -385,15 +383,26 @@ Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect<float>& focusedRect,
 \r
 } // unnamed namespace\r
 \r
-Actor GetNearestFocusableActor(Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction)\r
+Actor GetNearestFocusableActor(Actor rootActor, Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction)\r
 {\r
   Actor nearestActor;\r
-  if(!focusedActor)\r
+  if(!rootActor)\r
   {\r
     return nearestActor;\r
   }\r
 \r
-  Rect<float> focusedRect = DevelActor::CalculateScreenExtents(focusedActor);\r
+  Rect<float> focusedRect;\r
+  if (!focusedActor)\r
+  {\r
+    // If there is no currently focused actor, it is searched based on the upper left corner of the current window.\r
+    Rect<float> rootRect = DevelActor::CalculateScreenExtents(rootActor);\r
+    focusedRect = Rect<float>(rootRect.x, rootRect.y, 0.f, 0.f);\r
+  }\r
+  else\r
+  {\r
+    focusedRect = DevelActor::CalculateScreenExtents(focusedActor);\r
+  }\r
+\r
 \r
   // initialize the best candidate to something impossible\r
   // (so the first plausible actor will become the best choice)\r
@@ -429,13 +438,7 @@ Actor GetNearestFocusableActor(Actor focusedActor, Toolkit::Control::KeyboardFoc
   ConvertCoordinate(bestCandidateRect);\r
 \r
   ConvertCoordinate(focusedRect);\r
-\r
-  Integration::SceneHolder window = Integration::SceneHolder::Get(focusedActor);\r
-  if(window)\r
-  {\r
-    Actor rootActor = window.GetRootLayer();\r
-    nearestActor    = FindNextFocus(rootActor, focusedActor, focusedRect, bestCandidateRect, direction);\r
-  }\r
+  nearestActor = FindNextFocus(rootActor, focusedActor, focusedRect, bestCandidateRect, direction);\r
   return nearestActor;\r
 }\r
 \r