Browse Source

Added LuaScriptInstance subscribe to specific sender's event.

Lasse Öörni 12 years ago
parent
commit
a9f13ebdfe

+ 2 - 0
Docs/LuaScriptAPI.dox

@@ -2596,6 +2596,8 @@ Methods:<br>
 - bool CreateObject(const char* objectType)
 - bool CreateObject(const char* objectType)
 - SubscribeToEvent(const String& eventName, const char* functionName)
 - SubscribeToEvent(const String& eventName, const char* functionName)
 - SubscribeToEvent(const char* eventName, const char* functionName)
 - SubscribeToEvent(const char* eventName, const char* functionName)
+- SubscribeToEvent(void* object, const String& eventName, const char* functionName);
+- SubscribeToEvent(void* object, const char* eventName, const char* functionName);
 
 
 BoundingBox
 BoundingBox
 
 

+ 1 - 1
Source/Engine/Network/HttpRequest.h

@@ -28,7 +28,7 @@
 namespace Urho3D
 namespace Urho3D
 {
 {
 
 
-/// HTTP request class.
+/// An HTTP connection with response data stream.
 class HttpRequest : public RefCounted, public Deserializer
 class HttpRequest : public RefCounted, public Deserializer
 {
 {
 public:
 public:

+ 5 - 4
Source/Extras/LuaScript/LuaScript.cpp

@@ -183,19 +183,20 @@ void LuaScript::ScriptSubscribeToEvent(const String& eventName, const String& fu
     eventTypeToFunctionRefMap_[eventType] = functionRef;
     eventTypeToFunctionRefMap_[eventType] = functionRef;
 }
 }
 
 
-void LuaScript::ScriptSubscribeToEvent(Object* object, const String& eventName, const String& functionName)
+void LuaScript::ScriptSubscribeToEvent(void* object, const String& eventName, const String& functionName)
 {
 {
     StringHash eventType(eventName);
     StringHash eventType(eventName);
+    Object* sender = (Object*)object;
 
 
-    HashSet<Object*>* receivers = context_->GetEventReceivers(object, eventType);
+    HashSet<Object*>* receivers = context_->GetEventReceivers(sender, eventType);
     if (!receivers || !receivers->Contains(this))
     if (!receivers || !receivers->Contains(this))
-        SubscribeToEvent(object, eventType, HANDLER(LuaScript, HandleObjectEvent));
+        SubscribeToEvent(sender, eventType, HANDLER(LuaScript, HandleObjectEvent));
 
 
     int functionRef = LUA_REFNIL;
     int functionRef = LUA_REFNIL;
     if (FindFunction(functionName))
     if (FindFunction(functionName))
         functionRef = luaL_ref(luaState_, LUA_REGISTRYINDEX);
         functionRef = luaL_ref(luaState_, LUA_REGISTRYINDEX);
 
 
-    objectToEventTypeToFunctionRefMap_[object][eventType] = functionRef;
+    objectToEventTypeToFunctionRefMap_[sender][eventType] = functionRef;
 }
 }
 
 
 void LuaScript::RegisterLoader()
 void LuaScript::RegisterLoader()

+ 1 - 1
Source/Extras/LuaScript/LuaScript.h

@@ -59,7 +59,7 @@ public:
     void ScriptSubscribeToEvent(const String& eventName, const String& functionName);
     void ScriptSubscribeToEvent(const String& eventName, const String& functionName);
 
 
     /// Script subscribe object's event.
     /// Script subscribe object's event.
-    void ScriptSubscribeToEvent(Object* object, const String& eventName, const String& functionName);
+    void ScriptSubscribeToEvent(void* object, const String& eventName, const String& functionName);
 
 
     /// Return Lua state.
     /// Return Lua state.
     lua_State* GetLuaState() const { return luaState_; }
     lua_State* GetLuaState() const { return luaState_; }

+ 30 - 0
Source/Extras/LuaScript/LuaScriptInstance.cpp

@@ -143,6 +143,23 @@ void LuaScriptInstance::ScriptSubscribeToEvent(const String& eventName, const St
     eventTypeToFunctionRefMap_[eventType] = functionRef;
     eventTypeToFunctionRefMap_[eventType] = functionRef;
 }
 }
 
 
+void LuaScriptInstance::ScriptSubscribeToEvent(void* object, const String& eventName, const String& functionName)
+{
+    StringHash eventType(eventName);
+    String realFunctionName = functionName.Replaced(":", ".");
+    Object* sender = (Object*)object;
+    
+    HashSet<Object*>* receivers = context_->GetEventReceivers(sender, eventType);
+    if (!receivers || !receivers->Contains(this))
+        SubscribeToEvent(sender, eventType, HANDLER(LuaScriptInstance, HandleObjectEvent));
+
+    int functionRef = LUA_REFNIL;
+    if (luaScript_->FindFunction(realFunctionName))
+        functionRef = luaL_ref(luaState_, LUA_REGISTRYINDEX);
+
+    objectToEventTypeToFunctionRefMap_[sender][eventType] = functionRef;
+}
+
 void LuaScriptInstance::HandleEvent(StringHash eventType, VariantMap& eventData)
 void LuaScriptInstance::HandleEvent(StringHash eventType, VariantMap& eventData)
 {
 {
     if (scriptObjectRef_ == LUA_REFNIL)
     if (scriptObjectRef_ == LUA_REFNIL)
@@ -155,6 +172,19 @@ void LuaScriptInstance::HandleEvent(StringHash eventType, VariantMap& eventData)
     CallEventHandler(functionRef, eventType, eventData);
     CallEventHandler(functionRef, eventType, eventData);
 }
 }
 
 
+void LuaScriptInstance::HandleObjectEvent(StringHash eventType, VariantMap& eventData)
+{
+    if (scriptObjectRef_ == LUA_REFNIL)
+        return;
+
+    Object* object = GetEventSender();
+    int functionRef = objectToEventTypeToFunctionRefMap_[object][eventType];
+    if (functionRef == LUA_REFNIL)
+        return;
+
+    CallEventHandler(functionRef, eventType, eventData);
+}
+
 void LuaScriptInstance::CallEventHandler(int functionRef, StringHash eventType, VariantMap& eventData )
 void LuaScriptInstance::CallEventHandler(int functionRef, StringHash eventType, VariantMap& eventData )
 {
 {
     int top = lua_gettop(luaState_);
     int top = lua_gettop(luaState_);

+ 10 - 1
Source/Extras/LuaScript/LuaScriptInstance.h

@@ -49,11 +49,17 @@ public:
 
 
     /// Script subscribe event.
     /// Script subscribe event.
     void ScriptSubscribeToEvent(const String& eventName, const String& functionName);
     void ScriptSubscribeToEvent(const String& eventName, const String& functionName);
-
+    
+    /// Script subscribe object's event.
+    void ScriptSubscribeToEvent(void* object, const String& eventName, const String& functionName);
+    
 protected:
 protected:
     /// Handle event.
     /// Handle event.
     void HandleEvent(StringHash eventType, VariantMap& eventData);
     void HandleEvent(StringHash eventType, VariantMap& eventData);
 
 
+    /// Handle object event.
+    void HandleObjectEvent(StringHash eventType, VariantMap& eventData);
+
     /// Call event handler.
     /// Call event handler.
     void CallEventHandler(int functionRef, StringHash eventType, VariantMap& eventData);
     void CallEventHandler(int functionRef, StringHash eventType, VariantMap& eventData);
 
 
@@ -72,6 +78,9 @@ private:
 
 
     /// Event type to function ref map.
     /// Event type to function ref map.
     HashMap<StringHash, int> eventTypeToFunctionRefMap_;
     HashMap<StringHash, int> eventTypeToFunctionRefMap_;
+    
+    /// Object to event type to function ref map.
+    HashMap<Object*, HashMap<StringHash, int> > objectToEventTypeToFunctionRefMap_;
 };
 };
 
 
 }
 }

