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;
});
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);
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)
}
// 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)
{
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);
}
}
- 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;
}
}
auto children = GetValidChildren(parent->GetChildren(), start);
+ SortChildrenFromTopLeft(children);
unsigned int childrenCount = children.size();
if(childrenCount == 0)
return node;
}
- auto children = node->GetChildren();
- children = GetValidChildren(children, start);
+ auto children = GetValidChildren(node->GetChildren(), start);
+ SortChildrenFromTopLeft(children);
// do accept:
// 1. not start node
* @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.