void EventDispatcher::sortEventListenersOfSceneGraphPriority(const EventListener::ListenerID& listenerID, Node* rootNode) { auto listeners = getListeners(listenerID); if (listeners == nullptr) return; auto sceneGraphListeners = listeners->getSceneGraphPriorityListeners(); if (sceneGraphListeners == nullptr) return; // Reset priority index _nodePriorityIndex = 0; _nodePriorityMap.clear(); visitTarget(rootNode, true); // After sort: priority < 0, > 0 std::sort(sceneGraphListeners->begin(), sceneGraphListeners->end(), [this](const EventListener* l1, const EventListener* l2) { return _nodePriorityMap[l1->getAssociatedNode()] > _nodePriorityMap[l2->getAssociatedNode()]; }); #if DUMP_LISTENER_ITEM_PRIORITY_INFO log("-----------------------------------"); for (auto& l : *sceneGraphListeners) { log("listener priority: node ([%s]%p), priority (%d)", typeid(*l->_node).name(), l->_node, _nodePriorityMap[l->_node]); } #endif }
void LuaTouchEventManager::visitTarget(Node* node, bool isRootNode) { int i = 0; auto& children = node->getChildren(); auto childrenCount = children.size(); if (childrenCount > 0) { Node* child = nullptr; // visit children zOrder < 0 for (; i < childrenCount; i++) { child = children.at(i); if (child && child->getLocalZOrder() < 0) visitTarget(child, false); else break; } if (_nodeLuaEventNodeMap.find(node) != _nodeLuaEventNodeMap.end()) { _globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node); } for (; i < childrenCount; i++) { child = children.at(i); if (child) visitTarget(child, false); } } else { if (_nodeLuaEventNodeMap.find(node) != _nodeLuaEventNodeMap.end()) { _globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node); } } if (isRootNode) { std::vector<float> globalZOrders; globalZOrders.reserve(_globalZOrderNodeMap.size()); for (const auto& e : _globalZOrderNodeMap) { globalZOrders.push_back(e.first); } std::sort(globalZOrders.begin(), globalZOrders.end(), [](const float a, const float b) { return a < b; }); for (const auto& globalZ : globalZOrders) { for (const auto& n : _globalZOrderNodeMap[globalZ]) { _nodePriorityMap[n] = ++_nodePriorityIndex; } } _globalZOrderNodeMap.clear(); } }