{ "build_module" : "builder", "gen_extended" : false, "items" : [ { "# JsRender.JsRender file" : "", "# JsRender.Node node" : "", "# Xcls_MainWindow main_window" : "null", "# bool allow_edit" : false, "$ homogeneous" : "false ", "$ xns" : "Gtk", "@ bool stop_editor" : "()", "@ void changed" : "()", "@ void show_add_props" : "(string type)", "@ void show_editor" : "(JsRender.JsRender file, JsRender.Node node, JsRender.NodeProp prop)", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "bool hexpand" : true, "bool loading" : false, "bool vexpand" : true, "id" : "LeftProps", "int last_error_counter" : "-1", "items" : [ { "$ xns" : "Gtk", "Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "bool hexpand" : true, "items" : [ { "$ xns" : "Gtk", "int margin_end" : 5, "int margin_start" : 5, "string label" : "Add:", "xtype" : "Label" }, { "$ tooltip_text" : "\"Add Property\"", "$ xns" : "Gtk", "bool always_show_image" : true, "bool hexpand" : true, "listeners" : { "clicked" : [ " ( ) => {", " ", " _this.main_window.windowstate.showProps(", " \t_this.view.el, ", " \t\tJsRender.NodePropType.PROP", "\t);", " ", "}" ] }, "string icon_name" : "format-justify-left", "string label" : "Property", "xtype" : "Button" }, { "$ tooltip_text" : "\"Add Event Code\"", "$ xns" : "Gtk", "bool always_show_image" : true, "bool hexpand" : true, "listeners" : { "clicked" : [ " ( ) => {", " ", " ", " _this.main_window.windowstate.showProps(", " \t\t_this.view.el, ", " \t\tJsRender.NodePropType.LISTENER", "\t);", "", " ", "}" ] }, "string icon_name" : "appointment-new", "string label" : "Event", "xtype" : "Button" }, { "$ xns" : "Gtk", "bool always_show_image" : true, "bool hexpand" : true, "items" : [ { "$ xns" : "Gtk", "* pack" : false, "bool autohide" : true, "id" : "AddPropertyPopup", "items" : [ { "$ xns" : "Gtk", "* prop" : "child", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", "label" : "id: _this.{ID} (Vala)", "listeners" : { "clicked" : [ " () => {", " \t_this.AddPropertyPopup.el.hide();", " \t// is this userdef or special??", " \tvar add = new JsRender.NodeProp.prop(\"id\");", " \tif (_this.node.has_prop_key(add)) {", "\t \treturn;", " \t}", " \t", " \t_this.node.add_prop( add );", " \t", " \t_this.view.editProp( add );", " \t", "\t", "}" ] }, "tooltip_markup" : "Using _this.{ID} will map to this element", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "pack: Pack method (Vala)", "listeners" : { "clicked" : [ " ( ) => {", " ", "", "\t_this.AddPropertyPopup.el.hide();", " \t// is this userdef or special??", " \tvar add = new JsRender.NodeProp.special(\"pack\", \"add\");", " \tif (_this.node.has_prop_key(add)) {", "\t \treturn;", " \t}", " \t", " \t_this.node.add_prop( add );", " \t", " \t_this.view.editProp( add );", " \t", "", "}" ] }, "tooltip_markup" : "how to pack this element onto parent, (method, 2nd arg, 3rd arg) .. the 1st argument is filled by the element", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "ctor: Alterative to default contructor (Vala)", "listeners" : { "clicked" : [ " ( ) => {", " ", " _this.AddPropertyPopup.el.hide();", " \t// is this userdef or special??", " \tvar add = new JsRender.NodeProp.special(\"ctor\");", " \tif (_this.node.has_prop_key(add)) {", "\t \treturn;", " \t}", " \t", " \t_this.node.add_prop( add );", " \t", " \t_this.view.editProp( add );", " \t", "}" ] }, "tooltip_markup" : [ "eg. ", "", "new Clutter.Image.from_file(.....)" ], "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "init: initialziation code (vala)", "listeners" : { "clicked" : [ " ( ) => {", " ", " _this.AddPropertyPopup.el.hide();", " \t// is this userdef or special??", " \tvar add = new JsRender.NodeProp.special(\"init\",\"{\\n\\n}\\n\" ) ;", " \tif (_this.node.has_prop_key(add)) {", "\t \treturn;", " \t}", " \t", " \t_this.node.add_prop( add );", " \t", " \t_this.view.editProp( add );", "}" ] }, "tooltip_markup" : "This code is called after the ctor", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "cms-id: (Roo JS/Pman library)", "listeners" : { "clicked" : [ " () => {", " ", " _this.AddPropertyPopup.el.hide();", " \t// is this userdef or special??", " \tvar add = new JsRender.NodeProp.prop(\"cms-id\",\"string\", \"\" ) ;", " \tif (_this.node.has_prop_key(add)) {", "\t \treturn;", " \t}", " \t", " \t_this.node.add_prop( add );", " \t", " \t_this.view.editProp( add );", " ", "}" ] }, "tooltip_markup" : [ "set the cms-id for this element, when converted to javascript, the html value will be wrapped with Pman.Cms.content({cms-id},{original-html})", "" ], "xtype" : "Button" }, { "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "$ xns" : "Gtk", "xtype" : "Separator" }, { "$ xns" : "Gtk", "label" : "String", "listeners" : { "clicked" : [ "(self) => {", " _this.AddPropertyPopup.el.hide();", "\t_this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"\", \"string\", \"\") ,", "\t\t-1, ", "\t\ttrue", "\t);", " ", "}" ] }, "tooltip_markup" : "Add a user defined string property", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Number", "listeners" : { "clicked" : [ " ( ) =>{", " _this.AddPropertyPopup.el.hide();", " ", " _this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"\", \"int\", \"0\") ,", "\t\t-1, ", "\t\ttrue", "\t);", " ", "}" ] }, "tooltip_markup" : "Add a user defined number property", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Boolean", "listeners" : { "clicked" : [ " ( ) =>{", " ", " \t _this.AddPropertyPopup.el.hide();", " _this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"\", \"bool\", \"true\") ,", "\t\t-1, ", "\t\ttrue", "\t); ", " ", "}" ] }, "tooltip_markup" : "Add a user defined boolean property", "xtype" : "Button" }, { "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "$ xns" : "Gtk", "xtype" : "Separator" }, { "$ xns" : "Gtk", "label" : "Javascript Function", "listeners" : { "clicked" : [ " ( ) =>{", " _this.AddPropertyPopup.el.hide(); ", " _this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.jsmethod(\"\") ,", "\t\t-1, ", "\t\ttrue", "\t);", "", " ", "}" ] }, "tooltip_markup" : "Add a user function boolean property", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Vala Method", "listeners" : { "clicked" : [ " ( ) =>{", "_this.AddPropertyPopup.el.hide();", " _this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.valamethod(\"\") ,", "\t\t-1, ", "\t\ttrue", "\t); ", "}" ] }, "tooltip_markup" : "Add a user function boolean property", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Vala Signal", "listeners" : { "clicked" : [ " ( ) =>{", " _this.AddPropertyPopup.el.hide();", " _this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.sig(\"\" ) ,", "\t\t-1, ", "\t\ttrue", "\t); ", "}" ] }, "tooltip_markup" : "Add a vala signal", "xtype" : "Button" }, { "$ Gtk.Orientation orientation" : "Gtk.Orientation.HORIZONTAL", "$ xns" : "Gtk", "xtype" : "Separator" }, { "$ xns" : "Gtk", "label" : "Flexy - If", "listeners" : { "clicked" : [ " ( ) =>{", " \t_this.AddPropertyPopup.el.hide();", " \t_this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"flexy:if\", \"string\", \"value_or_condition\") ,", "\t\t-1, ", "\t\ttrue", "\t);", "", "", "}" ] }, "tooltip_markup" : "Add a flexy if (for HTML templates)", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Flexy - Include", "listeners" : { "clicked" : [ " ( ) =>{", " \t_this.AddPropertyPopup.el.hide();", " \t_this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"flexy:include\", \"string\", \"name_of_file.html\") ,", "\t\t-1, ", "\t\ttrue", "\t);", "", " ", "}" ] }, "tooltip_markup" : "Add a flexy include (for HTML templates)", "xtype" : "Button" }, { "$ xns" : "Gtk", "label" : "Flexy - Foreach", "listeners" : { "clicked" : [ " ( ) =>{", " \t_this.AddPropertyPopup.el.hide();", " \t_this.view.popover.show(", "\t\t_this.view.el, ", "\t\t_this.node, ", "\t\t new JsRender.NodeProp.prop(\"flexy:if\", \"string\", \"value_or_condition\") ,", "\t\t-1, ", "\t\ttrue", "\t);", " ", "}" ] }, "tooltip_markup" : "Add a flexy include (for HTML templates)", "xtype" : "Button" } ], "xtype" : "Box" } ], "xtype" : "Popover" } ], "listeners" : { "clicked" : [ "( ) => {", " //_this.before_edit();", " ", " ", " var p = _this.AddPropertyPopup;", " ", " //\tGtk.Allocation rect;", "\t//this.el.get_allocation(out rect);", "\tif (p.el.parent == null) {", "\t\t p.el.set_parent(this.el);", "\t }", " //p.el.set_pointing_to(rect);", "\tp.el.show();", "\tp.el.set_position(Gtk.PositionType.BOTTOM);", "\tp.el.autohide = true;", " return;", "", "}", "" ] }, "string icon_name" : "list-add", "string label" : "Other", "xtype" : "Button" } ], "xtype" : "Box" }, { "# bool editing" : false, "$ shadow_type" : "Gtk.ShadowType.IN", "$ xns" : "Gtk", "* init" : [ " {", " ", " this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);", "}", "" ], "bool hexpand" : true, "bool vexpand" : true, "id" : "EditProps", "items" : [ { "$ enable_tree_lines" : true, "$ headers_visible" : true, "$ xns" : "Gtk", "* init" : [ "{", " ", " \tthis.css = new Gtk.CssProvider();", "\t ", "\t\tthis.css.load_from_string(\"", "#leftprops-view { font-size: 12px;}", "\t ", "#leftprops-view dropdown button { ", "\t\t\tmin-height: 16px;\t\t\t ", "\t\t\toutline-offset : 0;", "\t\t}", "#leftprops-view cell dropdown label {", " \t\tpadding-top:0px;", "\t\tpadding-bottom:0px;", "}", "#leftprops-view cell { ", " \t\tpadding-top:2px;", "\t\tpadding-bottom:2px;", "\t\t}", "#leftprops-view cell label, #leftprops-view cell editablelable {", " \t\tpadding-top:4px;", "\t\tpadding-bottom:4px;", "}\");", " ", "\t\tGtk.StyleContext.add_provider_for_display(", "\t\tthis.el.get_display(),", "\t\tthis.css,", "\t\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION", "\t);", "\t\t", " ", "}", "" ], "* pack" : "set_child", "Gtk.CssProvider css" : "", "Xcls_PopoverProperty popover" : "null", "bool hexpand" : true, "bool show_row_separators" : true, "bool single_click_activate" : false, "bool vexpand" : true, "id" : "view", "items" : [ { "$ xns" : "Gtk", "* pack" : false, "id" : "deletemenu", "items" : [ { "$ xns" : "Gtk", "* prop" : "child", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", "listeners" : { "clicked" : [ "( ) => {", "\t", "", "\tvar n = (JsRender.NodeProp) _this.selmodel.el.selected_item;", "", "\t_this.deletemenu.el.hide();", "\t_this.node.remove_prop(n);", "}", "" ] }, "string label" : "Delete", "xtype" : "Button" } ], "xtype" : "Box" } ], "xtype" : "Popover" }, { "$ xns" : "Gtk", "listeners" : { "pressed" : [ "(n_press, in_x, in_y) => {", "", "\tGLib.debug(\"Prssed %d\", (int) this.el.get_current_button());", "\t", "\tvar col = _this.view.getColAt(in_x, in_y);", "\tif (col != 0) {", "\t\treturn;", "\t}", "\tstring pos;", "\tvar row = _this.view.getRowAt(in_x, in_y, out pos);", "\t", "\tif (row < 0) {", "\t\treturn;", "", "\t}", "\tGLib.debug(\"hit row %d\", row);", "\tvar prop = _this.selmodel.getPropAt(row);", "\t_this.selmodel.selectProp(prop);", "", "\t//var point_at = _this.view.getWidgetAtRow(row);", "\t", "\t \t// need to shift down, as ev.y does not inclucde header apparently..", " \t// or popover might be trying to do a central?", "//\t _this.view.editPropertyDetails(prop, (int) in_y + 12); ", " \t _this.stop_editor();", " _this.view.popover.show(", " \t\t\t_this.view.el, ", " \t\t\t_this.node, prop, ", "\t\t (int)in_y);", " ", " ", " ", "}", "" ] }, "xtype" : "GestureClick" }, { "$ xns" : "Gtk", "listeners" : { "pressed" : [ "(n_press, in_x, in_y) => {", "", "\t", "\t ", "\tstring pos;", "\tvar row = _this.view.getRowAt(in_x, in_y, out pos);", "\t", "\tif (row < 0) {", "\t\treturn;", "", "\t}", "\t", "\t_this.stop_editor();", "\tGLib.debug(\"hit row %d\", row);", "\tvar prop = _this.selmodel.getPropAt(row);", "\t_this.selmodel.selectProp(prop);", "\t", "\t", "\t", "\tGLib.debug(\"Prssed %d\", (int) this.el.get_current_button());", "\t//_this.deletemenu.el.set_parent(_this.view.el);", "\tif (_this.deletemenu.el.parent == null) {", "\t\t_this.deletemenu.el.set_parent(_this.main_window.el);", "\t}", "\t", "\t", "\t ", "\t_this.deletemenu.el.set_offset(", "\t\t\t(int)in_x - _this.view.el.get_width() ,", "\t\t\t(int)in_y - _this.view.el.get_height()", "\t\t);", "\t_this.deletemenu.el.set_position(Gtk.PositionType.BOTTOM); ", " _this.deletemenu.el.popup();", " ", "}", "" ] }, "uint button" : 3, "xtype" : "GestureClick" }, { "$ xns" : "Gtk", "* prop" : "model", "bool can_unselect" : true, "id" : "selmodel", "items" : [ { "$ xns" : "GLib", "* ctor" : "new GLib.ListStore(typeof(JsRender.NodeProp))", "* prop" : "model", "id" : "model", "xtype" : "ListStore" } ], "xtype" : "SingleSelection", "| JsRender.NodeProp getPropAt" : [ "(uint row) {", "", "\treturn (JsRender.NodeProp) this.el.get_item(row);", "", "\t ", "}" ], "| int propToRow" : [ "(JsRender.NodeProp prop) {", "\tfor (var i = 0 ; i < this.el.n_items; i++) {", "\t\tvar r = (JsRender.NodeProp)this.el.get_item(i);", "\t\tif (r.equals(prop)) {", "\t\t\treturn i;", "\t\t\t", "\t\t}", "\t}", "\treturn -1;", "\t ", "}" ], "| void selectProp" : [ "(JsRender.NodeProp prop) {", "\tfor (var i = 0 ; i < this.el.n_items; i++) {", "\t\tvar r = (JsRender.NodeProp)this.el.get_item(i);", "\t\tif (r.equals(prop)) {", "\t\t\tthis.el.selected = i;", "\t\t\treturn;", "\t\t}", "\t}", "\t ", "}" ], "| void startEditing" : [ "(JsRender.NodeProp prop) {", "\t// should we call select?? - caller does int (from windowstate)", "\t", "}" ] }, { "$ xns" : "Gtk", "* pack" : "append_column", "bool expand" : true, "bool resizable" : true, "id" : "keycol", "items" : [ { "$ xns" : "Gtk", "* prop" : "factory", "listeners" : { "bind" : [ "(listitem) => {", " var lb = (Gtk.Label) ((Gtk.ListItem)listitem).get_child();", " var item = (JsRender.NodeProp) ((Gtk.ListItem)listitem).get_item();", "", "", "item.bind_property(\"to_display_name_prop\",", " lb, \"label\",", " GLib.BindingFlags.SYNC_CREATE);", "item.bind_property(\"to_tooltip_name_prop\",", " lb, \"tooltip_markup\",", " GLib.BindingFlags.SYNC_CREATE);", "// was item (1) in old layout", " ", "", "}", "" ], "setup" : [ "(listitem) => {", "\tvar lbl = new Gtk.Label(\"\");", " \t((Gtk.ListItem)listitem).set_child(lbl);", " \tlbl.justify = Gtk.Justification.LEFT;", " \tlbl.xalign = 1;", " \tlbl.use_markup = true;", "\tlbl.ellipsize = Pango.EllipsizeMode.START;", " \t/*lbl.changed.connect(() => {", "\t\t// notify and save the changed value...", "\t \t//var prop = (JsRender.NodeProp) ((Gtk.ListItem)listitem.get_item());", " ", " //prop.val = lbl.text;", " //_this.updateIter(iter,prop);", " _this.changed();", "\t});", "\t*/", "\t((Gtk.ListItem)listitem).activatable = true;", "}", "" ] }, "xtype" : "SignalListItemFactory" } ], "title" : "Property", "xtype" : "ColumnViewColumn" }, { "$ xns" : "Gtk", "* pack" : "append_column", "bool expand" : true, "bool resizable" : true, "id" : "valcol", "items" : [ { "$ xns" : "Gtk", "* prop" : "factory", "bool is_setting" : false, "listeners" : { "bind" : [ "(listitem) => {", "\t this.is_setting = true;", "", "", "\tvar bx = (Gtk.Box) ((Gtk.ListItem)listitem).get_child();", " ", "\t", "\t", "\t", "\tvar elbl = (Gtk.EditableLabel)bx.get_first_child();", "\tvar lbl = (Gtk.Label) elbl.get_next_sibling();", "\tvar cb = (Gtk.DropDown) lbl.get_next_sibling();", "\t// decide if it's a combo or editable text..", "\tvar model = (Gtk.StringList) cb.model;", " ", "\telbl.hide();", "\tlbl.hide();", "\tcb.hide();", "\t", "\tvar prop = (JsRender.NodeProp) ((Gtk.ListItem)listitem).get_item();", "\t//GLib.debug(\"prop = %s\", prop.get_type().name());", "\t//GLib.debug(\"prop.val = %s\", prop.val);", "\t//GLib.debug(\"prop.key = %s\", prop.to_display_name());", "\t ", " var use_textarea = prop.useTextArea();", " ", " ", " var pal = _this.file.project.palete;", " ", " string[] opts;", " var has_opts = pal.typeOptions(_this.node.fqn(), prop.name, prop.rtype, out opts);", " ", " if (!has_opts && prop.ptype == JsRender.NodePropType.RAW) {", " \tuse_textarea = true;", " }", " ", " ", " if (use_textarea) {", " \tprop.bind_property(\"val_short\",", " lbl, \"label\",", " GLib.BindingFlags.SYNC_CREATE);", " prop.bind_property(\"val_tooltip\",", " lbl, \"tooltip_markup\",", " GLib.BindingFlags.SYNC_CREATE);", " lbl.show();", "\t\tthis.is_setting = false; ", " return;", " \t", " }", " ", " ", " ", " ", " ", " // others... - fill in options for true/false?", " // GLib.debug (ktype.up());", " if (has_opts) {", "\t", "\t\twhile(model.get_n_items() > 0) {", "\t\t\tmodel.remove(0);", "\t\t}", "\t\tcb.show();", " \t\t// can not remove - hopefully always empty.", "\t\tvar sel = -1;", "\t\tfor(var i = 0; i < opts.length; i ++) {", "\t\t\tmodel.append( opts[i]);", "\t\t\t// not sure this is a great idea... ", "\t\t\tif (opts[i].down() == prop.val.down()) {", "\t\t\t\tsel = i;", "\t\t\t}", "\t\t}", "\t\tGLib.debug(\"Set selected item to %d\", sel);", "\t\tcb.set_selected(sel > -1 ? sel : Gtk.INVALID_LIST_POSITION); ", "\t\tthis.is_setting = false; ", "\t\treturn ;", " }", " ", "\t// see if type is a Enum.", "\t// triggers a changed event", " ", "\telbl.set_text(prop.val);", " ", "\telbl.show();", "\tthis.is_setting = false; \t\t ", "\t", "\t", "\t", " ", "", "}", "" ], "setup" : [ "(listitem) => {", "\tvar hb = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);", "\tvar elbl = new Gtk.EditableLabel(\"\");", "\telbl.hexpand = true;", "\thb.append(elbl);", "\tvar lbl = new Gtk.Label(\"\");", "\thb.append(lbl);", "\tlbl.hexpand = true;", "\tlbl.use_markup = true;", "\tlbl.xalign =0;", "\tlbl.ellipsize = Pango.EllipsizeMode.END;", "\tvar cb = new Gtk.DropDown(new Gtk.StringList({}), null);", "\tcb.hexpand = true;", " ", "\thb.append(cb);", "\t((Gtk.ListItem)listitem).set_child(hb);", "\t ", "\t var ef = new Gtk.EventControllerFocus();", "\t ef.enter.connect(() => {", " \t\t _this.stop_editor();", " \t\t var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();", "\t\t _this.selmodel.selectProp(prop);\t\t", "\t });", "\t elbl.add_controller(ef);", "\t ", "\t ", "\t // dropdown??? - stop editing, and highliht node", "\t var tb = (Gtk.ToggleButton) cb.get_first_child();", "\t tb.clicked.connect(() => {", "\t\t var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();", "\t\t\t", "\t \t _this.stop_editor();", "\t \t _this.selmodel.selectProp(prop);", "\t \t ", "\t });", " \telbl.changed.connect(() => {", "\t\t// notify and save the changed value...", "\t \t", " //_this.updateIter(iter,prop);", " // this should happen automatically", " ", " if (!_this.loading && !this.is_setting) {", "\t\t var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();", "\t\t\t ", "\t\t ", "\t\t prop.val = elbl.text;", " \t GLib.debug(\"calling changed\");", "\t _this.changed();", "\t ", " }", " ", "\t});", "\t", "\t", "\tcb.notify[\"selected\"].connect(() => {", "\t\t// dropdown selection changed.", "\t\t", "\t\t", "\t\t", " //_this.updateIter(iter,prop);", " if (!_this.loading && !this.is_setting) {", "\t\t var prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();", "\t\t var model = (Gtk.StringList)cb.model;", "\t\t prop.val = model.get_string(cb.selected);", "\t\t GLib.debug(\"property set to %s\", prop.val);", " \tGLib.debug(\"calling changed\");", "\t _this.changed();", "\t ", " }", " ", "\t\t", "\t});", "\tvar gc = new Gtk.GestureClick();", "\tlbl.add_controller(gc);", "\tgc.pressed.connect(() => {", "\t \tvar prop = (JsRender.NodeProp)((Gtk.ListItem)listitem).get_item();", "\t\t _this.stop_editor();", "\t _this.show_editor(_this.file, prop.parent, prop);", "\t});", "\t ", "\t", "\t", "}", "" ] }, "xtype" : "SignalListItemFactory" } ], "title" : "Value", "xtype" : "ColumnViewColumn" }, { "$ xns" : "Gtk", "* pack" : false, "id" : "ContextMenu", "items" : [ { "$ xns" : "Gtk", "* prop" : "child", "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL", "int spacing" : 0, "items" : [ { "$ xns" : "Gtk", "label" : "Delete", "listeners" : { "activate" : [ " ( ) =>{", "\t_this.deleteSelected();", "\t", "}" ] }, "xtype" : "Button" } ], "xtype" : "Box" } ], "xtype" : "Popover" } ], "string name" : "leftprops-view", "xtype" : "ColumnView", "| Gtk.Widget? getWidgetAtRow" : [ "(uint row) {", "/*", " \t", "from \thttps://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465", " \tvar colview = gesture.widget;", " \tvar line_no = check_list_widget(colview, x,y);", " if (line_no > -1) {", " \t\tvar item = colview.model.get_item(line_no);", " \t\t ", " \t}", " \t*/", "\t\tGLib.debug(\"Get Widget At Row %d\", (int)row);", " var child = this.el.get_first_child(); ", " \tvar line_no = -1; ", " \tvar reading_header = true;", "", " \twhile (child != null) {", "\t\t\tGLib.debug(\"Got %s\", child.get_type().name());", " \t if (reading_header) {", "\t\t\t ", "\t\t\t ", "\t\t\t\tif (child.get_type().name() != \"GtkColumnListView\") {", "\t\t\t\t\tchild = child.get_next_sibling();", "\t\t\t\t\tcontinue;", "\t\t\t\t}", "\t\t\t\tchild = child.get_first_child(); ", "\t\t\t\treading_header = false;", "\t\t\t\tcontinue;", "\t }", "\t\t if (child.get_type().name() != \"GtkColumnViewRowWidget\") {", " \t\t child = child.get_next_sibling();", " \t\t continue;", "\t\t }", "\t\t line_no++;", "\t\t\tif (line_no == row) {", "\t\t\t\tGLib.debug(\"Returning widget %s\", child.get_type().name());", "\t\t\t return (Gtk.Widget)child;", "\t\t }", "\t child = child.get_next_sibling(); ", " \t}", "\t\tGLib.debug(\"Rturning null\");", " return null;", "", " }" ], "| int getColAt" : [ "(double x, double y) {", "/*", " \t", "from \thttps://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465", " \t ", " \t*/", "\t\t//Gtk.Allocation alloc = { 0, 0, 0, 0 };", " var child = this.el.get_first_child(); ", " \t ", " \tvar col = 0;", " \tvar offx = 0;", " \twhile (child != null) {", "\t\t\tGLib.debug(\"Got %s\", child.get_type().name());", "\t\t\t", "\t\t\tif (child.get_type().name() == \"GtkColumnViewRowWidget\") {", "\t\t\t\tchild = child.get_first_child();", "\t\t\t\tcontinue;", "\t\t\t}", "\t\t\t", "\t\t\t//child.get_allocation(out alloc);", "\t\t\tif (x < (child.get_width() + offx)) {", "\t\t\t\treturn col;", "\t\t\t}", "\t\t\toffx += child.get_width();", "\t\t\tcol++;", "\t\t\tchild = child.get_next_sibling();", "\t\t}", " \t ", "\t\t\t ", " return -1;", "", " }" ], "| int getRowAt" : [ "(double x, double in_y, out string pos) {", "", "", "\t ", "", "/*", " \t", "from \thttps://discourse.gnome.org/t/gtk4-finding-a-row-data-on-gtkcolumnview/8465", " \tvar colview = gesture.widget;", " \tvar line_no = check_list_widget(colview, x,y);", " if (line_no > -1) {", " \t\tvar item = colview.model.get_item(line_no);", " \t\t ", " \t}", " \t*/", " \t\t ", " \t\t", " \t\t//GLib.debug(\"offset = %d y = %d\", (int) voff, (int) in_y);", " \tvar y = in_y + _this.EditProps.el.vadjustment.value; ", " var child = this.el.get_first_child(); ", " \t//Gtk.Allocation alloc = { 0, 0, 0, 0 };", " \tvar line_no = -1; ", " \tvar reading_header = true;", " \tvar real_y = 0;", " \tvar header_height = 0;", " \tpos = \"none\";", " \tvar h = 0;", " \twhile (child != null) {", "\t\t\t//GLib.debug(\"Got %s\", child.get_type().name());", " \t if (reading_header) {", "\t\t\t\t", "", "\t\t\t\tif (child.get_type().name() != \"GtkColumnListView\") {", "\t\t\t h += child.get_height();", "\t\t\t\t\tchild = child.get_next_sibling();", "\t\t\t\t\tcontinue;", "\t\t\t\t}", "\t\t\t\t// should be columnlistview", "\t\t\t\tchild = child.get_first_child(); ", "\t\t\t GLib.debug(\"header height=%d\", h);", "\t\t\t\theader_height = h;", "\t\t\t\t", "\t\t\t\treading_header = false;", "\t\t\t\t", "\t }", "\t ", "\t\t if (child.get_type().name() != \"GtkColumnViewRowWidget\") {", " \t\t child = child.get_next_sibling();", " \t\t continue;", "\t\t }", "\t\t ", "\t\t \tif (y < header_height) {", "\t\t \treturn -1;", "\t \t}", "\t\t ", "\t\t line_no++;", "\t\t\tvar hh = child.get_height();", "\t\t\t//child.get_allocation(out alloc);", "\t\t\t//GLib.debug(\"got cell xy = %d,%d w,h= %d,%d\", alloc.x, alloc.y, alloc.width, alloc.height);", "\t\t\t//GLib.debug(\"row %d y= %d %s\", line_no, (int) (header_height + alloc.y),", "\t\t\t", "\t\t\t//\tchild.visible ? \"VIS\" : \"hidden\");", "", "\t\t if (y > (header_height + real_y) && y <= (header_height + real_y + hh) ) {", "\t\t \tif (y > ( header_height + real_y + (hh * 0.8))) {", "\t\t \t\tpos = \"below\";", "\t \t\t} else if (y > ( header_height + real_y + (hh * 0.2))) {", "\t \t\t\tpos = \"over\";", " \t\t\t} else {", " \t\t\t\tpos = \"above\";", "\t\t\t\t}", "\t\t \t GLib.debug(\"getRowAt return : %d, %s\", line_no, pos);", "\t\t\t return line_no;", "\t\t }", " ", "", "\t\t if (real_y + hh > y) {", "\t\t return -1;", "\t }", "\t real_y += hh;", "\t child = child.get_next_sibling(); ", " \t}", " return -1;", "", " }" ], "| void editProp" : [ "(JsRender.NodeProp prop) ", "{", "\tvar sm = _this.selmodel.el;", " ", "\t\tvar sr = -1;", "\t\tGLib.debug(\"finding node\");", "\t\t_this.selmodel.selectProp(prop);", "\t\t", "\t\tfor (var i = 0 ; i < sm.n_items; i++) {", "\t\t\tvar r = (JsRender.NodeProp)sm.get_item(i);", "\t\t\tif (r.equals(prop)) {", "\t\t\t\tsr = i;", "\t\t\t\tbreak;", "\t\t\t}", "\t\t}", "\t\tif (sr < 0) {", "\t\t\tGLib.debug(\"finding node - cant find it\");", "\t\t\t \t\t", "\t\t\treturn;", "\t\t}", "\t\tvar r = this.getWidgetAtRow(sr);", "\t\tGLib.debug(\"r = %s\", r.get_type().name());", "\t\tvar ca = r.get_first_child();", "\t\tvar ll = (Gtk.Label)ca.get_first_child();", "\t\tvar cb = ca.get_next_sibling();", "\t\tvar b = cb.get_first_child();", "\t\tvar e = (Gtk.EditableLabel) b.get_first_child();", "\t\tvar l = (Gtk.Label) e.get_next_sibling();", "\t\tvar d = (Gtk.DropDown) l.get_next_sibling();", "\t\t", "\t\tGLib.debug(\"row key = %s\", ll.label);", "\t\tif (e.get_visible()) {", "\t\t\t_this.stop_editor();", "\t\t\te.start_editing();", "\t\t\t//GLib.Timeout.add_once(500, () => {", "\t\t\t//\tvar st = (Gtk.Stack) e.get_first_child();", "\t\t\t//\tvar ed = (Gtk.Entry) st.get_visible_child();", "\t\t\t//\ted.grab_focus_without_selecting();", "\t\t\t//});", "\t\t\treturn;", "\t\t}", "\t\tif (d.get_visible()) {", "\t\t\t_this.stop_editor();", "\t\t\td.activate();", "\t\t\treturn;", "\t\t}", "\t\tif (l.get_visible()) {", "\t\t \t_this.stop_editor();", "\t \t_this.show_editor(_this.file, prop.parent, prop);", "\t\t", "\t\t}", "\t\t", "\t\t", "\t\t", "\t\t//gtkcolumnviewrowwidget", "\t\t // cell widet", "\t\t // cell widget", "\t\t \t// box", "\t\t \t\t// entry / label / dropdown", "\t\t \t\t", "\t\t ", "}" ] } ], "xtype" : "ScrolledWindow" } ], "xtype" : "Box", "| string keyFormat" : [ "(string val, string type) {", " ", " // Glib.markup_escape_text(val);", "", " if (type == \"listener\") {", " return \"\" + ", " GLib.Markup.escape_text(val) +", " \"\";", " }", " // property..", " if (val.length < 1) {", " return \"--empty--\";", " }", " ", " //@ = signal", " //$ = property with ", " //# - object properties", " //* = special", " // all of these... - display value is last element..", " var ar = val.strip().split(\" \");", " ", " ", " var dval = GLib.Markup.escape_text(ar[ar.length-1]);", " ", " ", " ", " ", " switch(val[0]) {", " case '@': // signal // just bold balck?", " if (dval[0] == '@') {", " dval = dval.substring(1);", " }", " ", " return @\"@ $dval\"; ", " case '#': // object properties?", " if (dval[0] == '#') {", " dval = dval.substring(1);", " }", " return @\"$dval\";", " case '*': // special", " if (dval[0] == '*') {", " dval = dval.substring(1);", " }", " return @\"$dval\"; ", " case '$':", " if (dval[0] == '$') {", " dval = dval.substring(1);", " }", " return @\"$dval\";", " case '|': // user defined methods", " if (dval[0] == '|') {", " dval = dval.substring(1);", " }", " return @\"$dval\";", " ", " ", " ", " default:", " return dval;", " }", " ", " ", "", "}" ], "| string keySortFormat" : [ "(string key) {", " // listeners first - with 0", " // specials", " if (key[0] == '*') {", " return \"1 \" + key;", " }", " // functions", " ", " var bits = key.split(\" \");", " ", " if (key[0] == '|') {", " return \"2 \" + bits[bits.length -1];", " }", " // signals", " if (key[0] == '@') {", " return \"3 \" + bits[bits.length -1];", " }", " ", " // props", " if (key[0] == '#') {", " return \"4 \" + bits[bits.length -1];", " }", " // the rest..", " return \"5 \" + bits[bits.length -1]; ", "", "", "", "}" ], "| void a_addProp" : [ " (JsRender.NodeProp prop) {", " // info includes key, val, skel, etype..", " //console.dump(info);", " //type = info.type.toLowerCase();", " //var data = this.toJS();", " ", " ", " if (prop.ptype == JsRender.NodePropType.LISTENER) {", " if (this.node.listeners.has_key(prop.name)) {", " return;", " }", " this.node.listeners.set(prop.name,prop);", " } else {", " assert(this.node != null);", " assert(this.node.props != null);", " if (this.node.props.has_key(prop.to_index_key())) {", " return;", " }", " this.node.props.set(prop.to_index_key(),prop);", " }", " ", " ", " // add a row???", " this.load(this.file, this.node);", " ", " ", " ", " ", " GLib.debug(\"trying to find new iter\");", " ", " ", " ", "}", "" ], "| void deleteSelected" : [ " () {", " ", "\t\treturn;", "\t\t/*", " ", " Gtk.TreeIter iter;", " Gtk.TreeModel mod;", " ", " var s = this.view.el.get_selection();", " s.get_selected(out mod, out iter);", " ", " ", " GLib.Value gval;", " mod.get_value(iter, 0 , out gval);", " var prop = (JsRender.NodeProp)gval;", " if (prop == null) {", "\t this.load(this.file, this.node); ", " \treturn;", " \t}", " \t// stop editor after fetching property - otherwise prop is null.", " this.stop_editor();", " ", " \t", " switch(prop.ptype) {", " case JsRender.NodePropType.LISTENER:", " this.node.listeners.unset(prop.to_index_key());", " break;", " ", " default:", " this.node.props.unset(prop.to_index_key());", " break;", " }", " this.load(this.file, this.node);", " ", " _this.changed();", " */", "}" ], "| void load" : [ "(JsRender.JsRender file, JsRender.Node? node) ", "{", "\t// not sure when to initialize this - we should do it on setting main window really. ", "\t", "\tthis.loading = true;", " if (this.view.popover == null) {", " \t\t this.view.popover = new Xcls_PopoverProperty();", " \t\t this.view.popover.mainwindow = _this.main_window;", "\t}", " ", " ", " if (this.node != null) {", " \tthis.node.dupeProps(); // ensures removeall will not do somethign silly", " \t", " }", " ", " GLib.debug(\"load leftprops\\n\");", "", " this.node = node;", " this.file = file;", " ", " ", " this.model.el.remove_all();", " ", " //this.get('/RightEditor').el.hide();", " if (node ==null) {", " return ;", " }", " node.loadProps(this.model.el); ", " ", " ", " //GLib.debug(\"clear selection\\n\");", " ", " \tthis.loading = false;", " this.selmodel.el.set_selected(Gtk.INVALID_LIST_POSITION);", " this.updateErrors();", " // clear selection?", " //this.model.el.set_sort_column_id(4,Gtk.SortType.ASCENDING); // sort by real key..", " ", " // this.view.el.get_selection().unselect_all();", " ", " // _this.keycol.el.set_max_width(_this.EditProps.el.get_allocated_width()/ 2);", " // _this.valcol.el.set_max_width(_this.EditProps.el.get_allocated_width()/ 2);", " ", "}", "" ], "| void removeErrors" : [ "() {", "\tvar child = this.view.el.get_first_child(); ", " ", "\tvar reading_header = true;", " ", "\twhile (child != null) {", "\t\tGLib.debug(\"Got %s\", child.get_type().name());", "\t ", "\t if (reading_header) {", "\t\t\t", "", "\t\t\tif (child.get_type().name() != \"GtkColumnListView\") {", "\t\t\t ", "\t\t\t\tchild = child.get_next_sibling();", "\t\t\t\tcontinue;", "\t\t\t}", "\t\t\t// should be columnlistview", "\t\t\tchild = child.get_first_child(); ", "\t\t ", "\t\t ", "\t\t\t", "\t\t\treading_header = false;", "\t\t\t ", "\t }", "\t ", "\t \tif (!child.has_css_class(\"node-err\")) {", "\t\t\tchild.remove_css_class(\"node-err\");", "\t\t}", "\t\tif (!child.has_css_class(\"node-warn\")) {", "\t\t\tchild.remove_css_class(\"node-warn\");", "\t\t}", "\t\t", "\t\tif (!child.has_css_class(\"node-depr\")) {", "\t\t\tchild.remove_css_class(\"node-depr\");", "\t\t}", "\t\t", " child = child.get_next_sibling(); ", "\t}", "\t//GLib.debug(\"Rturning null\");", " ", "}" ], "| void updateErrors" : [ "() {", "\tvar file = this.file;", "\tvar ar = file.getErrors();", "\tif (ar.size < 1) {", "\t\tthis.removeErrors();", "\t\tthis.last_error_counter = file.error_counter ;", "", "\t\treturn;", "\t}", " \tif (this.last_error_counter == file.error_counter) {", "\t\treturn;", "\t}", "\tthis.removeErrors();", "\t", "\tforeach(var diag in ar) { ", "\t", "\t\t ", "// print(\"get inter\\n\");", "\t var node= file.lineToNode( (int)diag.range.start.line) ;", "\t if (node == null || node.oid != this.node.oid) {", "\t \tcontinue;", " \t}", " \tvar prop = node.lineToProp( (int)diag.range.start.line) ;", " \t", " \tvar row = _this.selmodel.propToRow(prop);", " \tif (row < 0) {", " \t\tcontinue;", "\t\t}", " \tvar w = this.view.getWidgetAtRow(row);", " \tif (w == null) {", " \t\treturn;", "\t\t}", "\t \t\tvar ed = diag.category.down();", "\t\tif (ed != \"err\" && w.has_css_class(\"node-err\")) {", "\t\t\tcontinue;", "\t\t}", "\t\tif (ed == \"err\" && w.has_css_class(\"node-warn\")) {", "\t\t\tw.remove_css_class(\"node-warn\");", "\t\t}", "\t\tif (ed == \"err\" && w.has_css_class(\"node-depr\")) {", "\t\t\tw.remove_css_class(\"node-depr\");", "\t\t}", "\t\tif (!w.has_css_class(\"node-\"+ ed)) {", "\t\t\tw.add_css_class(\"node-\" + ed);", "\t\t}", "\t\t", "\t}", "\t", "}" ] } ], "name" : "WindowLeftProps" }