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 | 395 | const RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; |
| 396 | 396 | if (!handlersOnEntity.contains(eventName)) return; |
| 397 | 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]; | |
| 399 | − if (handlerForEvent.isValid()) { | |
| 398 | + QScriptValueList handlersForEvent = handlersOnEntity[eventName]; | |
| 399 | + if (!handlersForEvent.isEmpty()) { | |
| 400 | 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 | 407 | void ScriptEngine::removeEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { |
| 406 | 408 | if (!_registeredHandlers.contains(entityID)) return; |
| 407 | 409 | RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID]; |
| 408 | − if (!handlersOnEntity.contains(eventName)) return; | |
| 409 | − handlersOnEntity.remove(eventName); | |
| 410 | + QScriptValueList& handlersForEvent = handlersOnEntity[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 | 419 | // Register the handler. |
| 413 | 420 | void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) { |
| 414 | 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 | 473 | if (!_registeredHandlers.contains(entityID)) { |
| 467 | 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 | |