Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 2 files). Show all
Unified · Split
| @@ -395,20 +395,27 @@ void ScriptEngine::generalHandler(const EntityItemID& entityID, const QString& e · 394 unmodified lines | |||
| 395 | const RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; | 395 | const RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; |
| 396 | if (!handlersOnEntity.contains(eventName)) return; | 396 | if (!handlersOnEntity.contains(eventName)) return; |
| 397 | // FIXME: Need one more level of indirection. We need to allow multiple handlers per event, registered by different scripts. | 397 | // FIXME: Need one more level of indirection. We need to allow multiple handlers per event, registered by different scripts. |
| 398 | QScriptValue handlerForEvent = handlersOnEntity[eventName]; | 398 | QScriptValueList handlersForEvent = handlersOnEntity[eventName]; |
| 399 | if (handlerForEvent.isValid()) { | 399 | if (!handlersForEvent.isEmpty()) { |
| 400 | QScriptValueList args = argGenerator(); | 400 | QScriptValueList args = argGenerator(); |
| 401 | handlerForEvent.call(QScriptValue(), args); | 401 | for (int i = 0; i < handlersForEvent.count(); ++i) { |
| 402 | handlersForEvent[i].call(QScriptValue(), args); | ||
| 403 | } | ||
| 402 | } | 404 | } |
| 403 | } | 405 | } |
| 404 | // Unregister the handler for this eventName and entityID. | 406 | // Unregister the handlers for this eventName and entityID. |
| 405 | void ScriptEngine::removeEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { | 407 | void ScriptEngine::removeEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { |
| 406 | if (!_registeredHandlers.contains(entityID)) return; | 408 | if (!_registeredHandlers.contains(entityID)) return; |
| 407 | RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; | 409 | RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; |
| 408 | if (!handlersOnEntity.contains(eventName)) return; | 410 | QScriptValueList& handlersForEvent = handlersOnEntity[eventName]; |
| 409 | handlersOnEntity.remove(eventName); | 411 | // QScriptValue does not have operator==(), so we can't use QList::removeOne and friends. So iterate. |
| 412 | for (int i = 0; i < handlersForEvent.count(); ++i) { | ||
| 413 | if (handlersForEvent[i].equals(handler)) { | ||
| 414 | handlersForEvent.removeAt(i); | ||
| 415 | return; // Design choice: since comparison is relatively expensive, just remove the first matching handler. | ||
| 416 | } | ||
| 417 | } | ||
| 410 | } | 418 | } |
| 411 | // FIXME: deletingEntity, changingEntityID | ||
| 412 | // Register the handler. | 419 | // Register the handler. |
| 413 | void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { | 420 | void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { |
| 414 | if (_registeredHandlers.count() == 0) { // First time any per-entity handler has been added in this script... | 421 | if (_registeredHandlers.count() == 0) { // First time any per-entity handler has been added in this script... |
| @@ -466,7 +473,8 @@ void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QSt · 51 unmodified lines | |||
| 466 | if (!_registeredHandlers.contains(entityID)) { | 473 | if (!_registeredHandlers.contains(entityID)) { |
| 467 | _registeredHandlers[entityID] = RegisteredEventHandlers(); | 474 | _registeredHandlers[entityID] = RegisteredEventHandlers(); |
| 468 | } | 475 | } |
| 469 | _registeredHandlers[entityID][eventName] = handler; | 476 | QScriptValueList& handlersForEvent = _registeredHandlers[entityID][eventName]; |
| 477 | handlersForEvent << handler; // Note that the same handler can be added many times. See removeEntityEventHandler(). | ||
| 470 | } | 478 | } |
| 471 | 479 | ||
| 472 | 480 | ||