{
"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",
"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 ",
"}"
],
"| 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 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);",
" // 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);",
" ",
"}",
""
]
}
],
"name" : "WindowLeftProps"
}