X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Fdevel-api%2Ffocus-manager%2Ffocus-finder.cpp;h=71934f09408d26255ccc5a87c6901137ae58896e;hp=a7324b8f262507bc1b199decb0b532cd8118bff1;hb=cb2229846d61445fdaff58fd5521dc3fb36e7676;hpb=38d93dff71e384703046223789412358afb2036a diff --git a/dali-toolkit/devel-api/focus-manager/focus-finder.cpp b/dali-toolkit/devel-api/focus-manager/focus-finder.cpp index a7324b8..71934f0 100644 --- a/dali-toolkit/devel-api/focus-manager/focus-finder.cpp +++ b/dali-toolkit/devel-api/focus-manager/focus-finder.cpp @@ -152,9 +152,9 @@ static int MinorAxisDistance(Dali::Toolkit::Control::KeyboardFocus::Direction di * @param minorAxisDistance The minorAxisDistance * @return The distance */ -static int GetWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance) +static uint64_t GetWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance) { - return 13 * majorAxisDistance * majorAxisDistance + minorAxisDistance * minorAxisDistance; + return 13 * static_cast(majorAxisDistance) * static_cast(majorAxisDistance) + static_cast(minorAxisDistance) * static_cast(minorAxisDistance); } /** @@ -188,19 +188,19 @@ static bool IsCandidate(Dali::Rect srcRect, Dali::Rect destRect, D { case Dali::Toolkit::Control::KeyboardFocus::LEFT: { - return (srcRect.right > destRect.right || srcRect.left >= destRect.right); + return (srcRect.right > destRect.right || srcRect.left >= destRect.right) && srcRect.left > destRect.left; } case Dali::Toolkit::Control::KeyboardFocus::RIGHT: { - return (srcRect.left < destRect.left || srcRect.right <= destRect.left); + return (srcRect.left < destRect.left || srcRect.right <= destRect.left) && srcRect.right < destRect.right; } case Dali::Toolkit::Control::KeyboardFocus::UP: { - return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom); + return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom) && srcRect.top > destRect.top; } case Dali::Toolkit::Control::KeyboardFocus::DOWN: { - return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top); + return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top) && srcRect.bottom < destRect.bottom; } default: { @@ -343,21 +343,21 @@ bool IsBetterCandidate(Toolkit::Control::KeyboardFocus::Direction direction, Rec bool IsFocusable(Actor& actor) { return (actor.GetProperty(Actor::Property::KEYBOARD_FOCUSABLE) && + actor.GetProperty(DevelActor::Property::USER_INTERACTION_ENABLED) && actor.GetProperty(Actor::Property::VISIBLE) && - actor.GetProperty(Actor::Property::SENSITIVE) && actor.GetProperty(Actor::Property::WORLD_COLOR).a > FULLY_TRANSPARENT); } Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect& focusedRect, Rect& bestCandidateRect, Toolkit::Control::KeyboardFocus::Direction direction) { Actor nearestActor; - if(actor) + if(actor && actor.GetProperty(Actor::Property::VISIBLE) && actor.GetProperty(DevelActor::Property::KEYBOARD_FOCUSABLE_CHILDREN)) { // Recursively children const auto childCount = actor.GetChildCount(); - for(auto i = 0u; i < childCount; ++i) + for(auto i = childCount; i > 0u; --i) { - Dali::Actor child = actor.GetChildAt(i); + Dali::Actor child = actor.GetChildAt(i-1); if(child && child != focusedActor && IsFocusable(child)) { Rect candidateRect = DevelActor::CalculateScreenExtents(child); @@ -383,15 +383,26 @@ Actor FindNextFocus(Actor& actor, Actor& focusedActor, Rect& focusedRect, } // unnamed namespace -Actor GetNearestFocusableActor(Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction) +Actor GetNearestFocusableActor(Actor rootActor, Actor focusedActor, Toolkit::Control::KeyboardFocus::Direction direction) { Actor nearestActor; - if(!focusedActor) + if(!rootActor) { return nearestActor; } - Rect focusedRect = DevelActor::CalculateScreenExtents(focusedActor); + Rect focusedRect; + if (!focusedActor) + { + // If there is no currently focused actor, it is searched based on the upper left corner of the current window. + Rect rootRect = DevelActor::CalculateScreenExtents(rootActor); + focusedRect = Rect(rootRect.x, rootRect.y, 0.f, 0.f); + } + else + { + focusedRect = DevelActor::CalculateScreenExtents(focusedActor); + } + // initialize the best candidate to something impossible // (so the first plausible actor will become the best choice) @@ -427,13 +438,7 @@ Actor GetNearestFocusableActor(Actor focusedActor, Toolkit::Control::KeyboardFoc ConvertCoordinate(bestCandidateRect); ConvertCoordinate(focusedRect); - - Integration::SceneHolder window = Integration::SceneHolder::Get(focusedActor); - if(window) - { - Actor rootActor = window.GetRootLayer(); - nearestActor = FindNextFocus(rootActor, focusedActor, focusedRect, bestCandidateRect, direction); - } + nearestActor = FindNextFocus(rootActor, focusedActor, focusedRect, bestCandidateRect, direction); return nearestActor; }