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
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.
405void ScriptEngine::removeEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) {407void 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.
413void ScriptEngine::addEntityEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler) {420void 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