2 This kind of works - however there are issues with embedding gladeui that do not seem fixable.
3 - rendering is borked for windows - they detach for some reason.
4 - selecting stuff and drag etc. would probably be complicated...
8 public class JsRender.NodeToGlade : Object {
15 public NodeToGlade( Project.Gtk project, Node node, Xml.Node* parent)
19 this.project = project;
24 public static string mungeFile(JsRender file)
26 if (file.tree == null) {
30 var n = new NodeToGlade( (Project.Gtk) file.project, file.tree, null);
32 ///n.toValaName(file.tree);
35 //GLib.debug("top cls %s / xlcs %s ",file.tree.xvala_cls,file.tree.xvala_cls);
36 //n.cls = file.tree.xvala_cls;
37 //n.xcls = file.tree.xvala_xcls;
43 public string munge ( )
50 this.doc->dump_memory_format (out ret, out len, true);
57 public Xml.Node* mungeChild( Node cnode , Xml.Node* cdom)
59 var x = new NodeToGlade(this.project, cnode, cdom);
62 public static Xml.Ns* ns = null;
65 public Xml.Node* create_element(string n)
67 if (NodeToGlade.ns == null) {
68 Xml.Ns* ns = new Xml.Ns (null, "", "");
69 ns->type = Xml.ElementType.ELEMENT_NODE;
71 Xml.Node* nn = new Xml.Node (ns, n);
76 public Xml.Node* mungeNode()
80 if (this.parent == null) {
82 this.doc = new Xml.Doc("1.0");
84 var inf = this.create_element("interface");
85 this.doc->set_root_element(inf);
86 var req = this.create_element("requires");
87 req->set_prop("lib", "gtk+");
88 req->set_prop("version", "4.1");
93 var cls = this.node.fqn().replace(".", "");
95 var gdata = Palete.Gir.factoryFqn(this.project, this.node.fqn());
96 if (gdata == null || !gdata.inherits.contains("Gtk.Buildable")) {
98 //exception to the rule.. (must be buildable to work with glade?
99 case "GtkColumnViewColumn":
100 case "GtkNotebookPage":
106 if (gdata.inherits.contains("Gtk.Native")&& !is_top) {
109 // what namespaces are supported
110 switch(this.node.NS) {
113 case "Adw": // works if you call adw.init() in main!
121 if (gdata.fqn() == ("Gtk.ListStore")) {
125 // <object class="GtkNotebookPage">
126 // <property name="tab-expand">1</property>
127 // <property name="child">
128 // <property name="label">
129 // should really use GXml...
130 var obj = this.create_element("object");
131 //var id = this.node.uid();
132 var skip_props = false;
133 if (gdata.inherits.contains("Gtk.Native")) {
135 obj->set_prop("class", "GtkFrame");
140 obj->set_prop("class", "GtkBox");
141 this.addProperty(obj, "orientation", "horizontal");
146 obj->set_prop("class", cls);
151 obj->set_prop("id", "w" + this.node.oid.to_string());
152 this.parent->add_child(obj);
154 var props = Palete.Gir.factoryFqn(this.project, this.node.fqn()).props;
157 var pviter = props.map_iterator();
158 while (!skip_props && pviter.next()) {
160 //GLib.debug ("Check: " +cls + "::(" + pviter.get_value().propertyof + ")" + pviter.get_key() + " " );
162 // skip items we have already handled..
163 if (!this.node.has(pviter.get_key())) {
166 var k = pviter.get_key();
167 var prop = props.get(k);
168 var val = this.node.get(pviter.get_key()).strip();
169 // for Enums - we change it to lowercase, and remove all the previous bits.. hopefully might work.
170 if (prop.type.contains(".") && val.contains(".")) {
171 var typ = Palete.Gir.factoryFqn(this.project, prop.type);
172 if (typ.nodetype == "Enum") {
173 var bits = val.split(".");
174 val = bits[bits.length-1].down();
178 // value for model seems to cause problems...(it's ok as a property?)
182 this.addProperty(obj, k, val);
192 pack = this.packString();
198 var left = 0, top = 0, cols = 1;
199 if (cls == "GtkGrid") {
200 var colval = this.node.get_prop("* columns");
201 GLib.debug("Columns %s", colval == null ? "no columns" : colval.val);
202 if (colval != null) {
203 cols = int.parse(colval.val);
206 var items = this.node.readItems();
207 for (var i = 0; i < items.size; i++ ) {
208 var cn = items.get(i);
210 var childname = "child";
212 if (cn.has("* prop")) { // && cn.get_prop("* prop").val == "child") {
213 childname = "property";
214 pname = cn.get_prop("* prop").val;
217 var child = this.create_element(childname);
219 child->set_prop("name", pname);
222 if ((cls == "GtkWindow" || cls == "GtkApplicationWindow") && cn.fqn() == "Gtk.HeaderBar") {
223 child->set_prop("type", "label");
227 var sub_obj = this.mungeChild(cn, child);
228 if (sub_obj == null) {
231 if (cls == "GtkGrid") {
232 this.addGridAttach(sub_obj, left, top);
245 if (child->child_element_count() < 1) {
248 obj->add_child(child);
256 void addProperty(Xml.Node* obj, string k, string val)
258 var domprop = this.create_element("property");
259 domprop->set_prop("name", k);
260 domprop->add_child(new Xml.Node.text(val));
261 obj->add_child(domprop);
263 void addGridAttach(Xml.Node* obj, int left, int top)
265 var layout = this.create_element("layout");
266 this.addProperty(layout, "column", left.to_string());
267 this.addProperty(layout, "row", top.to_string());
268 obj->add_child(layout);