X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Faccessibility%2Fbridge%2Fbridge-accessible.cpp;h=59b75a9f80e16d82e88f8bd262d1104a05213d1d;hb=d657fe481713bb3e5deac13e2d492c15417d97be;hp=d507e3a5d8705902c74734bb4ebe6fb78aae88c2;hpb=06e1bc7147010573ecfad8977280220ed03843a7;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/accessibility/bridge/bridge-accessible.cpp b/dali/internal/accessibility/bridge/bridge-accessible.cpp index d507e3a..59b75a9 100644 --- a/dali/internal/accessibility/bridge/bridge-accessible.cpp +++ b/dali/internal/accessibility/bridge/bridge-accessible.cpp @@ -354,6 +354,37 @@ static Accessible* GetDeputyOfProxyInParent(Accessible* obj) return nullptr; } +static std::vector GetScrollableParents(Accessible *accessible) +{ + std::vector scrollableParents; + + while(accessible) + { + accessible = accessible->GetParent(); + auto component = dynamic_cast(accessible); + if(component && component->IsScrollable()) + { + scrollableParents.push_back(component); + } + } + return scrollableParents; +} + +static std::vector GetNonDuplicatedScrollableParents(Accessible *child, Accessible *start) +{ + auto scrollableParentsOfChild = GetScrollableParents(child); + auto scrollableParentsOfStart = GetScrollableParents(start); + + // find the first different scrollable parent by comparing from top to bottom. + // since it can not be the same after that, there is no need to compare. + while(!scrollableParentsOfChild.empty() && !scrollableParentsOfStart.empty() && scrollableParentsOfChild.back() == scrollableParentsOfStart.back()) + { + scrollableParentsOfChild.pop_back(); + scrollableParentsOfStart.pop_back(); + } + + return scrollableParentsOfChild; +} } // anonymous namespace @@ -603,16 +634,32 @@ Accessible* BridgeAccessible::GetCurrentlyHighlighted() return nullptr; } -std::vector BridgeAccessible::GetValidChildren(const std::vector& children, Accessible* start, Accessible* root) +std::vector BridgeAccessible::GetValidChildren(const std::vector& children, Accessible* start) { + if(children.empty()) + { + return children; + } + std::vector vec; std::vector ret; + Dali::Rect<> scrollableParentExtents; + auto nonDuplicatedScrollableParents = GetNonDuplicatedScrollableParents(children.front(), start); + if (!nonDuplicatedScrollableParents.empty()) + { + scrollableParentExtents = nonDuplicatedScrollableParents.front()->GetExtents(CoordinateType::WINDOW); + } + for(auto child : children) { - if(auto* component = dynamic_cast(child); component) + auto* component = dynamic_cast(child); + if(component) { - vec.push_back(component); + if(nonDuplicatedScrollableParents.empty() || scrollableParentExtents.Intersects(component->GetExtents(CoordinateType::WINDOW))) + { + vec.push_back(component); + } } } @@ -663,7 +710,7 @@ struct CycleDetection unsigned int mCounter; }; -Accessible* BridgeAccessible::GetNextNonDefunctSibling(Accessible* obj, Accessible* start, Accessible* root, unsigned char forward) +Accessible* BridgeAccessible::GetNextNonDefunctSibling(Accessible* obj, Accessible* start, unsigned char forward) { if(!obj) { @@ -676,7 +723,7 @@ Accessible* BridgeAccessible::GetNextNonDefunctSibling(Accessible* obj, Accessib return nullptr; } - auto children = GetValidChildren(parent->GetChildren(), start, root); + auto children = GetValidChildren(parent->GetChildren(), start); unsigned int childrenCount = children.size(); if(childrenCount == 0) @@ -703,7 +750,7 @@ Accessible* BridgeAccessible::FindNonDefunctSibling(bool& areAllChildrenVisited, { while(true) { - Accessible* sibling = GetNextNonDefunctSibling(node, start, root, forward); + Accessible* sibling = GetNextNonDefunctSibling(node, start, forward); if(sibling) { node = sibling; @@ -790,7 +837,7 @@ Accessible* BridgeAccessible::CalculateNeighbor(Accessible* root, Accessible* st } auto children = node->GetChildren(); - children = GetValidChildren(children, start, root); + children = GetValidChildren(children, start); // do accept: // 1. not start node