History

Mulitple independent handlers for same entity/event.

Howard Stearns committed 11 years ago

Commit a0d09c01 parent b884d3c2 files · +17 −9Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 2 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+16−8
@@ -395,20 +395,27 @@ void ScriptEngine::generalHandler(const EntityItemID& entityID, const QString& e · 394 unmodified lines
395395 const RegisteredEventHandlers& handlersOnEntity = _registeredHandlers[entityID];
396396 if (!handlersOnEntity.contains(eventName)) return;
397397 // 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()) {
400400 QScriptValueList args = argGenerator();
401− handlerForEvent.call(QScriptValue(), args);
401+ for (int i = 0; i < handlersForEvent.count(); ++i) {
402+ handlersForEvent[i].call(QScriptValue(), args);
403+ }
402404 }
403405 }
404−// Unregister the handler for this eventName and entityID.
406+// Unregister the handlers for this eventName and entityID.
405407 void ScriptEngine::removeEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) {
406408 if (!_registeredHandlers.contains(entityID)) return;
407409 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+ }
410418 }
411−// FIXME: deletingEntity, changingEntityID
412419 // Register the handler.
413420 void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) {
414421 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
466473 if (!_registeredHandlers.contains(entityID)) {
467474 _registeredHandlers[entityID] = RegisteredEventHandlers();
468475 }
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().
470478 }
471479
472480