5 public class JsRender.NodeToGtk : Object {
9 Gee.ArrayList<string> els;
10 //Gee.ArrayList<string> skip;
11 Gee.HashMap<string,string> ar_props;
12 public static int vcnt = 0;
14 public NodeToGtk( Node node)
17 this.els = new Gee.ArrayList<string>();
18 //this.skip = new Gee.ArrayList<string>();
19 this.ar_props = new Gee.HashMap<string,string>();
23 public Object? munge ( )
26 return this.mungeNode (null);
30 public Object? mungeChild( Node cnode)
32 var x = new NodeToGtk(cnode);
33 return x.mungeNode(this.wrapped_object);
36 public Object? mungeNode(Object? parent)
39 var cls = this.node.fqn().replace(".", "");
40 var ns = this.node.fqn().split(".")[0];
41 var gtkbuilder = new global::Gtk.Builder();
43 var cls_gtype = gtkbuilder.get_type_from_name(cls);
44 print("Type: %s ?= %s\n", this.node.fqn(), cls_gtype.name());
46 if (cls_gtype == GLib.Type.INVALID) {
47 print("SKIP - gtype is invalid\n");
50 // if it's a window...
52 if (cls_gtype.is_a(typeof(global::Gtk.Window))) {
53 // what if it has none...
54 if (this.node.items.size < 1) {
57 return this.mungeChild(this.node.items.get(0));
60 var ret = Object.new(cls_gtype);
61 ret.ref(); //??? problematic?
62 this.wrapped_object = ret;
67 case "GtkTreeStore": // top level.. - named and referenced
68 case "GtkListStore": // top level.. - named and referenced
69 case "GtkTreeViewColumn": // part of liststore?!?!
70 case "GtkMenu": // top level..
71 case "GtkCellRendererText":
72 case "GtkSourceBuffer":
73 case "GtkClutterActor"://fixme..
74 ///case "GtkClutterEmbed"://fixme..
79 //var id = this.node.uid();
80 //var ret = @"$pad<object class=\"$cls\" id=\"$id\">\n";
83 var props = Palete.Gir.factoryFqn(this.node.fqn()).props;
86 var pviter = props.map_iterator();
87 while (pviter.next()) {
89 // print("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
90 var k = pviter.get_key();
91 // skip items we have already handled..
92 if (!this.node.has(k)) {
95 // find out the type of the property...
96 var type = pviter.get_value().type;
97 type = Palete.Gir.fqtypeLookup(type, ns);
99 var val = this.toValue(this.node.get(k).strip(), type);
101 print("skip (failed to transform value %s type = %s from %s\n",
102 cls + "." + k, type, this.node.get(k).strip());
105 print ("set_property ( %s , %s)\n", k, this.node.get(k).strip());
108 ret.set_property(k, val);
113 // for now... - just try the builder style packing
116 if (!cls_gtype.is_a(typeof(global::Gtk.Buildable))) {
117 print("skipping pack %s is not a buildable..\n", cls);
120 if (parent == null) {
121 //print("skipping pack %s is not a buildable..\n", cls);
123 } else if (!parent.get_type().is_a(typeof(global::Gtk.Buildable))) {
124 print("skipping pack parent:%s is not a buildable..\n", parent.get_type().name());
129 ((global::Gtk.Buildable)parent).add_child(gtkbuilder, ret, null);
134 if (this.node.items.size < 1) {
138 for (var i = 0; i < this.node.items.size; i++ ) {
140 this.mungeChild(this.node.items.get(i));
151 public GLib.Value? toValue(string val, string type) {
153 var gtkbuilder = new global::Gtk.Builder();
155 if (type == "utf8") {
156 var qret = new GLib.Value(typeof(string));
157 qret.set_string(val);
161 var prop_gtype = gtkbuilder.get_type_from_name(type);
164 if (prop_gtype == GLib.Type.INVALID) {
170 var ret = new GLib.Value(prop_gtype);
175 ret.set_boolean(val.down() == "false" ? false : true);
178 ret.set_uint(int.parse(val));
182 ret.set_int(int.parse(val));
186 ret.set_float(long.parse(val));
195 var sval =new GLib.Value(typeof(string));
196 sval.set_string(val);
198 if (!sval.transform(ref ret)) {