[ATSPI] Sort children using middle line 62/265362/4
authorShinwoo Kim <cinoo.kim@samsung.com>
Fri, 15 Oct 2021 09:32:54 +0000 (18:32 +0900)
committerShinwoo Kim <cinoo.kim@samsung.com>
Thu, 21 Oct 2021 08:35:33 +0000 (17:35 +0900)
So far, it has been judged that thye are on different lines
if the "y" value of child A is less than "y + 0.25 * h" value of child B.
But it caused unwanted children order in following case.

 [(class=ContentPage)],[0,0,720,1280]
     [(class=AppBar)],[0,0,720,120]
         [(class=Button)],[64,36,48,48]
         [(class=TextLabel)],[136,0,300,120],[NUI Tizen Gallery]
         [(class=Control)],[476,0,180,120]

The order should be "Button" > "TextLabel".

Change-Id: Icb11cf1fb63de7a5cea8fbf7697cabdf5a5179eb

dali/internal/accessibility/bridge/bridge-accessible.cpp
dali/internal/accessibility/bridge/bridge-accessible.h

index 59b75a9..e389f15 100644 (file)
@@ -52,8 +52,8 @@ bool SortHorizontally(Component* lhs, Component* rhs)
 std::vector<std::vector<Component*>> SplitLines(const std::vector<Component*>& children)
 {
   // Find first with non-zero area
-  auto first = std::find_if(children.begin(), children.end(), [](Component* component) -> bool {
-    auto extents = component->GetExtents(CoordinateType::WINDOW);
+  auto first = std::find_if(children.begin(), children.end(), [](Component* child) -> bool {
+    auto extents = child->GetExtents(CoordinateType::WINDOW);
     return extents.height != 0.0f && extents.width != 0.0f;
   });
 
@@ -78,7 +78,7 @@ std::vector<std::vector<Component*>> SplitLines(const std::vector<Component*>& c
       continue;
     }
 
-    if(lineRect.y + (0.25 * lineRect.height) >= rect.y)
+    if(lineRect.y + (0.5 * lineRect.height) >= rect.y + (0.5 * rect.height))
     {
       // Same line
       lines.back().push_back(child);
@@ -294,7 +294,7 @@ static bool IsRoleAcceptableWhenNavigatingNextPrev(Accessible* obj)
   return role != Role::POPUP_MENU && role != Role::DIALOG;
 }
 
-static Accessible* FindNonDefunctChild(const std::vector<Accessible*>& children, unsigned int currentIndex, unsigned char forward)
+static Accessible* FindNonDefunctChild(const std::vector<Component*>& children, unsigned int currentIndex, unsigned char forward)
 {
   unsigned int childrenCount = children.size();
   for(; currentIndex < childrenCount; forward ? ++currentIndex : --currentIndex)
@@ -309,7 +309,7 @@ static Accessible* FindNonDefunctChild(const std::vector<Accessible*>& children,
 }
 
 // The auxiliary method for Depth-First Search (DFS) algorithm to find non defunct child directionally
-static Accessible* FindNonDefunctChildWithDepthFirstSearch(Accessible* node, const std::vector<Accessible*>& children, unsigned char forward)
+static Accessible* FindNonDefunctChildWithDepthFirstSearch(Accessible* node, const std::vector<Component*>& children, unsigned char forward)
 {
   if(!node)
   {
@@ -634,15 +634,14 @@ Accessible* BridgeAccessible::GetCurrentlyHighlighted()
   return nullptr;
 }
 
-std::vector<Accessible*> BridgeAccessible::GetValidChildren(const std::vector<Accessible*>& children, Accessible* start)
+std::vector<Component*> BridgeAccessible::GetValidChildren(const std::vector<Accessible*>& children, Accessible* start)
 {
   if(children.empty())
   {
-    return children;
+    return {};
   }
 
   std::vector<Component*> vec;
-  std::vector<Accessible*> ret;
 
   Dali::Rect<> scrollableParentExtents;
   auto nonDuplicatedScrollableParents = GetNonDuplicatedScrollableParents(children.front(), start);
@@ -663,15 +662,27 @@ std::vector<Accessible*> BridgeAccessible::GetValidChildren(const std::vector<Ac
     }
   }
 
-  std::sort(vec.begin(), vec.end(), &SortVertically);
+  return vec;
+}
+
+void BridgeAccessible::SortChildrenFromTopLeft(std::vector<Dali::Accessibility::Component*>& children)
+{
+  if(children.empty())
+  {
+    return;
+  }
+
+  std::vector<Component*> sortedChildren;
 
-  for(auto& line : SplitLines(vec))
+  std::sort(children.begin(), children.end(), &SortVertically);
+
+  for(auto& line : SplitLines(children))
   {
     std::sort(line.begin(), line.end(), &SortHorizontally);
-    ret.insert(ret.end(), line.begin(), line.end());
+    sortedChildren.insert(sortedChildren.end(), line.begin(), line.end());
   }
 
-  return ret;
+  children = sortedChildren;
 }
 
 
@@ -724,6 +735,7 @@ Accessible* BridgeAccessible::GetNextNonDefunctSibling(Accessible* obj, Accessib
   }
 
   auto children = GetValidChildren(parent->GetChildren(), start);
+  SortChildrenFromTopLeft(children);
 
   unsigned int childrenCount = children.size();
   if(childrenCount == 0)
@@ -836,8 +848,8 @@ Accessible* BridgeAccessible::CalculateNeighbor(Accessible* root, Accessible* st
       return node;
     }
 
-    auto children = node->GetChildren();
-    children      = GetValidChildren(children, start);
+    auto children = GetValidChildren(node->GetChildren(), start);
+    SortChildrenFromTopLeft(children);
 
     // do accept:
     // 1. not start node
index b5ffcc4..219db3b 100644 (file)
@@ -221,10 +221,18 @@ private:
    * @brief Gets valid children accessible.
    *
    * @param[in] children Children accessible objects
-   * @param start The start node // NEED TO UPDATE! It seems not to be used anywhere in this function.
+   * @param start The start node
    * @return The valid children
    */
-  std::vector<Dali::Accessibility::Accessible*> GetValidChildren(const std::vector<Dali::Accessibility::Accessible*>& children, Dali::Accessibility::Accessible* start);
+  std::vector<Dali::Accessibility::Component*> GetValidChildren(const std::vector<Dali::Accessibility::Accessible*>& children, Dali::Accessibility::Accessible* start);
+
+  /**
+   * @brief Sorts children accessible based on the coordinates from top-left to bottom-right.
+   *
+   * @param[in,out] children Children accessible objects
+   * @return The sorted children
+   */
+  void SortChildrenFromTopLeft(std::vector<Dali::Accessibility::Component*>& children);
 
   /**
    * @brief Gets the currently highlighted accessible.