MCPcopy Create free account
hub / github.com/axmolengine/axmol / dispatchTouchEvent

Method dispatchTouchEvent

core/base/EventDispatcher.cpp:1022–1213  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1020}
1021
1022void 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;

Callers

nothing calls this directly

Calls 15

getListenersFunction · 0.85
findFunction · 0.50
beginMethod · 0.45
onTouchBeganMethod · 0.45
emplace_backMethod · 0.45
emptyMethod · 0.45
endMethod · 0.45
onTouchMovedMethod · 0.45
onTouchEndedMethod · 0.45
eraseMethod · 0.45
onTouchCancelledMethod · 0.45
onTouchesBeganMethod · 0.45

Tested by

no test coverage detected