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
This commit is contained in:
Bruno Garcia
2010-12-04 00:24:30 +00:00
parent 2783e82333
commit 66dfd0f44e
2 changed files with 61 additions and 1 deletions
@@ -47,6 +47,7 @@ import com.threerings.io.Streamable;
import com.threerings.presents.data.InvocationMarshaller; import com.threerings.presents.data.InvocationMarshaller;
import com.threerings.presents.dobj.DObject; import com.threerings.presents.dobj.DObject;
import com.threerings.presents.dobj.DSet;
public class GenActionScriptStreamableTask extends GenTask public class GenActionScriptStreamableTask extends GenTask
{ {
@@ -95,6 +96,7 @@ public class GenActionScriptStreamableTask extends GenTask
for (Field f : reqs.streamedFields) { for (Field f : reqs.streamedFields) {
fields.add(new ASField(f, imports)); fields.add(new ASField(f, imports));
} }
String output = mergeTemplate("com/threerings/presents/tools/streamable_as.tmpl", String output = mergeTemplate("com/threerings/presents/tools/streamable_as.tmpl",
"header", _header, "header", _header,
"package", sclass.getPackage().getName(), "package", sclass.getPackage().getName(),
@@ -126,6 +128,7 @@ public class GenActionScriptStreamableTask extends GenTask
public final String reader; public final String reader;
public final String writer; public final String writer;
public final String dobjectField; public final String dobjectField;
public boolean dset;
public ASField (Field f, Set<String> imports) public ASField (Field f, Set<String> imports)
{ {
@@ -140,6 +143,9 @@ public class GenActionScriptStreamableTask extends GenTask
imports.add("com.threerings.io.streamers.MapStreamer"); imports.add("com.threerings.io.streamers.MapStreamer");
} else if (Set.class.isAssignableFrom(f.getType())) { } else if (Set.class.isAssignableFrom(f.getType())) {
imports.add("com.threerings.io.streamers.SetStreamer"); 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()); reader = ActionScriptUtils.toReadObject(f.getType());
writer = ActionScriptUtils.toWriteObject(f.getType(), name); writer = ActionScriptUtils.toWriteObject(f.getType(), name);
@@ -23,6 +23,11 @@ public class {{classname}} {{^extends.isEmpty}}extends {{extends}}
{{#dobject}} {{#dobject}}
{{#fields}} {{#fields}}
public var {{name}}Changed :Signal = new Signal({{simpleType}}, {{simpleType}}); 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}}
{{#fields}} {{#fields}}
@@ -71,11 +76,15 @@ import org.osflash.signals.Signal;
import com.threerings.presents.dobj.AttributeChangedEvent; import com.threerings.presents.dobj.AttributeChangedEvent;
import com.threerings.presents.dobj.AttributeChangeListener; 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}}; import {{package}}.{{classname}};
class Signaller class Signaller
implements AttributeChangeListener implements AttributeChangeListener, SetListener
{ {
public function Signaller (obj :{{classname}}) public function Signaller (obj :{{classname}})
{ {
@@ -98,6 +107,51 @@ class Signaller
signal.dispatch(event.getValue(), event.getOldValue()); 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}}; protected var _obj :{{classname}};
} }
// GENERATED SIGNALLER END // GENERATED SIGNALLER END