From b660861be32c03c832719034c352f543a177541e Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Thu, 2 Dec 2010 02:25:35 +0000 Subject: [PATCH] In an effort to make DObject updates easier to react to in actionscript, gendobj now generates signals for each field that can be listened to individually. From the old: barrel.addListener(new AttributeChangeAdapter(function (event :AttributeChangedEvent) :void { if (event.getName() == BarrelObject.MONKEY_COUNT) { // ... cast event.getValue() and use it } })); to the new: barrel.onMonkeyCountChanged.add(function (newValue :int, oldValue :int) :void { // ... }); Only AttributeChangedEvent have been signalified, but I'm planning to continue with the other ChangeListeners shortly. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6328 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- as-pom.xml | 10 ++++ .../tools/GenActionScriptStreamableTask.java | 7 ++- .../presents/tools/streamable_as.tmpl | 49 +++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/as-pom.xml b/as-pom.xml index 648ae659a..fbcb9abd4 100644 --- a/as-pom.xml +++ b/as-pom.xml @@ -17,6 +17,10 @@ as3corelib-repo https://github.com/samskivert/as3corelib/raw/master/repository + + as3-signals-repo + https://github.com/groves/as3-signals/raw/master/repository + @@ -34,5 +38,11 @@ compile swc + + org.osflash + signals + 0.8 + swc + diff --git a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java index 5465f052c..cd086227c 100644 --- a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java +++ b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java @@ -82,6 +82,11 @@ public class GenActionScriptStreamableTask extends GenTask ActionScriptUtils.addImportAndGetShortType(sclass.getSuperclass(), false, imports); } + boolean isDObject = DObject.class.isAssignableFrom(sclass); + if (isDObject) { + imports.add("org.osflash.signals.Signal"); + } + Set implemented = Sets.newLinkedHashSet(); for (Class iface : sclass.getInterfaces()) { implemented.add(ActionScriptUtils.addImportAndGetShortType(iface, false, imports)); @@ -99,7 +104,7 @@ public class GenActionScriptStreamableTask extends GenTask "implements", Joiner.on(", ").join(implemented), "superclassStreamable", reqs.superclassStreamable, "fields", fields, - "dobject", DObject.class.isAssignableFrom(sclass)); + "dobject", isDObject); File outputLocation = ActionScriptUtils.createActionScriptPath(_asroot, sclass); if (outputLocation.exists()) { diff --git a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl index a7ac3860c..369e4390b 100644 --- a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl +++ b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl @@ -21,6 +21,10 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}} {{/fields}} {{#dobject}} +{{#fields}} + public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}}); +{{/fields}} + {{#fields}} public static const {{dobjectField}} :String = "{{name}}"; @@ -47,7 +51,52 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}} {{/fields}} } {{/dobject}} + +{{#dobject}} + public function {{classname}} () + { + new Signaller(this); + } +{{/dobject}} // GENERATED STREAMING END +// GENERATED CLASSFINISH START } } +// GENERATED CLASSFINISH END + +{{#dobject}} +// GENERATED SIGNALLER START +import org.osflash.signals.Signal; + +import com.threerings.presents.dobj.AttributeChangedEvent; +import com.threerings.presents.dobj.AttributeChangeListener; + +import {{package}}.{{classname}}; + +class Signaller + implements AttributeChangeListener +{ + public function Signaller (obj :{{classname}}) + { + _obj = obj; + _obj.addListener(this); + } + + public function attributeChanged (event :AttributeChangedEvent) :void + { + var signal :Signal; + switch (event.getName()) { +{{#fields}} + case "{{name}}": + signal = _obj.{{name}}Changed; + break; +{{/fields}} + } + signal.dispatch(event.getValue(), event.getOldValue()); + } + + protected var _obj :{{classname}}; +} +// GENERATED SIGNALLER END +{{/dobject}}