+ 1 - 1
Source/Extras/LuaScript/pkgs/LuaScript/LuaScript.pkg

@@ -43,7 +43,7 @@ static void SubscribeToEvent(const String& eventName, const char* functionName)
 
 
 static void SubscribeToEvent(void* object, const String& eventName, const char* functionName)
 static void SubscribeToEvent(void* object, const String& eventName, const char* functionName)
 {
 {
-    GetLuaScript()->ScriptSubscribeToEvent((Object*)object, eventName, functionName);
+    GetLuaScript()->ScriptSubscribeToEvent(object, eventName, functionName);
 }
 }
 
 
 $}
 $}

+ 9 - 2
Source/Extras/LuaScript/pkgs/LuaScript/LuaScriptInstance.pkg

@@ -7,6 +7,9 @@ class LuaScriptInstance : public Component
     
     
     void ScriptSubscribeToEvent @ SubscribeToEvent(const String& eventName, const char* functionName);
     void ScriptSubscribeToEvent @ SubscribeToEvent(const String& eventName, const char* functionName);
     void ScriptSubscribeToEvent @ SubscribeToEvent(const char* eventName, const char* functionName);
     void ScriptSubscribeToEvent @ SubscribeToEvent(const char* eventName, const char* functionName);
+    
+    void ScriptSubscribeToEvent @ SubscribeToEvent(void* object, const String& eventName, const char* functionName);
+    void ScriptSubscribeToEvent @ SubscribeToEvent(void* object, const char* eventName, const char* functionName);
 };
 };
 
 
 $[
 $[
@@ -22,12 +25,16 @@ function LuaScriptObject:GetNode()
 	return self.node
 	return self.node
 end
 end
 
 
-function LuaScriptObject:SubscribeToEvent(eventType, functionName)
+function LuaScriptObject:SubscribeToEvent(param1, param2, param3)
     local instance = self.instance
     local instance = self.instance
     if instance == nil then
     if instance == nil then
         return
         return
     end
     end
-    instance:SubscribeToEvent(eventType, functionName)
+    if param3 == nil then
+        instance:SubscribeToEvent(param1, param2)
+    else
+        instance:SubscribeToEvent(param1, param2, param3)
+    end
 end
 end
 
 
 function ScriptObject()
 function ScriptObject()