bool EventPath::updateTouchLists(const TouchEvent& touchEvent) { if (!touchEvent.touches() || !touchEvent.targetTouches() || !touchEvent.changedTouches()) return false; Vector<EventRelatedNodeResolver, 16> touchTargetResolvers; const size_t touchNodeCount = touchEvent.touches()->length() + touchEvent.targetTouches()->length() + touchEvent.changedTouches()->length(); touchTargetResolvers.reserveInitialCapacity(touchNodeCount); addRelatedNodeResolversForTouchList(touchTargetResolvers, touchEvent.touches(), TouchEventContext::Touches); addRelatedNodeResolversForTouchList(touchTargetResolvers, touchEvent.targetTouches(), TouchEventContext::TargetTouches); addRelatedNodeResolversForTouchList(touchTargetResolvers, touchEvent.changedTouches(), TouchEventContext::ChangedTouches); ASSERT(touchTargetResolvers.size() == touchNodeCount); for (auto& eventPath : m_path) { TouchEventContext& context = toTouchEventContext(*eventPath); Node& nodeToMoveTo = *context.node(); for (size_t resolverIndex = 0; resolverIndex < touchNodeCount; ++resolverIndex) { EventRelatedNodeResolver& currentResolver = touchTargetResolvers[resolverIndex]; Node* nodeInCurrentTreeScope = currentResolver.moveToParentOrShadowHost(nodeToMoveTo); ASSERT(currentResolver.touch()); context.touchList(currentResolver.touchListType())->append(currentResolver.touch()->cloneWithNewTarget(nodeInCurrentTreeScope)); } } return true; }
void EventRetargeter::adjustForTouchEvent(Node* node, const TouchEvent& touchEvent, EventPath& eventPath) { size_t eventPathSize = eventPath.size(); EventPathTouchLists eventPathTouches(eventPathSize); EventPathTouchLists eventPathTargetTouches(eventPathSize); EventPathTouchLists eventPathChangedTouches(eventPathSize); for (size_t i = 0; i < eventPathSize; ++i) { ASSERT(eventPath[i]->isTouchEventContext()); TouchEventContext* touchEventContext = toTouchEventContext(eventPath[i].get()); eventPathTouches[i] = touchEventContext->touches(); eventPathTargetTouches[i] = touchEventContext->targetTouches(); eventPathChangedTouches[i] = touchEventContext->changedTouches(); } adjustTouchList(node, touchEvent.touches(), eventPath, eventPathTouches); adjustTouchList(node, touchEvent.targetTouches(), eventPath, eventPathTargetTouches); adjustTouchList(node, touchEvent.changedTouches(), eventPath, eventPathChangedTouches); }
void EventRetargeter::adjustForTouchEvent(Node* node, TouchEvent& touchEvent) { EventPath& eventPath = touchEvent.eventPath(); size_t eventPathSize = eventPath.size(); EventPathTouchLists eventPathTouches(eventPathSize); EventPathTouchLists eventPathTargetTouches(eventPathSize); EventPathTouchLists eventPathChangedTouches(eventPathSize); for (size_t i = 0; i < eventPathSize; ++i) { ASSERT(eventPath[i].isTouchEventContext()); TouchEventContext& touchEventContext = toTouchEventContext(eventPath[i]); eventPathTouches[i] = touchEventContext.touches(); eventPathTargetTouches[i] = touchEventContext.targetTouches(); eventPathChangedTouches[i] = touchEventContext.changedTouches(); } adjustTouchList(node, touchEvent.touches(), eventPath, eventPathTouches); adjustTouchList(node, touchEvent.targetTouches(), eventPath, eventPathTargetTouches); adjustTouchList(node, touchEvent.changedTouches(), eventPath, eventPathChangedTouches); }