From 66dfd0f44e3bf77928057b04fc0e60bf01045274 Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Sat, 4 Dec 2010 00:24:30 +0000 Subject: [PATCH] Generate DSet add/remove/update signals for AS3 DObjects. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6338 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../tools/GenActionScriptStreamableTask.java | 6 ++ .../presents/tools/streamable_as.tmpl | 56 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java index cd086227c..42b21fb90 100644 --- a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java +++ b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java @@ -47,6 +47,7 @@ import com.threerings.io.Streamable; import com.threerings.presents.data.InvocationMarshaller; import com.threerings.presents.dobj.DObject; +import com.threerings.presents.dobj.DSet; public class GenActionScriptStreamableTask extends GenTask { @@ -95,6 +96,7 @@ public class GenActionScriptStreamableTask extends GenTask for (Field f : reqs.streamedFields) { fields.add(new ASField(f, imports)); } + String output = mergeTemplate("com/threerings/presents/tools/streamable_as.tmpl", "header", _header, "package", sclass.getPackage().getName(), @@ -126,6 +128,7 @@ public class GenActionScriptStreamableTask extends GenTask public final String reader; public final String writer; public final String dobjectField; + public boolean dset; public ASField (Field f, Set imports) { @@ -140,6 +143,9 @@ public class GenActionScriptStreamableTask extends GenTask imports.add("com.threerings.io.streamers.MapStreamer"); } else if (Set.class.isAssignableFrom(f.getType())) { imports.add("com.threerings.io.streamers.SetStreamer"); + } else if (DSet.class.isAssignableFrom(f.getType())) { + dset = true; + imports.add("com.threerings.presents.dobj.DSet_Entry"); // Used for signals } reader = ActionScriptUtils.toReadObject(f.getType()); writer = ActionScriptUtils.toWriteObject(f.getType(), name); 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 2bf6c7546..79592e18f 100644 --- a/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl +++ b/src/main/resources/com/threerings/presents/tools/streamable_as.tmpl @@ -23,6 +23,11 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}} {{#dobject}} {{#fields}} public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}}); +{{#dset}} + public var {{name}}Added :Signal = new Signal(DSet_Entry); + public var {{name}}Removed :Signal = new Signal(DSet_Entry); + public var {{name}}Updated :Signal = new Signal(DSet_Entry, DSet_Entry); +{{/dset}} {{/fields}} {{#fields}} @@ -71,11 +76,15 @@ import org.osflash.signals.Signal; import com.threerings.presents.dobj.AttributeChangedEvent; import com.threerings.presents.dobj.AttributeChangeListener; +import com.threerings.presents.dobj.EntryAddedEvent; +import com.threerings.presents.dobj.EntryRemovedEvent; +import com.threerings.presents.dobj.EntryUpdatedEvent; +import com.threerings.presents.dobj.SetListener; import {{package}}.{{classname}}; class Signaller - implements AttributeChangeListener + implements AttributeChangeListener, SetListener { public function Signaller (obj :{{classname}}) { @@ -98,6 +107,51 @@ class Signaller signal.dispatch(event.getValue(), event.getOldValue()); } + public function entryAdded (event :EntryAddedEvent) :void + { + var signal :Signal; + switch (event.getName()) { +{{#fields}}{{#dset}} + case "{{name}}": + signal = _obj.{{name}}Added; + break; +{{/dset}}{{/fields}} + default: + return; + } + signal.dispatch(event.getEntry()); + } + + public function entryRemoved (event :EntryRemovedEvent) :void + { + var signal :Signal; + switch (event.getName()) { +{{#fields}}{{#dset}} + case "{{name}}": + signal = _obj.{{name}}Removed; + break; +{{/dset}}{{/fields}} + default: + return; + } + signal.dispatch(event.getOldEntry()); + } + + public function entryUpdated (event :EntryUpdatedEvent) :void + { + var signal :Signal; + switch (event.getName()) { +{{#fields}}{{#dset}} + case "{{name}}": + signal = _obj.{{name}}Updated; + break; +{{/dset}}{{/fields}} + default: + return; + } + signal.dispatch(event.getEntry(), event.getOldEntry()); + } + protected var _obj :{{classname}}; } // GENERATED SIGNALLER END