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 c52bf57..71934f0 100644 (file)
@@ -152,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
@@ -343,6 +343,7 @@ 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<Vector4>(Actor::Property::WORLD_COLOR).a > FULLY_TRANSPARENT);\r
 }\r
@@ -385,12 +386,23 @@ Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect<float>& focusedRect,
 Actor GetNearestFocusableActor(Actor rootActor, Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction)\r
 {\r
   Actor nearestActor;\r
-  if(!focusedActor || !rootActor)\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