diff --git a/cocos/2d/CCClippingNode.cpp b/cocos/2d/CCClippingNode.cpp index 15fb64a92318..fba3c00debbe 100644 --- a/cocos/2d/CCClippingNode.cpp +++ b/cocos/2d/CCClippingNode.cpp @@ -142,6 +142,14 @@ bool ClippingNode::init(Node *stencil) void ClippingNode::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Node::onEnter(); if (_stencil != nullptr) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 07d28e4455ab..a51d2ac752ac 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -1050,46 +1050,12 @@ Mat4 Node::transform(const Mat4& parentTransform) return ret; } - -#if CC_ENABLE_SCRIPT_BINDING - -static bool sendNodeEventToJS(Node* node, int action) -{ - auto scriptEngine = ScriptEngineManager::getInstance()->getScriptEngine(); - - if (scriptEngine->isCalledFromScript()) - { - scriptEngine->setCalledFromScript(false); - } - else - { - BasicScriptData data(node,(void*)&action); - ScriptEvent scriptEvent(kNodeEvent,(void*)&data); - if (scriptEngine->sendEvent(&scriptEvent)) - return true; - } - - return false; -} - -static void sendNodeEventToLua(Node* node, int action) -{ - auto scriptEngine = ScriptEngineManager::getInstance()->getScriptEngine(); - - BasicScriptData data(node,(void*)&action); - ScriptEvent scriptEvent(kNodeEvent,(void*)&data); - - scriptEngine->sendEvent(&scriptEvent); -} - -#endif - void Node::onEnter() { #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeJavascript) { - if (sendNodeEventToJS(this, kNodeOnEnter)) + if (ScriptEngineManager::sendNodeEventToJS(this, kNodeOnEnter)) return; } #endif @@ -1106,7 +1072,7 @@ void Node::onEnter() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeLua) { - sendNodeEventToLua(this, kNodeOnEnter); + ScriptEngineManager::sendNodeEventToLua(this, kNodeOnEnter); } #endif } @@ -1116,7 +1082,7 @@ void Node::onEnterTransitionDidFinish() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeJavascript) { - if (sendNodeEventToJS(this, kNodeOnEnterTransitionDidFinish)) + if (ScriptEngineManager::sendNodeEventToJS(this, kNodeOnEnterTransitionDidFinish)) return; } #endif @@ -1128,7 +1094,7 @@ void Node::onEnterTransitionDidFinish() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeLua) { - sendNodeEventToLua(this, kNodeOnEnterTransitionDidFinish); + ScriptEngineManager::sendNodeEventToLua(this, kNodeOnEnterTransitionDidFinish); } #endif } @@ -1138,7 +1104,7 @@ void Node::onExitTransitionDidStart() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeJavascript) { - if (sendNodeEventToJS(this, kNodeOnExitTransitionDidStart)) + if (ScriptEngineManager::sendNodeEventToJS(this, kNodeOnExitTransitionDidStart)) return; } #endif @@ -1149,7 +1115,7 @@ void Node::onExitTransitionDidStart() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeLua) { - sendNodeEventToLua(this, kNodeOnExitTransitionDidStart); + ScriptEngineManager::sendNodeEventToLua(this, kNodeOnExitTransitionDidStart); } #endif } @@ -1159,7 +1125,7 @@ void Node::onExit() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeJavascript) { - if (sendNodeEventToJS(this, kNodeOnExit)) + if (ScriptEngineManager::sendNodeEventToJS(this, kNodeOnExit)) return; } #endif @@ -1174,7 +1140,7 @@ void Node::onExit() #if CC_ENABLE_SCRIPT_BINDING if (_scriptType == kScriptTypeLua) { - sendNodeEventToLua(this, kNodeOnExit); + ScriptEngineManager::sendNodeEventToLua(this, kNodeOnExit); } #endif } diff --git a/cocos/2d/CCParticleSystem.cpp b/cocos/2d/CCParticleSystem.cpp index 724b19672447..25c10660989c 100644 --- a/cocos/2d/CCParticleSystem.cpp +++ b/cocos/2d/CCParticleSystem.cpp @@ -616,6 +616,14 @@ void ParticleSystem::initParticle(tParticle* particle) void ParticleSystem::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Node::onEnter(); // update after action in run! diff --git a/cocos/base/CCScriptSupport.cpp b/cocos/base/CCScriptSupport.cpp index f5400c436a97..43f0d482c6c7 100644 --- a/cocos/base/CCScriptSupport.cpp +++ b/cocos/base/CCScriptSupport.cpp @@ -28,6 +28,7 @@ #if CC_ENABLE_SCRIPT_BINDING #include "base/CCScheduler.h" +#include "2d/CCNode.h" bool CC_DLL cc_assert_script_compatible(const char *msg) { @@ -162,6 +163,51 @@ void ScriptEngineManager::destroyInstance() } } +bool ScriptEngineManager::sendNodeEventToJS(Node* node, int action) +{ + auto scriptEngine = getInstance()->getScriptEngine(); + + if (scriptEngine->isCalledFromScript()) + { + // Should only be invoked at root class Node + scriptEngine->setCalledFromScript(false); + } + else + { + BasicScriptData data(node,(void*)&action); + ScriptEvent scriptEvent(kNodeEvent,(void*)&data); + if (scriptEngine->sendEvent(&scriptEvent)) + return true; + } + + return false; +} + +bool ScriptEngineManager::sendNodeEventToJSExtended(Node* node, int action) +{ + auto scriptEngine = getInstance()->getScriptEngine(); + + if (!scriptEngine->isCalledFromScript()) + { + BasicScriptData data(node,(void*)&action); + ScriptEvent scriptEvent(kNodeEvent,(void*)&data); + if (scriptEngine->sendEvent(&scriptEvent)) + return true; + } + + return false; +} + +void ScriptEngineManager::sendNodeEventToLua(Node* node, int action) +{ + auto scriptEngine = getInstance()->getScriptEngine(); + + BasicScriptData data(node,(void*)&action); + ScriptEvent scriptEvent(kNodeEvent,(void*)&data); + + scriptEngine->sendEvent(&scriptEvent); +} + NS_CC_END #endif // #if CC_ENABLE_SCRIPT_BINDING diff --git a/cocos/base/CCScriptSupport.h b/cocos/base/CCScriptSupport.h index ee649a1f9a68..1079dd0903dc 100644 --- a/cocos/base/CCScriptSupport.h +++ b/cocos/base/CCScriptSupport.h @@ -450,6 +450,7 @@ class CC_DLL ScriptEngineProtocol virtual bool parseConfig(ConfigType type, const std::string& str) = 0; }; +class Node; /** ScriptEngineManager is a singleton which holds an object instance of ScriptEngineProtocl It helps cocos2d-x and the user code to find back LuaEngine object @@ -490,6 +491,21 @@ class CC_DLL ScriptEngineManager * @lua NA */ static void destroyInstance(); + /** + * @js NA + * @lua NA + */ + static bool sendNodeEventToJS(Node* node, int action); + /** + * @js NA + * @lua NA + */ + static bool sendNodeEventToJSExtended(Node* node, int action); + /** + * @js NA + * @lua NA + */ + static void sendNodeEventToLua(Node* node, int action); /** * @js NA * @lua NA diff --git a/cocos/editor-support/cocostudio/CCArmature.cpp b/cocos/editor-support/cocostudio/CCArmature.cpp index aa7b32335ba0..d8b2537ff7f8 100644 --- a/cocos/editor-support/cocostudio/CCArmature.cpp +++ b/cocos/editor-support/cocostudio/CCArmature.cpp @@ -434,6 +434,14 @@ void Armature::draw(cocos2d::Renderer *renderer, const Mat4 &transform, uint32_t void Armature::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Node::onEnter(); scheduleUpdate(); } diff --git a/cocos/editor-support/spine/CCSkeleton.cpp b/cocos/editor-support/spine/CCSkeleton.cpp index ec8ed6b9fff2..4cde3682c7f4 100644 --- a/cocos/editor-support/spine/CCSkeleton.cpp +++ b/cocos/editor-support/spine/CCSkeleton.cpp @@ -276,7 +276,15 @@ Rect Skeleton::getBoundingBox () const { } void Skeleton::onEnter() { - Node::onEnter(); +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + + Node::onEnter(); scheduleUpdate(); } diff --git a/cocos/ui/CCProtectedNode.cpp b/cocos/ui/CCProtectedNode.cpp index e49aa6bbde08..4819db32c5e9 100644 --- a/cocos/ui/CCProtectedNode.cpp +++ b/cocos/ui/CCProtectedNode.cpp @@ -337,6 +337,14 @@ void ProtectedNode::visit(Renderer* renderer, const Mat4 &parentTransform, uint3 void ProtectedNode::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Node::onEnter(); for( const auto &child: _protectedChildren) child->onEnter(); diff --git a/cocos/ui/UILayout.cpp b/cocos/ui/UILayout.cpp index 74495a8e1bff..a42599b915ee 100644 --- a/cocos/ui/UILayout.cpp +++ b/cocos/ui/UILayout.cpp @@ -102,6 +102,14 @@ Layout::~Layout() void Layout::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Widget::onEnter(); if (_clippingStencil) { diff --git a/cocos/ui/UIPageView.cpp b/cocos/ui/UIPageView.cpp index bec6b266b91a..4a4ad1560540 100644 --- a/cocos/ui/UIPageView.cpp +++ b/cocos/ui/UIPageView.cpp @@ -68,6 +68,14 @@ PageView* PageView::create() void PageView::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Layout::onEnter(); scheduleUpdate(); } diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index ad66c67a3797..076e99ddcec0 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -95,9 +95,16 @@ ScrollView* ScrollView::create() void ScrollView::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Layout::onEnter(); scheduleUpdate(); - } bool ScrollView::init() diff --git a/cocos/ui/UITextField.cpp b/cocos/ui/UITextField.cpp index 7199783b69a7..7159fa0f6ba2 100644 --- a/cocos/ui/UITextField.cpp +++ b/cocos/ui/UITextField.cpp @@ -415,6 +415,14 @@ bool TextField::init() void TextField::onEnter() { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + Widget::onEnter(); scheduleUpdate(); } diff --git a/extensions/GUI/CCEditBox/CCEditBox.cpp b/extensions/GUI/CCEditBox/CCEditBox.cpp index 12572be246cc..ceea82382d04 100644 --- a/extensions/GUI/CCEditBox/CCEditBox.cpp +++ b/extensions/GUI/CCEditBox/CCEditBox.cpp @@ -329,6 +329,14 @@ void EditBox::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t pa void EditBox::onEnter(void) { +#if CC_ENABLE_SCRIPT_BINDING + if (_scriptType == kScriptTypeJavascript) + { + if (ScriptEngineManager::sendNodeEventToJSExtended(this, kNodeOnEnter)) + return; + } +#endif + ControlButton::onEnter(); if (_editBoxImpl != NULL) {