|
@@ -29,15 +29,59 @@
|
|
|
namespace Urho3D
|
|
namespace Urho3D
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
|
|
+class EventHandlerCommand
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ EventHandlerCommand(int type) : type_(type) { }
|
|
|
|
|
+ virtual ~EventHandlerCommand() { }
|
|
|
|
|
+ int type_;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+struct AddOrRemoveEventHandlerCommand : public EventHandlerCommand
|
|
|
|
|
+{
|
|
|
|
|
+ enum { Type = 1 };
|
|
|
|
|
+ AddOrRemoveEventHandlerCommand(bool add, Object* sender, const StringHash& eventType, WeakPtr<LuaFunction> function) :
|
|
|
|
|
+ EventHandlerCommand(Type), add_(add), sender_(sender), eventType_(eventType), function_(function)
|
|
|
|
|
+ {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ bool add_;
|
|
|
|
|
+ Object* sender_;
|
|
|
|
|
+ StringHash eventType_;
|
|
|
|
|
+ WeakPtr<LuaFunction> function_;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+struct RemoveAllEventHandlersCommand : public EventHandlerCommand
|
|
|
|
|
+{
|
|
|
|
|
+ enum { Type = 2 };
|
|
|
|
|
+ RemoveAllEventHandlersCommand(Object* sender) : EventHandlerCommand(Type), sender_(sender)
|
|
|
|
|
+ {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Object* sender_;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+struct RemoveEventHandlersExceptCommand : public EventHandlerCommand
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+ enum { Type = 3 };
|
|
|
|
|
+ RemoveEventHandlersExceptCommand(const PODVector<StringHash>& exceptionTypes) : EventHandlerCommand(Type), exceptionTypes_(exceptionTypes)
|
|
|
|
|
+ {
|
|
|
|
|
+ }
|
|
|
|
|
+ PODVector<StringHash> exceptionTypes_;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
LuaScriptEventInvoker::LuaScriptEventInvoker(Context* context) :
|
|
LuaScriptEventInvoker::LuaScriptEventInvoker(Context* context) :
|
|
|
Object(context),
|
|
Object(context),
|
|
|
- instance_(0)
|
|
|
|
|
|
|
+ instance_(0),
|
|
|
|
|
+ invoking_(false)
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
LuaScriptEventInvoker::LuaScriptEventInvoker(LuaScriptInstance* instance) :
|
|
LuaScriptEventInvoker::LuaScriptEventInvoker(LuaScriptInstance* instance) :
|
|
|
Object(instance->GetContext()),
|
|
Object(instance->GetContext()),
|
|
|
- instance_(instance)
|
|
|
|
|
|
|
+ instance_(instance),
|
|
|
|
|
+ invoking_(false)
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -47,6 +91,12 @@ LuaScriptEventInvoker::~LuaScriptEventInvoker()
|
|
|
|
|
|
|
|
void LuaScriptEventInvoker::AddEventHandler(Object* sender, const StringHash& eventType, WeakPtr<LuaFunction> function)
|
|
void LuaScriptEventInvoker::AddEventHandler(Object* sender, const StringHash& eventType, WeakPtr<LuaFunction> function)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (invoking_)
|
|
|
|
|
+ {
|
|
|
|
|
+ eventHandlerCommands_.Push(new AddOrRemoveEventHandlerCommand(true, sender, eventType, function));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
EventTypeToLuaFunctionVectorMap& eventTypeToFunctionVectorMap = GetEventTypeToLuaFunctionVectorMap(sender);
|
|
EventTypeToLuaFunctionVectorMap& eventTypeToFunctionVectorMap = GetEventTypeToLuaFunctionVectorMap(sender);
|
|
|
EventTypeToLuaFunctionVectorMap::Iterator i = eventTypeToFunctionVectorMap.Find(eventType);
|
|
EventTypeToLuaFunctionVectorMap::Iterator i = eventTypeToFunctionVectorMap.Find(eventType);
|
|
|
|
|
|
|
@@ -68,6 +118,12 @@ void LuaScriptEventInvoker::AddEventHandler(Object* sender, const StringHash& ev
|
|
|
|
|
|
|
|
void LuaScriptEventInvoker::RemoveEventHandler(Object* sender, const StringHash& eventType, WeakPtr<LuaFunction> function)
|
|
void LuaScriptEventInvoker::RemoveEventHandler(Object* sender, const StringHash& eventType, WeakPtr<LuaFunction> function)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (invoking_)
|
|
|
|
|
+ {
|
|
|
|
|
+ eventHandlerCommands_.Push(new AddOrRemoveEventHandlerCommand(false, sender, eventType, function));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
EventTypeToLuaFunctionVectorMap& eventTypeToLuaFunctionVectorMap = GetEventTypeToLuaFunctionVectorMap(sender);
|
|
EventTypeToLuaFunctionVectorMap& eventTypeToLuaFunctionVectorMap = GetEventTypeToLuaFunctionVectorMap(sender);
|
|
|
EventTypeToLuaFunctionVectorMap::Iterator i = eventTypeToLuaFunctionVectorMap.Find(eventType);
|
|
EventTypeToLuaFunctionVectorMap::Iterator i = eventTypeToLuaFunctionVectorMap.Find(eventType);
|
|
|
if (i == eventTypeToLuaFunctionVectorMap.End())
|
|
if (i == eventTypeToLuaFunctionVectorMap.End())
|
|
@@ -91,6 +147,12 @@ void LuaScriptEventInvoker::RemoveEventHandler(Object* sender, const StringHash&
|
|
|
|
|
|
|
|
void LuaScriptEventInvoker::RemoveAllEventHandlers(Object* sender)
|
|
void LuaScriptEventInvoker::RemoveAllEventHandlers(Object* sender)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (invoking_)
|
|
|
|
|
+ {
|
|
|
|
|
+ eventHandlerCommands_.Push(new RemoveAllEventHandlersCommand(sender));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (!sender)
|
|
if (!sender)
|
|
|
{
|
|
{
|
|
|
UnsubscribeFromAllEvents();
|
|
UnsubscribeFromAllEvents();
|
|
@@ -106,6 +168,12 @@ void LuaScriptEventInvoker::RemoveAllEventHandlers(Object* sender)
|
|
|
|
|
|
|
|
void LuaScriptEventInvoker::RemoveEventHandlersExcept(const PODVector<StringHash>& exceptionTypes)
|
|
void LuaScriptEventInvoker::RemoveEventHandlersExcept(const PODVector<StringHash>& exceptionTypes)
|
|
|
{
|
|
{
|
|
|
|
|
+ if (invoking_)
|
|
|
|
|
+ {
|
|
|
|
|
+ eventHandlerCommands_.Push(new RemoveEventHandlersExceptCommand(exceptionTypes));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
for (unsigned i = 0; i < exceptionTypes.Size(); ++i)
|
|
for (unsigned i = 0; i < exceptionTypes.Size(); ++i)
|
|
|
eventTypeToLuaFunctionVectorMap.Erase(exceptionTypes[i]);
|
|
eventTypeToLuaFunctionVectorMap.Erase(exceptionTypes[i]);
|
|
|
|
|
|
|
@@ -120,9 +188,9 @@ void LuaScriptEventInvoker::HandleLuaScriptEvent(StringHash eventType, VariantMa
|
|
|
if (i == eventTypeToLuaFunctionVectorMap.End())
|
|
if (i == eventTypeToLuaFunctionVectorMap.End())
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
- // Create a copy
|
|
|
|
|
- LuaFunctionVector luaFunctionVector = i->second_;
|
|
|
|
|
|
|
+ invoking_ = true;
|
|
|
|
|
|
|
|
|
|
+ LuaFunctionVector& luaFunctionVector = i->second_;
|
|
|
if (instance_)
|
|
if (instance_)
|
|
|
{
|
|
{
|
|
|
instance_->AddRef();
|
|
instance_->AddRef();
|
|
@@ -153,6 +221,51 @@ void LuaScriptEventInvoker::HandleLuaScriptEvent(StringHash eventType, VariantMa
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ invoking_ = false;
|
|
|
|
|
+
|
|
|
|
|
+ if (!eventHandlerCommands_.Empty())
|
|
|
|
|
+ {
|
|
|
|
|
+ for (unsigned i = 0; i < eventHandlerCommands_.Size(); ++i)
|
|
|
|
|
+ ExecuteThenDestroyCommand(eventHandlerCommands_[i]);
|
|
|
|
|
+
|
|
|
|
|
+ eventHandlerCommands_.Clear();
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void LuaScriptEventInvoker::ExecuteThenDestroyCommand(EventHandlerCommand* command)
|
|
|
|
|
+{
|
|
|
|
|
+ if (!command)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ switch (command->type_)
|
|
|
|
|
+ {
|
|
|
|
|
+ case AddOrRemoveEventHandlerCommand::Type:
|
|
|
|
|
+ {
|
|
|
|
|
+ AddOrRemoveEventHandlerCommand* theCommand = (AddOrRemoveEventHandlerCommand*)command;
|
|
|
|
|
+ if (theCommand->add_)
|
|
|
|
|
+ AddEventHandler(theCommand->sender_, theCommand->eventType_, theCommand->function_);
|
|
|
|
|
+ else
|
|
|
|
|
+ RemoveEventHandler(theCommand->sender_, theCommand->eventType_, theCommand->function_);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case RemoveAllEventHandlersCommand::Type:
|
|
|
|
|
+ {
|
|
|
|
|
+ RemoveAllEventHandlersCommand* theCommand = (RemoveAllEventHandlersCommand*)command;
|
|
|
|
|
+ RemoveAllEventHandlers(theCommand->sender_);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case RemoveEventHandlersExceptCommand::Type:
|
|
|
|
|
+ {
|
|
|
|
|
+ RemoveEventHandlersExceptCommand* theCommand = (RemoveEventHandlersExceptCommand*)command;
|
|
|
|
|
+ RemoveEventHandlersExcept(theCommand->exceptionTypes_);
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ delete command;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|