| 1020 | } |
| 1021 | |
| 1022 | void EventDispatcher::dispatchTouchEvent(EventTouch* event) |
| 1023 | { |
| 1024 | sortEventListeners(EventListenerTouchOneByOne::LISTENER_ID); |
| 1025 | sortEventListeners(EventListenerTouchAllAtOnce::LISTENER_ID); |
| 1026 | |
| 1027 | auto oneByOneListeners = getListeners(EventListenerTouchOneByOne::LISTENER_ID); |
| 1028 | auto allAtOnceListeners = getListeners(EventListenerTouchAllAtOnce::LISTENER_ID); |
| 1029 | |
| 1030 | // If there aren't any touch listeners, return directly. |
| 1031 | if (nullptr == oneByOneListeners && nullptr == allAtOnceListeners) |
| 1032 | return; |
| 1033 | |
| 1034 | bool isNeedsMutableSet = (oneByOneListeners && allAtOnceListeners); |
| 1035 | |
| 1036 | const std::vector<Touch*>& originalTouches = event->getTouches(); |
| 1037 | auto mutableTouches = originalTouches; |
| 1038 | |
| 1039 | // |
| 1040 | // process the target handlers 1st |
| 1041 | // |
| 1042 | if (oneByOneListeners) |
| 1043 | { |
| 1044 | auto mutableTouchesIter = mutableTouches.begin(); |
| 1045 | |
| 1046 | for (auto&& touches : originalTouches) |
| 1047 | { |
| 1048 | bool isSwallowed = false; |
| 1049 | |
| 1050 | auto onTouchEvent = [&](EventListener* l) -> bool { // Return true to break |
| 1051 | EventListenerTouchOneByOne* listener = static_cast<EventListenerTouchOneByOne*>(l); |
| 1052 | |
| 1053 | // Skip if the listener was removed. |
| 1054 | if (!listener->_isRegistered) |
| 1055 | return false; |
| 1056 | |
| 1057 | event->setCurrentTarget(listener->_node); |
| 1058 | |
| 1059 | bool isClaimed = false; |
| 1060 | std::vector<Touch*>::iterator removedIter; |
| 1061 | |
| 1062 | EventTouch::EventCode eventCode = event->getEventCode(); |
| 1063 | |
| 1064 | if (eventCode == EventTouch::EventCode::BEGAN) |
| 1065 | { |
| 1066 | if (listener->onTouchBegan) |
| 1067 | { |
| 1068 | isClaimed = listener->onTouchBegan(touches, event); |
| 1069 | if (isClaimed && listener->_isRegistered) |
| 1070 | { |
| 1071 | listener->_claimedTouches.emplace_back(touches); |
| 1072 | } |
| 1073 | } |
| 1074 | } |
| 1075 | else if (!listener->_claimedTouches.empty() && |
| 1076 | ((removedIter = std::find(listener->_claimedTouches.begin(), listener->_claimedTouches.end(), |
| 1077 | touches)) != listener->_claimedTouches.end())) |
| 1078 | { |
| 1079 | isClaimed = true; |
nothing calls this directly
no test coverage detected