{
- "name" : "WindowLeftTree",
- "parent" : "",
- "title" : "",
- "path" : "/home/alan/gitlive/roobuilder/src/Builder4/WindowLeftTree.bjs",
- "permname" : "",
- "modOrder" : "",
"build_module" : "builder",
+ "gen_extended" : false,
"items" : [
{
- "| JsRender.Node? getActiveElement" : " () { // return path to actie node.\n\n var path = this.getActivePath();\n if (path.length < 1) {\n return null;\n }\n return _this.model.pathToNode(path);\n \n}\n",
- "id" : "WindowLeftTree",
+ "# Xcls_MainWindow? main_window" : "null",
+ "$ xns" : "Gtk",
"@ bool before_node_change" : "()",
- "$ shadow_type" : "Gtk.ShadowType.IN",
- "* init" : " this.el.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);\n \n",
- "| JsRender.JsRender getActiveFile" : "() {\n return this.main_window.windowstate.file;\n}\n",
- "* pack" : "add",
- "xtype" : "ScrolledWindow",
"@ void changed" : "()",
- "$ xns" : "Gtk",
- "@ void node_selected" : "(JsRender.Node? node, string source)",
- "# Xcls_MainWindow main_window" : "null",
- "| string getActivePath" : " () {\n \n var view = this.view.el;\n if (view.get_selection().count_selected_rows() < 1) {\n return \"\";\n }\n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n view.get_selection().get_selected(out mod, out iter);\n return mod.get_path(iter).to_string();\n}\n ",
+ "@ void node_selected" : "(JsRender.Node? node)",
+ "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+ "bool hexpand" : true,
+ "bool vexpand" : true,
+ "id" : "WindowLeftTree",
+ "int last_error_counter" : "-1",
"items" : [
{
- "listeners" : {
- "button_release_event" : "(ev) => { \n print(\"BUTTON UP\\n\");\n return false;\n}",
- "button_press_event" : " ( ev) => {\n //console.log(\"button press?\");\n \n print(\"BUTTON DOWN\\n\");\n \n this.lastEventSource = \"tree\";\n if (! _this.before_node_change() ) {\n \n return true;\n }\n \n\n \n if (ev.type != Gdk.EventType.BUTTON_PRESS || ev.button != 3) {\n //print(\"click\" + ev.type);\n return false;\n }\n Gtk.TreePath res;\n if (!_this.view.el.get_path_at_pos((int)ev.x,(int)ev.y, out res, null, null, null) ) {\n return true;\n }\n \n this.el.get_selection().select_path(res);\n \n //if (!this.get('/LeftTreeMenu').el) { \n // this.get('/LeftTreeMenu').init(); \n // }\n \n _this.LeftTreeMenu.el.set_screen(Gdk.Screen.get_default());\n _this.LeftTreeMenu.el.show_all();\n _this.LeftTreeMenu.el.popup(null, null, null, 3, ev.time);\n // print(\"click:\" + res.path.to_string());\n return true;\n}",
- "cursor_changed" : " ( ) => {\n\tprint(\"CURSOR CHANGED\\n\");\n\n if (this.blockChanges) { // probably not needed.. \n return ;\n }\n if (!_this.before_node_change( ) ) {\n\t this.blockChanges = true;\n\t this.el.get_selection().unselect_all();\n\t this.blockChanges = false;\n\t return;\n }\n if (_this.main_window.windowstate.file == null) {\n return;\n } \n \n //var render = this.get('/LeftTree').getRenderer(); \n print(\"LEFT TREE -> view -> selection changed called\\n\");\n \n \n // -- it appears that the selection is not updated.\n \n GLib.Timeout.add_full(GLib.Priority.DEFAULT,10 , () => {\n \n\n if (this.el.get_selection().count_selected_rows() < 1) {\n\n print(\"selected rows < 1\\n\");\n //??this.model.load( false);\n _this.node_selected(null, this.lastEventSource);\n \n return false ;\n }\n \n //console.log('changed');\n var s = this.el.get_selection();\n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n s.get_selected(out mod, out iter);\n \n \n // var val = \"\";\n GLib.Value value;\n _this.model.el.get_value(iter, 2, out value);\n _this.model.activePath = mod.get_path(iter).to_string();\n \n var node = (JsRender.Node)value.dup_object();\n _this.node_selected(node, this.lastEventSource);\n while (Gtk.events_pending()) {\n Gtk.main_iteration();\n }\n var cp = mod.get_path(iter);\n Gtk.TreePath sp, ep;\n this.el.get_visible_range(out sp, out ep);\n // if sp is before cp then retuns 1.\n // if cp is before ep then retuns 1.\n if (cp.compare(sp) >= 0 && ep.compare(cp) >=1) {\n return false;\n }\n \n \n \n this.el.scroll_to_cell(new Gtk.TreePath.from_string(_this.model.activePath), null, true, 0.1f,0.0f);\n \n return false;\n }); \n //_this.after_node_change(node);\n\n// _this.model.file.changed(node, \"tree\");\n \n //Seed.print( value.get_string());\n return ;\n \n}",
- "drag_begin" : "( ctx) => {\n\t//print('SOURCE: drag-begin');\n \n \n //this.targetData = \"\";\n \n // find what is selected in our tree...\n \n var s = _this.view.el.get_selection();\n if (s.count_selected_rows() < 1) {\n return;\n }\n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n s.get_selected(out mod, out iter);\n\n \n\n // set some properties of the tree for use by the dropped element.\n GLib.Value value;\n _this.model.el.get_value(iter, 2, out value);\n var tp = mod.get_path(iter).to_string();\n var data = (JsRender.Node)(value.dup_object());\n var xname = data.fqn();\n print (\"XNAME IS \" + xname+ \"\\n\");\n this.dragData = tp;\n this.dropList = _this.main_window.windowstate.file.palete().getDropList(xname);\n \n print (\"DROP LIST IS \" + string.joinv(\", \", this.dropList) + \"\\n\");\n \n\n // make the drag icon a picture of the node that was selected\n \n \n // by default returns the path..\n var path = _this.model.el.get_path(iter);\n\n \n var pix = this.el.create_row_drag_icon ( path);\n \n Gtk.drag_set_icon_surface (ctx, pix) ;\n \n return;\n}",
- "drag_end" : " (drag_context) => {\n\t//Seed.print('LEFT-TREE: drag-end');\n this.dragData = \"\";\n this.dropList = null;\n// this.targetData = \"\";\n this.highlightDropPath(\"\",0);\n// return true;\n}",
- "drag_motion" : " ( ctx, x, y, time) => {\n print(\"got drag motion\\n\");\n var src = Gtk.drag_get_source_widget(ctx);\n this.drag_x = x;\n this.drag_y = y; \n\n if (src != this.el) {\n \n \n \n // the point of this is to detect where an item could be dropped..\n print(\"requesting drag data\\n\");\n this.drag_in_motion = true;\n \n // request data that will be recieved by the recieve... \n Gtk.drag_get_data\n (\n this.el, // will receive 'drag-data-received' signal \n ctx, // represents the current state of the DnD \n Gdk.Atom.intern(\"STRING\",true), // the target type we want \n time // time stamp \n );\n return true;\n } \n\n\n print(\"action: %d\\n\", ctx.get_actions());\n //print(\"GETTING POS\");\n var targetData = \"\";\n\n Gtk.TreePath path;\n Gtk.TreeViewDropPosition pos;\n var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);\n\n // if there are not items in the tree.. the we have to set isOver to true for anything..\n var isEmpty = false;\n if (_this.model.el.iter_n_children(null) < 1) {\n print(\"got NO children?\\n\");\n isOver = true; //??? \n isEmpty = true;\n pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;\n }\n\n\n // ------------- a drag from self..\n\n\n //var action = Gdk.DragAction.COPY;\n // unless we are copying!!! ctl button..\n \n var action = (ctx.get_actions() & Gdk.DragAction.MOVE) > 0 ?\n Gdk.DragAction.COPY : Gdk.DragAction.MOVE ;\n // Gdk.DragAction.MOVE : Gdk.DragAction.COPY ;\n\n\n if (_this.model.el.iter_n_children(null) < 1) {\n // no children.. -- asume it's ok..\n \n targetData = \"|%d|\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n \n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0); \n Gdk.drag_status(ctx, action ,time);\n return true;\n \n // continue through to allow drop...\n\n } \n \n \n\n \n \n //print(\"ISOVER? \" + isOver);\n if (!isOver) {\n \n Gdk.drag_status(ctx, 0 ,time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0); \n return false;\n\n }\n \n // drag node is parent of child..\n //console.log(\"SRC TREEPATH: \" + src.treepath);\n //console.log(\"TARGET TREEPATH: \" + data.path.to_string());\n \n // nned to check a few here..\n //Gtk.TreeViewDropPosition.INTO_OR_AFTER\n //Gtk.TreeViewDropPosition.INTO_OR_BEFORE\n //Gtk.TreeViewDropPosition.AFTER\n //Gtk.TreeViewDropPosition.BEFORE\n \n // locally dragged items to not really use the \n var selection_text = this.dragData;\n \n \n \n if (selection_text == null || selection_text.length < 1) {\n //print(\"Error - drag selection text returned NULL\");\n Gdk.drag_status(ctx, 0 ,time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);\n return false;\n }\n \n \n // see if we are dragging into ourself?\n var target_path = path.to_string(); \n print (\"Drag %s onto %s--%d\\n \", selection_text, target_path, pos);\n \n // pos : 3 = ontop - 0 = after, 1 = before\n //print(\"target_path=\"+target_path);\n\n // \n if (selection_text == target_path) {\n print(\"self drag ?? == we should perhaps allow copy onto self..\\n\");\n \n Gdk.drag_status(ctx, 0 ,time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);\n return false;\n// -- fixme -- this is not really correct..\n\n }\n \n // check that \n //print(\"DUMPING DATA\");\n //console.dump(data);\n // path, pos\n \n //print(data.path.to_string() +' => '+ data.pos);\n \n // dropList is a list of xtypes that this node could be dropped on.\n // it is set up when we start to drag..\n \n \n targetData = _this.model.findDropNodeByPath( path.to_string(), this.dropList, pos);\n \n print(\"targetDAta: \" + targetData +\"\\n\");\n \n if (targetData.length < 1) {\n //print(\"Can not find drop node path\");\n \n Gdk.drag_status(ctx, 0, time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);\n return false;\n }\n \n var td_ar = targetData.split(\"|\");\n \n \n\n Gdk.drag_status(ctx, action ,time);\n this.highlightDropPath(td_ar[0], (Gtk.TreeViewDropPosition)int.parse(td_ar[1]));\n return true;\n \n \n}",
- "drag_data_get" : "( drag_context, data, info, time) => {\n \n \n //print(\"drag-data-get\");\n var s = this.el.get_selection();\n if (s.count_selected_rows() < 1) {\n data.set_text(\"\",0); \n print(\"return empty string - no selection..\");\n return;\n }\n \n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n \n s.get_selected(out mod, out iter);\n \n \n \n GLib.Value value;\n _this.model.el.get_value(iter, 2, out value);\n var ndata = (JsRender.Node)(value.dup_object());\n \n \n \n var tp = mod.get_path(iter).to_string();\n // by default returns the path..\n \n if ( info != Gdk.Atom.intern(\"STRING\",true) ) {\n tp = ndata.toJsonString();\n } \n \n //data.set_text(tp,tp.length); \n \n data.set (data.get_target (), 8, (uchar[]) tp.to_utf8 ());\n \n \n // print(\"return \" + tp);\n }",
- "key_press_event" : "(ev) => {\n print(\"KEY DOWN\\n\");\n return false;\n}",
- "key_release_event" : "(ev) => {\n print(\"KEY UP\\n\");\n return false;\n}\n",
- "drag_data_received" : " (ctx, x, y, sel, info, time) => {\n \n // THIS CODE ONLY RELATES TO drag or drop of \"NEW\" elements or \"FROM another tree..\"\n \n \n // print(\"Tree: drag-data-received\\n\");\n var selection_text = (string)sel.get_data();\n //print(\"selection_text= %s\\n\",selection_text);\n\n var is_drag = this.drag_in_motion;\n \n \n\n print(\"Is Drag %s\\n\", is_drag ? \"Y\": \"N\");\n var targetData = \"\";\n \n Gtk.TreePath path;\n Gtk.TreeViewDropPosition pos;\n var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);\n \n // if there are not items in the tree.. the we have to set isOver to true for anything..\n var isEmpty = false;\n if (_this.model.el.iter_n_children(null) < 1) {\n print(\"got NO children?\\n\");\n isOver = true; //??? \n isEmpty = true;\n pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;\n }\n \n \n //console.log(\"LEFT-TREE: drag-motion\");\n var src = Gtk.drag_get_source_widget(ctx);\n \n // a drag from self - this should be handled by drop and motion.\n if (src == this.el) {\n print(\"Source == this element should not happen.. ? \\n\");\n return;\n }\n //print(\"drag_data_recieved from another element\");\n \n \n \n \n if (selection_text == null || selection_text.length < 1 || !isOver) {\n // nothing valid foudn to drop...\n print(\"empty sel text or not over\");\n if (is_drag) {\n Gdk.drag_status(ctx, 0, time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);\n return;\n }\n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n // no drop action...\n return; \n \n }\n var dropNode = new JsRender.Node(); \n \n var dropNodeType = selection_text;\n var show_templates = true;\n // for drop\n if (dropNodeType[0] == '{') {\n var pa = new Json.Parser();\n try {\n pa.load_from_data(dropNodeType);\n } catch (Error e) {\n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n // no drop action...\n return; \n }\n \n dropNode.loadFromJson( pa.get_root().get_object(), 2);\n dropNodeType = dropNode.fqn();\n show_templates = false;\n \n \n } else {\n\n dropNode.setFqn(selection_text);\n }\n\n \n // dropList --- need to gather this ... \n print(\"get dropList for : %s\\n\",dropNodeType); \n var dropList = _this.main_window.windowstate.file.palete().getDropList(dropNodeType);\n \n print(\"dropList: %s\\n\", string.joinv(\" , \", dropList));\n \n // if drag action is link ... then we can drop it anywahere...\n if ((ctx.get_actions() & Gdk.DragAction.LINK) > 0) {\n // if path is null?? dragging into an empty tree?\n targetData = (path == null ? \"\" : path.to_string()) + \"|%d\".printf((int)pos);\n } else {\n \n \n targetData = _this.model.findDropNodeByPath( isEmpty ? \"\" : path.to_string(), dropList, pos);\n }\n \n \n \n print(\"targetDAta: \" + targetData +\"\\n\");\n \n if (targetData.length < 1) {\n \n // invalid drop path..\n if (this.drag_in_motion) {\n Gdk.drag_status(ctx, 0, time);\n this.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);\n return;\n }\n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n // no drop action...\n return;\n }\n // valid drop path..\n \n var td_ar = targetData.split(\"|\");\n \n \n if (this.drag_in_motion) { \n Gdk.drag_status(ctx, Gdk.DragAction.COPY ,time);\n\n this.highlightDropPath( td_ar[0] , (Gtk.TreeViewDropPosition)int.parse(td_ar[1]));\n return;\n }\n // continue on to allow drop..\n \n\n // at this point, drag is not in motion... -- as checked above... - so it's a real drop event..\n \n\n _this.model.dropNode(targetData, dropNode, show_templates);\n print(\"ADD new node!!!\\n\");\n \n ///Xcls_DialogTemplateSelect.singleton().show( _this.model.file.palete(), node);\n \n Gtk.drag_finish (ctx, false, false,time);\n \n \n \n \n \n}",
- "drag_drop" : " ( ctx, x, y, time) => {\n //Seed.print(\"TARGET: drag-drop\");\n \n \n var src = Gtk.drag_get_source_widget(ctx);\n \n if (src != this.el) {\n \n \n \n this.drag_in_motion = false; \n // request data that will be recieved by the recieve... \n Gtk.drag_get_data\n (\n this.el, // will receive 'drag-data-received' signal \n ctx, // represents the current state of the DnD \n Gdk.Atom.intern(\"application/json\",true), // the target type we want \n time // time stamp \n );\n\n \n // No target offered by source => error\n \n\n return false;\n }\n \n // handle drop around self..\n \n \n \n //print(\"GETTING POS\");\n var targetData = \"\";\n \n Gtk.TreePath path;\n Gtk.TreeViewDropPosition pos;\n var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);\n \n // if there are not items in the tree.. the we have to set isOver to true for anything..\n var isEmpty = false;\n if (_this.model.el.iter_n_children(null) < 1) {\n print(\"got NO children?\\n\");\n isOver = true; //??? \n isEmpty = true;\n pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;\n }\n \n \n \n //var action = Gdk.DragAction.COPY;\n // unless we are copying!!! ctl button..\n \n var action = (ctx.get_actions() & Gdk.DragAction.MOVE) > 0 ?\n Gdk.DragAction.COPY : Gdk.DragAction.MOVE ;\n // Gdk.DragAction.MOVE : Gdk.DragAction.COPY ;\n\n \n if (_this.model.el.iter_n_children(null) < 1) {\n // no children.. -- asume it's ok..\n \n targetData = \"|%d|\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n \n // continue through to allow drop...\n\n } else {\n \n \n \n \n \n //print(\"ISOVER? \" + isOver);\n if (!isOver) {\n \n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n return true; // not over apoint!?! - no action on drop or motion..\n }\n \n // drag node is parent of child..\n //console.log(\"SRC TREEPATH: \" + src.treepath);\n //console.log(\"TARGET TREEPATH: \" + data.path.to_string());\n \n // nned to check a few here..\n //Gtk.TreeViewDropPosition.INTO_OR_AFTER\n //Gtk.TreeViewDropPosition.INTO_OR_BEFORE\n //Gtk.TreeViewDropPosition.AFTER\n //Gtk.TreeViewDropPosition.BEFORE\n \n // locally dragged items to not really use the \n var selection_text = this.dragData;\n \n \n \n if (selection_text == null || selection_text.length < 1) {\n //print(\"Error - drag selection text returned NULL\");\n \n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n return true; /// -- fixme -- this is not really correct..\n } \n \n // see if we are dragging into ourself?\n print (\"got selection text of \" + selection_text);\n \n var target_path = path.to_string();\n //print(\"target_path=\"+target_path);\n\n // \n if (selection_text == target_path) {\n print(\"self drag ?? == we should perhaps allow copy onto self..\\n\");\n \n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n\n return true; /// -- fixme -- this is not really correct..\n\n }\n \n // check that \n //print(\"DUMPING DATA\");\n //console.dump(data);\n // path, pos\n \n //print(data.path.to_string() +' => '+ data.pos);\n \n // dropList is a list of xtypes that this node could be dropped on.\n // it is set up when we start to drag..\n \n \n targetData = _this.model.findDropNodeByPath( path.to_string(), this.dropList, pos);\n \n print(\"targetDAta: \" + targetData +\"\\n\");\n \n if (targetData.length < 1) {\n //print(\"Can not find drop node path\");\n \n Gtk.drag_finish (ctx, false, false, time); // drop failed..\n return true;\n }\n \n \n \n // continue on to allow drop..\n }\n // at this point, drag is not in motion... -- as checked above... - so it's a real drop event..\n\n\n var delete_selection_data = false;\n \n if (action == Gdk.DragAction.ASK) {\n /* Ask the user to move or copy, then set the ctx action. */\n }\n\n if (action == Gdk.DragAction.MOVE) {\n delete_selection_data = true;\n }\n \n // drag around.. - reorder..\n _this.model.moveNode(targetData, action);\n \n \n \n \n \n // we can send stuff to souce here...\n\n\n// do we always say failure, so we handle the reall drop?\n Gtk.drag_finish (ctx, false, false,time); //delete_selection_data, time);\n\n return true;\n \n \n \n \n \n \n}"
- },
- "# string dragData" : "",
- "# int drag_x" : "",
- "# string[] dropList" : "",
- "id" : "view",
- "gboolean headers_visible" : true,
- "# int drag_y" : "",
- "* init" : "{\n var description = new Pango.FontDescription();\n description.set_size(8000);\n this.el.override_font(description);\n\n var selection = this.el.get_selection();\n selection.set_mode( Gtk.SelectionMode.SINGLE);\n\n\n // is this really needed??\n /*\n this.selection.signal['changed'].connect(function() {\n\t _this.get('/LeftTree.view').listeners.cursor_changed.apply(\n\t _this.get('/LeftTree.view'), [ _this.get('/LeftTree.view'), '']\n\t );\n });\n */\n Gtk.drag_source_set (\n\t this.el, /* widget will be drag-able */\n\t Gdk.ModifierType.BUTTON1_MASK, /* modifier that will start a drag */\n\t BuilderApplication.targetList, /* lists of target to support */\n\t Gdk.DragAction.COPY | Gdk.DragAction.MOVE | Gdk.DragAction.LINK /* what to do with data after dropped */\n );\n\n // ?? needed??\n //Gtk.drag_source_add_text_targets(this.el); \n\n Gtk.drag_dest_set\n (\n this.el, /* widget that will accept a drop */\n Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT,\n BuilderApplication.targetList, /* lists of target to support */\n Gdk.DragAction.COPY | Gdk.DragAction.MOVE | Gdk.DragAction.LINK /* what to do with data after dropped */\n );\n\n //Gtk.drag_dest_set_target_list(this.el, Builder.Application.targetList);\n //Gtk.drag_dest_add_text_targets(this.el);\n}\n",
- "tooltip_column" : 1,
- "bool expand" : true,
- "* pack" : "add",
- "xtype" : "TreeView",
- "$ enable_tree_lines" : true,
- "$ headers_visible" : false,
- "bool button_is_pressed" : false,
- "| void highlightDropPath" : " ( string treepath, Gtk.TreeViewDropPosition pos) {\n\n // highlighting for drag/drop\n if (treepath.length > 0) {\n this.el.set_drag_dest_row( new Gtk.TreePath.from_string( treepath ), pos);\n } else {\n this.el.set_drag_dest_row(null, Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n }\n \n}",
- "$ string lastEventSource" : "\"\"",
- "# bool drag_in_motion" : "",
- "# bool blockChanges" : false,
"$ xns" : "Gtk",
- "| void setCursor" : "(string treepath, string sourceEvent) {\n\tthis.lastEventSource = sourceEvent;\n\t//this.blockChanges = true; << block changes prevents loading of 'node data' and firing of node_selected..\n this.el.set_cursor(new Gtk.TreePath.from_string(treepath), null, false); \n // fire node_selected..\n //this.blockChanges = false;\n\tthis.lastEventSource = \"\";\n}\n",
- "| void selectNode" : "(string treepath_str, string source) {\n\tthis.lastEventSource = source;\n //this.selection.select_path(new Gtk.TreePath.from_string( treepath_str));\n var tp = new Gtk.TreePath.from_string(treepath_str);\n \n this.el.set_cursor(tp, null, false); \n this.el.scroll_to_cell(tp, null, false, 0,0);\n}\n",
"items" : [
{
- "| string findDropNode" : " (string treepath_str, string[] targets) {\n\n // this is used by the dragdrop code in the roo version AFAIR..\n\n //var path = treepath_str.replace(/^builder-/, '');\n // treemap is depreciated... - should really check if model has any entries..\n\n if (this.el.iter_n_children(null) < 1) {\n //print(\"NO KEYS\");\n return \"|%d\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);\n }\n //print(\"FIND treepath: \" + path);\n //console.dump(this.treemap);\n \n //if (!treepath_str.match(/^builder-/)) {\n // return []; // nothing!\n //}\n if (targets.length > 0 && targets[0] == \"*\") {\n return treepath_str;\n }\n return this.findDropNodeByPath(treepath_str,targets, -1);\n}\n",
- "currentTree" : false,
- "id" : "model",
- "# DialogTemplateSelect template_select" : "null",
- "* init" : "print(\"model initialized\");\n\n",
- "| void loadFile" : "(JsRender.JsRender f) {\n //console.dump(f);\n this.el.clear();\n \n // needed???\n _this.main_window.windowstate.file = f;\n \n \n if (f.tree == null) {\n\t try {\n\t f.loadItems( );\n } catch (Error e) {\n \t\treturn;\n }\n }\n // if it's still null?\n if (f.tree == null) {\n return;\n }\n \n var o = new Gee.ArrayList<JsRender.Node>();\n o.add(f.tree);\n this.load(o,null);\n \n _this.view.el.expand_all();\n\n if (f.tree.items.size < 1) {\n // single item..\n \n //this.get('/Window.leftvpaned').el.set_position(80);\n // select first...\n _this.view.el.set_cursor( \n new Gtk.TreePath.from_string(\"0\"), null, false);\n \n \n } else {\n //this.get('/Window.leftvpaned').el.set_position(200);\n }\n \n return;\n \n \n}\n",
- "| void updateSelected" : "() {\n \n \n var s = _this.view.el.get_selection();\n \n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n \n \n \n if (!s.get_selected(out mod, out iter)) {\n return; // nothing seleted..\n }\n \n GLib.Value value;\n this.el.get_value(iter, 2, out value);\n var node = (JsRender.Node)(value.get_object());\n \n this.el.set(iter, 0, node.nodeTitle(),\n 1, node.nodeTip(), -1\n );\n}\n",
- "* pack" : "set_model",
- "xtype" : "TreeStore",
- "| string findDropNodeByPath" : " (string treepath_str, string[] targets, int in_pref = -1) {\n\n var path = treepath_str; // dupe it..\n \n \n // pref : 3 = ontop - 0 = after, 1 = before\n int pref = in_pref < 0 ? Gtk.TreeViewDropPosition.INTO_OR_AFTER : in_pref;\n \n var last = \"\";\n \n //console.dump(this.treemap);\n \n print(\"findDropNodeByPath : got path length %d / %s\\n\", path.length, path);\n \n if (path.length == 0) {\n // top drop. // just return empty..\n return \"|%d\".printf((int)pref) ;\n \n }\n \n \n while (path.length > 0) {\n \n if (path.length == treepath_str.length && pref != Gtk.TreeViewDropPosition.INTO_OR_AFTER) {\n if (path.last_index_of(\":\") < 0 ) {\n return \"\";\n }\n path = path.substring(0, path.last_index_of(\":\"));\n last = treepath_str;\n print(\"DROP before or after : using %s\\n\",path);\n continue;\n }\n \n //print(\"LOOKING FOR PATH: \" + path);\n var node_data = this.pathToNode(path);\n \n if (node_data == null) {\n print(\"node not found\");\n return \"\";\n }\n \n var xname = node_data.fqn();\n var match = \"\";\n var prop = \"\";\n \n for (var i =0; i < targets.length; i++) {\n var tg = targets[i];\n if ((tg == xname) ) {\n match = tg;\n break;\n }\n // if target is \"xxxx:name\"\n if (tg.contains(xname +\":\")) {\n match = tg;\n var ar = tg.split(\":\");\n prop = ar[1];\n break;\n }\n }\n \n if (match.length > 0) {\n if (last.length > 0) { // pref is after/before..\n // then it's after last\n //if (pref > 1) {\n // return \"\";\n //}\n return last + \"|%d\".printf((int)pref) + \"|\" + prop;\n\n \n }\n // we need to add prop - as :store -> needs to bee added when dropping onto.\n return path + \"|%d\".printf( (int) Gtk.TreeViewDropPosition.INTO_OR_AFTER) + \"|\" + prop;\n }\n /*\n last = \"\" + path;\n var par = path.split(\":\");\n string [] ppar = {};\n for (var i = 0; i < par.length-1; i++) {\n ppar += par[i];\n }\n \n path = string.joinv(\":\", ppar);\n */\n break;\n\n }\n \n return \"\";\n \n}\n",
- "| void moveNode" : "(string target_data, Gdk.DragAction action) \n{\n \n /// target_data = \"path|pos\");\n \n \n //print(\"MOVE NODE\");\n // console.dump(target_data);\n Gtk.TreeIter old_iter;\n Gtk.TreeModel mod;\n \n var s = _this.view.el.get_selection();\n s.get_selected(out mod , out old_iter);\n mod.get_path(old_iter);\n \n var node = this.pathToNode(mod.get_path(old_iter).to_string());\n //console.dump(node);\n if (node == null) {\n print(\"moveNode: ERROR - node is null?\");\n }\n \n \n\n // needs to drop first, otherwise the target_data \n // treepath will be invalid.\n\n \n if ((action & Gdk.DragAction.MOVE) > 0) {\n print(\"REMOVING OLD NODE : \" + target_data + \"\\n\");\n node.remove();\n this.dropNode(target_data, node, false);\n this.el.remove(ref old_iter);\n \n \n \n } else {\n print(\"DROPPING NODE // copy: \" + target_data + \"\\n\");\n node = node.deepClone();\n this.dropNode(target_data, node, false);\n }\n _this.changed();\n this.activePath= \"\";\n //this.updateNode(false,true);\n}\n",
- "# string activePath" : "\"\"",
- "$ columns" : "typeof(string),typeof(string),typeof(Object)",
- "| void load" : "(Gee.ArrayList<JsRender.Node> tr, Gtk.TreeIter? iter) \n{\n Gtk.TreeIter citer;\n //this.insert(citer,iter,0);\n for(var i =0 ; i < tr.size; i++) {\n if (iter != null) {\n this.el.insert(out citer,iter,-1); // why not append?\n } else {\n this.el.append(out citer,null);\n }\n \n this.el.set(citer, 0, tr.get(i).nodeTitle(),\n 1, tr.get(i).nodeTip(), -1\n );\n var o = GLib.Value(typeof(Object));\n o.set_object((Object)tr.get(i));\n \n this.el.set_value(citer, 2, o);\n \n if (tr.get(i).items.size > 0) {\n this.load(tr.get(i).items, citer);\n }\n \n }\n\n \n}",
- "| void deleteSelected" : "() {\n \n print(\"DELETE SELECTED?\");\n //_this.view.blockChanges = true;\n print(\"GET SELECTION?\");\n\n var s = _this.view.el.get_selection();\n \n print(\"GET SELECTED?\");\n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n\n \n if (!s.get_selected(out mod, out iter)) {\n return; // nothing seleted..\n }\n \n\n\n this.activePath= \"\"; \n print(\"GET vnode value?\");\n\n GLib.Value value;\n this.el.get_value(iter, 2, out value);\n var data = (JsRender.Node)(value.get_object());\n print(\"removing node from Render\\n\");\n if (data.parent == null) {\n _this.main_window.windowstate.file.tree = null;\n } else {\n data.remove();\n }\n print(\"removing node from Tree\\n\"); \n s.unselect_all();\n this.el.remove(ref iter);\n\n \n \n \n // \n \n \n\n\n this.activePath= \"\"; // again!?!? \n //this.changed(null,true);\n \n _this.changed();\n \n _this.view.blockChanges = false;\n}\n",
- "n_columns" : 3,
"$ xns" : "Gtk",
- "| JsRender.Node pathToNode" : "(string path) {\n \n \n Gtk.TreeIter iter;\n _this.model.el.get_iter_from_string(out iter, path);\n \n GLib.Value value;\n _this.model.el.get_value(iter, 2, out value);\n \n return (JsRender.Node)value.dup_object();\n\n}",
- "| void dropNode" : "(string target_data_str, JsRender.Node node, bool show_templates) {\n// print(\"drop Node\");\n // console.dump(node);\n // console.dump(target_data);\n \n \n // 0 = before , 1=after 2/3 onto\n \n \n var target_data= target_data_str.split(\"|\");\n \n var parent_str = target_data[0].length > 0 ? target_data[0] : \"\";\n var pos = target_data.length > 1 ? int.parse(target_data[1]) : 2; // ontop..\n \n \n Gtk.TreePath tree_path = parent_str.length > 0 ? new Gtk.TreePath.from_string( parent_str ) : null;\n \n \n \n //print(\"add \" + tp + \"@\" + target_data[1] );\n \n JsRender.Node parentNode = null;\n \n Gtk.TreeIter iter_after;\n Gtk.TreeIter iter_par ;\n \n \n if (target_data.length == 3 && target_data[2].length > 0) {\n node.props.set(\"* prop\", target_data[2]);\n }\n\n Gtk.TreePath expand_parent = null;\n \n // we only need to show the template if it's come from else where?\n if (show_templates) {\n \n var ts = _this.main_window.windowstate.template_select;\n \n var new_node = ts.show(\n _this.main_window, // (Gtk.Window) _this.el.get_toplevel (),\n _this.main_window.windowstate.file.palete(),\n node,\n _this.main_window.windowstate.project);\n \n if (new_node == null) {\n return; // do not add?\n }\n node = new_node;\n } \n \n //print(\"pos is %d \\n\".printf(pos));\n \n Gtk.TreeIter n_iter; \n \n if ( parent_str.length < 1) {\n this.el.append(out n_iter, null); // drop at top level..\n node.parent = null;\n _this.main_window.windowstate.file.tree = node;\n \n \n } else if (pos < 2) {\n //print(target_data[1] > 0 ? 'insert_after' : 'insert_before');\n \n this.el.get_iter(out iter_after, tree_path ); \n this.el.iter_parent(out iter_par, iter_after);\n expand_parent = this.el.get_path(iter_par);\n \n GLib.Value value;\n this.el.get_value( iter_par, 2, out value);\n parentNode = (JsRender.Node)value.dup_object();\n \n \n this.el.get_value( iter_after, 2, out value);\n var relNode = (JsRender.Node)value.dup_object();\n \n if ( pos > 0 ) {\n \n this.el.insert_after(out n_iter, iter_par , iter_after);\n var ix = parentNode.items.index_of(relNode);\n parentNode.items.insert(ix+1, node);\n \n } else {\n this.el.insert_before(out n_iter, iter_par , iter_after);\n var ix = parentNode.items.index_of(relNode);\n parentNode.items.insert(ix, node);\n \n }\n node.parent = parentNode;\n \n \n \n } else {\n // print(\"appending to \" + parent_str);\n this.el.get_iter(out iter_par, tree_path);\n this.el.append(out n_iter, iter_par );\n expand_parent = this.el.get_path(iter_par);\n \n GLib.Value value;\n this.el.get_value( iter_par, 2, out value);\n parentNode = (JsRender.Node)value.dup_object();\n node.parent = parentNode;\n parentNode.items.add(node);\n }\n \n // reparent node in tree...\n \n \n // why only on no parent???\n \n //if (node.parent = null) {\n \n \n \n //}\n \n \n // work out what kind of packing to use.. -- should be in \n if (!node.has(\"pack\") && parent_str.length > 1) {\n \n _this.main_window.windowstate.file.palete().fillPack(node,parentNode);\n \n \n }\n \n // add the node...\n \n this.el.set(n_iter, 0, node.nodeTitle(), 1, node.nodeTip(), -1 );\n var o = GLib.Value(typeof(Object));\n o.set_object((Object)node);\n \n this.el.set_value(n_iter, 2, o);\n \n \n \n \n// load children - if it has any..\n \n if (node.items.size > 0) {\n this.load(node.items, n_iter);\n _this.view.el.expand_row(this.el.get_path(n_iter), true);\n } else if (expand_parent != null && !_this.view.el.is_row_expanded(expand_parent)) {\n _this.view.el.expand_row(expand_parent,true);\n }\n\n //if (tp != null && (node.items.length() > 0 || pos > 1)) {\n // _this.view.el.expand_row(this.el.get_path(iter_par), true);\n // }\n // wee need to get the empty proptypes from somewhere..\n \n //var olditer = this.activeIter;\n this.activePath = this.el.get_path(n_iter).to_string();\n\n\n \n \n _this.view.el.set_cursor(this.el.get_path(n_iter), null, false);\n _this.changed();\n \n \n \n}\n",
- "$ listAllTypes" : "function() {\n var s = this.get('/LeftTree.view').selection;\n print (\"LIST ALL TYPES: \" + s.count_selected_rows() );\n \n if (s.count_selected_rows() > 0) {\n var iter = new Gtk.TreeIter(); \n s.get_selected(this.el, iter);\n\n // set some properties of the tree for use by the dropped element.\n var value = new GObject.Value('');\n this.el.get_value(iter, 2, value);\n var data = JSON.parse(value.value);\n \n \n var xname = this.get('/LeftTree.model').file.guessName(data);\n console.log('selected:' + xname);\n if (xname.length) {\n return [ xname ];\n }\n return []; // could not find it..\n }\n \n var ret = [ ];\n \n var _this = this;\n function addall(li)\n {\n li.forEach(function(el) {\n // this is specific to roo!!!?\n if (!el) { // skip empty?\n return;\n }\n var fullpath = _this.file.guessName(el);\n if (fullpath.length && ret.indexOf(fullpath) < 0) {\n ret.push(fullpath);\n }\n \n \n if (el.items && el.items.length) {\n addall(el.items);\n }\n \n });\n \n \n }\n \n addall([this.currentTree]);\n \n // only if we have nothing, should we add '*top'\n if (!ret.length) {\n ret = [ '*top' ];\n }\n //console.log('all types in tree');\n //console.dump(ret);\n \n return ret;\n \n}\n",
- "| string treePathFromNode" : "(JsRender.Node node) {\n // iterate through the tree and find the node\n var ret = \"\";\n \n this.el.foreach((mod, pth, iter) => {\n // get the node..\n \n \n GLib.Value value;\n _this.model.el.get_value(iter, 2, out value);\n \n\n \n var n = (JsRender.Node)value;\n\n print(\"compare %s to %s\\n\", n.fqn(), node.fqn());\n if (node == n) {\n ret = pth.to_string();\n return true;\n }\n return false;\n });\n return ret;\n\n}\n"
- },
- {
- "utf8 title" : "test",
- "* init" : " this.el.add_attribute(_this.renderer.el , \"markup\", 0 );\n ",
- "xtype" : "TreeViewColumn",
- "* pack" : "append_column",
- "$ xns" : "Gtk",
- "items" : [
- {
- "id" : "renderer",
- "xtype" : "CellRendererText",
- "* pack" : "pack_start,true",
- "$ xns" : "Gtk"
- }
- ]
+ "* prop" : "factory",
+ "xtype" : "SignalListItemFactory"
}
- ]
+ ],
+ "xtype" : "ListView"
},
{
- "id" : "LeftTreeMenu",
- "xtype" : "Menu",
- "* pack" : false,
"$ xns" : "Gtk",
+ "Gtk.PolicyType hscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC",
+ "Gtk.PolicyType vscrollbar_policy" : "Gtk.PolicyType.AUTOMATIC",
+ "bool has_frame" : true,
+ "bool hexpand" : true,
+ "bool vexpand" : true,
+ "id" : "viewwin",
"items" : [
{
- "listeners" : {
- "activate" : " ( ) => {\n \n print(\"ACTIVATE?\");\n \n \n _this.model.deleteSelected();\n}"
- },
- "label" : "Delete Element",
- "xtype" : "MenuItem",
- "* pack" : "add",
- "$ xns" : "Gtk"
- },
- {
- "listeners" : {
- "activate" : " () => {\n\n DialogSaveTemplate.singleton().show(\n (Gtk.Window) _this.el.get_toplevel (), \n _this.main_window.windowstate.file.palete(), \n _this.getActiveElement()\n );\n \n \n}"
- },
- "label" : "Save as Template",
- "xtype" : "MenuItem",
- "* pack" : "add",
- "$ xns" : "Gtk"
+ "# bool blockChanges" : false,
+ "$ JsRender.Node? dragNode" : "null",
+ "$ string lastEventSource" : "\"\"",
+ "$ xns" : "Gtk",
+ "* init" : [
+ "{",
+ " ",
+ " this.css = new Gtk.CssProvider();",
+ "//\ttry {",
+ "\t\tthis.css.load_from_string(\"",
+ "#left-tree-view { font-size: 12px;}\t",
+ ".drag-over { background-color:#88a3bc; }",
+ ".drag-below { ",
+ " border-bottom-width: 5px; ",
+ " border-bottom-style: solid;",
+ " border-bottom-color: #88a3bc;",
+ "}",
+ ".drag-above {",
+ " border-top-width: 5px;",
+ " border-top-style: solid;",
+ " border-top-color: #88a3bc;",
+ "}",
+ ".node-err {",
+ " border-top-width: 5px;",
+ " border-top-style: solid;",
+ " border-top-color: red;",
+ " border-bottom-width: 5px; ",
+ " border-bottom-style: solid;",
+ " border-bottom-color: red;",
+ "}",
+ ".node-warn {",
+ " border-top-width: 5px;",
+ " border-top-style: solid;",
+ " border-top-color: #ABF4EB;",
+ " border-bottom-width: 5px; ",
+ " border-bottom-style: solid;",
+ " border-bottom-color: #ABF4EB;",
+ "}",
+ ".node-depr {",
+ " border-top-width: 5px;",
+ " border-top-style: solid;",
+ " border-top-color: #EEA9FF;",
+ " border-bottom-width: 5px; ",
+ " border-bottom-style: solid;",
+ " border-bottom-color: #EEA9FF;",
+ "}",
+ "",
+ "#left-tree-view indent {",
+ "-gtk-icon-size : 2px;",
+ "}",
+ "#left-tree-view indent:nth-last-child(2) {",
+ "min-width: 24px;",
+ "}",
+ "\");",
+ "",
+ "\tGtk.StyleContext.add_provider_for_display(",
+ "\t\tthis.el.get_display(),",
+ "\t\tthis.css,",
+ "\t\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION",
+ "\t);",
+ "\t",
+ "\t ",
+ "}",
+ ""
+ ],
+ "* prop" : "child",
+ "Boolean id" : "view",
+ "Gtk.CssProvider css" : "",
+ "bool button_is_pressed" : false,
+ "bool headers_visible" : false,
+ "bool hexpand" : false,
+ "bool vexpand" : true,
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "listeners" : {
+ "pressed" : [
+ "(n_press, x, y) => {",
+ " ",
+ " //console.log(\"button press?\");",
+ " ",
+ " //this.el.set_state(Gtk.EventSequenceState.CLAIMED);",
+ "",
+ "",
+ " ",
+ " _this.view.button_is_pressed = true;",
+ " ",
+ " _this.view.lastEventSource = \"tree\";",
+ " if (! _this.before_node_change() ) {",
+ " \tGLib.debug(\"before_node_change return false\");",
+ " return ;",
+ " }",
+ " ",
+ "\t // nothing there -show dialog",
+ " if (_this.model.el.get_n_items() < 1) {",
+ "\t _this.main_window.windowstate.showAddObject(_this.view.el, null);",
+ " GLib.debug(\"no items\");",
+ "\t return ;",
+ " }",
+ " string pos;",
+ " var row = _this.view.getRowAt(x,y, out pos );",
+ " if (row < 0) {",
+ "\t GLib.debug(\"no row selected items\");",
+ "\t return;",
+ " }",
+ " ",
+ " var node = _this.selmodel.getNodeAt(row);",
+ " if (node == null) {",
+ " \tGLib.warning(\"No node found at row %d\", row);",
+ " \treturn;",
+ "\t}",
+ "",
+ " ",
+ " ",
+ " if (_this.view.getColAt(x,y) > 0 ) {",
+ "\t GLib.debug(\"add colum clicked.\");",
+ " var fqn = node.fqn();",
+ " \tvar cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);",
+ " \t\tif (cn.size < 1) {",
+ " \t\t\treturn ;",
+ "\t\t}",
+ "",
+ "\t\t_this.main_window.windowstate.leftTreeBeforeChange();",
+ "\t\t//_this.view.el.get_selection().select_path(res);",
+ "\t\tGLib.debug(\"Button Pressed - start show window\");",
+ "\t\t_this.main_window.windowstate.showAddObject(_this.view.el, node);",
+ "\t\tGLib.debug(\"Button Pressed - finsihed show window\");",
+ " \treturn ;",
+ "\t}",
+ " ",
+ "\t ",
+ " ",
+ "}",
+ ""
+ ],
+ "released" : [
+ "(n_press, x, y) => {",
+ " ",
+ " _this.view.button_is_pressed = false;",
+ "",
+ "",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "GestureClick"
+ },
+ {
+ "$ xns" : "Gtk",
+ "listeners" : {
+ "pressed" : [
+ "(n_press, x, y) => {",
+ "",
+ "\t",
+ "\t ",
+ "\t ",
+ " if (_this.model.el.get_n_items() < 1) {",
+ " ",
+ " GLib.debug(\"no items\");",
+ "\t return ;",
+ " }",
+ " string pos;",
+ " var row = _this.view.getRowAt(x,y, out pos );",
+ " if (row < 0) {",
+ "\t GLib.debug(\"no row selected items\");",
+ "\t return;",
+ " }",
+ " ",
+ " var node = _this.selmodel.getNodeAt(row);",
+ " if (node == null) {",
+ " \tGLib.warning(\"No node found at row %d\", row);",
+ " \treturn;",
+ "\t}",
+ "\t",
+ "\t",
+ "\t_this.model.selectNode(node);",
+ " ",
+ " ",
+ " ",
+ "\tGLib.debug(\"Prssed %d\", (int) this.el.get_current_button());",
+ "\t//_this.deletemenu.el.set_parent(_this.view.el);",
+ "\t_this.LeftTreeMenu.el.set_parent(_this.view.el);",
+ "\t",
+ "\t",
+ "\t//Gtk.Allocation rect;",
+ "\t//_this.view.el.get_allocation(out rect);",
+ " \t//_this.deletemenu.el.set_has_arrow(false);",
+ "\t_this.LeftTreeMenu.el.set_position(Gtk.PositionType.BOTTOM); ",
+ "\t",
+ "\t\t",
+ "\t_this.LeftTreeMenu.el.set_offset( ",
+ "\t\t\t(int)x ,",
+ "\t\t\t(int)y - (int)_this.view.el.get_height());",
+ "",
+ " _this.LeftTreeMenu.el.popup();",
+ " ",
+ "}",
+ ""
+ ]
+ },
+ "uint button" : 3,
+ "xtype" : "GestureClick"
+ },
+ {
+ "$ Gdk.DragAction[] actions" : "Gdk.DragAction.COPY | Gdk.DragAction.MOVE ",
+ "$ xns" : "Gtk",
+ "listeners" : {
+ "drag_begin" : [
+ "( drag ) => {",
+ "\tGLib.debug(\"SOURCE: drag-begin\");",
+ "\t ",
+ " // find what is selected in our tree...",
+ " var data = _this.selmodel.getSelectedNode();",
+ "\tif (data == null) {",
+ "\t\treturn ;",
+ "\t}",
+ "\t_this.view.dragNode = data;",
+ " var xname = data.fqn();",
+ " GLib.debug (\"XNAME IS %s\", xname);",
+ "",
+ " \tvar widget = _this.view.getWidgetAtRow(_this.selmodel.el.selected);",
+ " \t",
+ " \t",
+ " var paintable = new Gtk.WidgetPaintable(widget);",
+ " this.el.set_icon(paintable, 0,0);",
+ " ",
+ " ",
+ "}"
+ ],
+ "drag_cancel" : [
+ "(drag, reason) => {",
+ "",
+ "\t_this.view.dragNode = null;",
+ "\treturn true;",
+ "}",
+ ""
+ ],
+ "drag_end" : [
+ "(drag, delete_data) => {",
+ "",
+ "_this.view.dragNode = null;",
+ "}",
+ ""
+ ],
+ "prepare" : [
+ "(x, y) => {",
+ "",
+ "\t",
+ "\t",
+ "///\t( drag_context, data, info, time) => {",
+ " ",
+ "",
+ "\t//print(\"drag-data-get\");",
+ " \tvar ndata = _this.selmodel.getSelectedNode();",
+ "\tif (ndata == null) {",
+ "\t \tGLib.debug(\"return empty string - no selection..\");",
+ "\t\treturn null;",
+ "\t ",
+ "\t}",
+ "",
+ " ",
+ "\t//data.set_text(tp,tp.length); ",
+ "",
+ "\tvar \tstr = ndata.toJsonString();",
+ "\tGLib.debug(\"prepare store: %s\", str);",
+ "\tGLib.Value ov = GLib.Value(typeof(string));",
+ "\tov.set_string(str);",
+ " \tvar cont = new Gdk.ContentProvider.for_value(ov);",
+ " /*",
+ "\tGLib.Value v = GLib.Value(typeof(string));",
+ "\t//var str = drop.read_text( [ \"text/plain\" ] 0);",
+ "\t ",
+ "\t\tcont.get_value(ref v);",
+ "\t ",
+ "\t}",
+ "\tGLib.debug(\"set %s\", v.get_string());",
+ " */ ",
+ " \treturn cont;",
+ "\t ",
+ "\t ",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "DragSource"
+ },
+ {
+ "$ xns" : "Gtk",
+ "listeners" : {
+ "key_pressed" : [
+ "(keyval, keycode, state) => {",
+ "",
+ " ",
+ "",
+ "\tif (keyval != Gdk.Key.Delete && keyval != Gdk.Key.BackSpace) {",
+ "\t\treturn true;",
+ "\t}",
+ "",
+ "\t_this.model.deleteSelected();",
+ "\treturn true;",
+ "",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "EventControllerKey"
+ },
+ {
+ "$ xns" : "Gtk",
+ "id" : "keystate",
+ "int is_shift" : 0,
+ "listeners" : {
+ "key_pressed" : [
+ "(keyval, keycode, state) => {",
+ "",
+ " \tif (keyval == Gdk.Key.Shift_L || keyval == Gdk.Key.Shift_R) {",
+ " \t\tthis.is_shift = 1;",
+ "\t}",
+ "\treturn true;",
+ "}",
+ ""
+ ],
+ "key_released" : [
+ "(keyval, keycode, state) => {",
+ "\tGLib.debug(\"key release %d, %d, %d\" , (int) keyval, (int) keycode, state);",
+ " \tif (keyval == Gdk.Key.Shift_L || keyval == Gdk.Key.Shift_R) {",
+ " \t\tthis.is_shift = 0;",
+ "\t}",
+ "\t//GLib.debug(\"set state %d , shift = %d\", (int)this.el.get_current_event_state(), Gdk.ModifierType.SHIFT_MASK);",
+ "",
+ "",
+ " ",
+ "}"
+ ]
+ },
+ "xtype" : "EventControllerKey"
+ },
+ {
+ "$ xns" : "Gtk",
+ "* ctor" : [
+ "new Gtk.DropTarget ( typeof(string) ,",
+ "\t\tGdk.DragAction.COPY | Gdk.DragAction.MOVE )"
+ ],
+ "Gtk.Widget? highlightWidget" : "null",
+ "JsRender.Node? lastDragNode" : "null",
+ "id" : "drop",
+ "listeners" : {
+ "accept" : [
+ "(drop) => {",
+ "",
+ "\tGLib.debug(\"got DropTarget:accept\");",
+ " ",
+ "// NOT REALLY NEEDED? = put stuff in drop?",
+ "",
+ "",
+ "/* ( ctx, x, y, time) => {",
+ " //Seed.print(\"TARGET: drag-drop\");",
+ " ",
+ " ",
+ " var src = Gtk.drag_get_source_widget(ctx);",
+ " ",
+ " if (src != this.el) {",
+ " ",
+ " ",
+ " ",
+ " this.drag_in_motion = false; ",
+ " // request data that will be recieved by the recieve... ",
+ " Gtk.drag_get_data",
+ " (",
+ " this.el, // will receive 'drag-data-received' signal ",
+ " ctx, // represents the current state of the DnD ",
+ " Gdk.Atom.intern(\"application/json\",true), // the target type we want ",
+ " time // time stamp ",
+ " );",
+ "",
+ " ",
+ " // No target offered by source => error",
+ " ",
+ "",
+ " return false;",
+ " }",
+ " ",
+ " // handle drop around self..",
+ " ",
+ " ",
+ " ",
+ " //print(\"GETTING POS\");",
+ " var targetData = \"\";",
+ " ",
+ " Gtk.TreePath path;",
+ " Gtk.TreeViewDropPosition pos;",
+ " var isOver = _this.view.el.get_dest_row_at_pos(this.drag_x,this.drag_y, out path, out pos);",
+ " ",
+ " // if there are not items in the tree.. the we have to set isOver to true for anything..",
+ " var isEmpty = false;",
+ " if (_this.model.el.iter_n_children(null) < 1) {",
+ " print(\"got NO children?\\n\");",
+ " isOver = true; //??? ",
+ " isEmpty = true;",
+ " pos = Gtk.TreeViewDropPosition.INTO_OR_AFTER;",
+ " }",
+ " ",
+ " ",
+ " ",
+ " //var action = Gdk.DragAction.COPY;",
+ " // unless we are copying!!! ctl button..",
+ " ",
+ " var action = (ctx.get_actions() & Gdk.DragAction.MOVE) > 0 ?",
+ " Gdk.DragAction.COPY : Gdk.DragAction.MOVE ;",
+ " // Gdk.DragAction.MOVE : Gdk.DragAction.COPY ;",
+ "",
+ " ",
+ " if (_this.model.el.iter_n_children(null) < 1) {",
+ " // no children.. -- asume it's ok..",
+ " ",
+ " targetData = \"|%d|\".printf((int)Gtk.TreeViewDropPosition.INTO_OR_AFTER);",
+ " ",
+ " // continue through to allow drop...",
+ "",
+ " } else {",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " //print(\"ISOVER? \" + isOver);",
+ " if (!isOver) {",
+ " ",
+ " Gtk.drag_finish (ctx, false, false, time); // drop failed..",
+ " return true; // not over apoint!?! - no action on drop or motion..",
+ " }",
+ " ",
+ " // drag node is parent of child..",
+ " //console.log(\"SRC TREEPATH: \" + src.treepath);",
+ " //console.log(\"TARGET TREEPATH: \" + data.path.to_string());",
+ " ",
+ " // nned to check a few here..",
+ " //Gtk.TreeViewDropPosition.INTO_OR_AFTER",
+ " //Gtk.TreeViewDropPosition.INTO_OR_BEFORE",
+ " //Gtk.TreeViewDropPosition.AFTER",
+ " //Gtk.TreeViewDropPosition.BEFORE",
+ " ",
+ " // locally dragged items to not really use the ",
+ " var selection_text = this.dragData;",
+ " ",
+ " ",
+ " ",
+ " if (selection_text == null || selection_text.length < 1) {",
+ " //print(\"Error - drag selection text returned NULL\");",
+ " ",
+ " Gtk.drag_finish (ctx, false, false, time); // drop failed..",
+ " return true; /// -- fixme -- this is not really correct..",
+ " } ",
+ " ",
+ " // see if we are dragging into ourself?",
+ " print (\"got selection text of \" + selection_text);",
+ " ",
+ " var target_path = path.to_string();",
+ " //print(\"target_path=\"+target_path);",
+ "",
+ " // ",
+ " if (selection_text == target_path) {",
+ " print(\"self drag ?? == we should perhaps allow copy onto self..\\n\");",
+ " ",
+ " Gtk.drag_finish (ctx, false, false, time); // drop failed..",
+ "",
+ " return true; /// -- fixme -- this is not really correct..",
+ "",
+ " }",
+ " ",
+ " // check that ",
+ " //print(\"DUMPING DATA\");",
+ " //console.dump(data);",
+ " // path, pos",
+ " ",
+ " //print(data.path.to_string() +' => '+ data.pos);",
+ " ",
+ " // dropList is a list of xtypes that this node could be dropped on.",
+ " // it is set up when we start to drag..",
+ " ",
+ " ",
+ " targetData = _this.model.findDropNodeByPath( path.to_string(), this.dropList, pos);",
+ " ",
+ " print(\"targetDAta: \" + targetData +\"\\n\");",
+ " ",
+ " if (targetData.length < 1) {",
+ " //print(\"Can not find drop node path\");",
+ " ",
+ " Gtk.drag_finish (ctx, false, false, time); // drop failed..",
+ " return true;",
+ " }",
+ " ",
+ " ",
+ " ",
+ " // continue on to allow drop..",
+ " }",
+ " // at this point, drag is not in motion... -- as checked above... - so it's a real drop event..",
+ "",
+ "",
+ " var delete_selection_data = false;",
+ " ",
+ " if (action == Gdk.DragAction.ASK) {",
+ " // Ask the user to move or copy, then set the ctx action. ",
+ " }",
+ "",
+ " if (action == Gdk.DragAction.MOVE) {",
+ " delete_selection_data = true;",
+ " }",
+ " ",
+ " // drag around.. - reorder..",
+ " _this.model.moveNode(targetData, action);",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " // we can send stuff to souce here...",
+ "",
+ "",
+ "// do we always say failure, so we handle the reall drop?",
+ " Gtk.drag_finish (ctx, false, false,time); //delete_selection_data, time);",
+ "",
+ " return true;",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ "}",
+ "*/",
+ "\treturn true;",
+ "}",
+ ""
+ ],
+ "drop" : [
+ "(v, x, y) => {",
+ "\t",
+ "\tthis.addHighlight(null,\"\");",
+ " ",
+ " \tvar is_shift = _this.keystate.is_shift > 0;",
+ " ",
+ " \tvar pos = \"\";",
+ " \t// -- get position..",
+ " \tif (this.lastDragString != v.get_string() || this.lastDragNode == null) {",
+ "\t\t// still dragging same node",
+ " ",
+ "\t\tthis.lastDragNode = new JsRender.Node(); ",
+ "\t\tthis.lastDragNode.loadFromJsonString(v.get_string(), 1);",
+ "\t}",
+ " ",
+ " \t ",
+ " ",
+ " var dropNode = new JsRender.Node(); ",
+ "\tdropNode.loadFromJsonString(v.get_string(), 1);",
+ "\tvar drop_on_to = _this.main_window.windowstate.file.palete().getDropList(dropNode.fqn());",
+ " ",
+ " // if there are not items in the tree.. the we have to set isOver to true for anything..",
+ " ",
+ " if (_this.model.el.n_items < 1) {",
+ " \t// FIXME check valid drop types?",
+ " \tif (!drop_on_to.contains(\"*top\")) {",
+ "\t\t\tGLib.debug(\"drop on to list does not contain top?\");",
+ "\t\t\treturn false;\t",
+ "\t\t}",
+ "\t\t// add new node to top..",
+ "\t\t",
+ "\t\t",
+ "\t\t var m = (GLib.ListStore) _this.model.el.model;",
+ " \t_this.main_window.windowstate.file.tree = dropNode; ",
+ " ",
+ " ",
+ "\t\tm.append(dropNode);",
+ "\t\t_this.model.selectNode(dropNode); \t",
+ "\t\t_this.changed();",
+ "\t\treturn true; // no need to highlight?",
+ " ",
+ " }",
+ "",
+ "",
+ "",
+ "\tvar row = _this.view.getRowAt(x,y, out pos);",
+ "\tif (row < 0) {",
+ "\t\treturn false; //Gdk.DragAction.COPY;",
+ "\t}",
+ "\tvar tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);",
+ "\t",
+ "\tvar node = (JsRender.Node)tr.get_item();",
+ "",
+ " \tif (pos == \"above\" || pos == \"below\") {",
+ "\t\tif (node.parent == null) {",
+ "\t\t\tpos = \"over\";",
+ "\t\t} else {",
+ "\t \t\tif (!drop_on_to.contains(node.parent.fqn())) {",
+ "\t\t\t\tpos = \"over\";",
+ " \t\t\t} else {",
+ "\t\t\t\tGLib.debug(\"drop contains %s - using %s\" , node.parent.fqn(), pos);",
+ "\t\t\t\tif (_this.view.dragNode != null && is_shift) {",
+ "\t\t \t\t\tif (node.parent.oid == _this.view.dragNode.oid || node.parent.has_parent(_this.view.dragNode)) {",
+ "\t\t\t \t\t\tGLib.debug(\"shift drop not self not allowed\");",
+ " \t\t\t\t\t\treturn false;\t",
+ "\t\t \t\t\t}",
+ "\t\t \t\t\t",
+ "\t\t \t\t}",
+ "\t\t\t\t",
+ "\t\t\t\t",
+ "\t\t\t}",
+ " \t\t}",
+ " \t\t",
+ " \t}",
+ " \tif (pos == \"over\") {",
+ "\t \tif (!drop_on_to.contains(node.fqn())) {",
+ "\t\t\tGLib.debug(\"drop on does not contain %s - try center\" , node.fqn());",
+ "\t\t\treturn false;",
+ "",
+ "\t\t}",
+ "\t\tif (node.oid == _this.view.dragNode.oid || node.has_parent(_this.view.dragNode)) {",
+ " \t\t\tGLib.debug(\"shift drop not self not allowed\");",
+ "\t\t\treturn false;\t",
+ "\t\t}",
+ "\t}",
+ " \t",
+ " \tswitch(pos) {",
+ " \t\tcase \"over\":",
+ "\t \t\tnode.appendChild(dropNode);",
+ "\t \t\tif (is_shift && _this.view.dragNode != null) {",
+ "\t\t \t\t_this.model.selectNode(null); ",
+ "\t\t \t\t_this.view.dragNode.remove();",
+ "\t \t\t}",
+ "\t \t\t\t",
+ "\t \t\t",
+ " \t\t\t_this.model.selectNode(dropNode); ",
+ " \t\t\t",
+ " \t\t\t_this.changed();\t\t\t\t \t\t",
+ "\t \t\treturn true;",
+ "\t \t\t",
+ " \t\tcase \"above\":",
+ " \t\t\tGLib.debug(\"Above - insertBefore\");",
+ " \t\t",
+ "\t\t\tnode.parent.insertBefore(dropNode, node);",
+ "\t \t\tif (is_shift && _this.view.dragNode != null) {",
+ "\t\t \t\t_this.model.selectNode(null); \t \t\t",
+ "\t\t \t\t_this.view.dragNode.remove();",
+ "\t \t\t}",
+ "\t",
+ " \t\t\t_this.model.selectNode(dropNode); \t\t\t",
+ " \t\t\t_this.changed();",
+ " \t\t\treturn true;",
+ " \t\t\t",
+ " \t\tcase \"below\":",
+ " \t\t\tGLib.debug(\"Below - insertAfter\"); \t\t",
+ "\t \t\tif (is_shift && _this.view.dragNode != null) {",
+ "\t\t \t\t_this.model.selectNode(null); \t \t\t",
+ "\t\t \t\t_this.view.dragNode.remove();",
+ "\t \t\t}",
+ "\t",
+ " \t\t\t",
+ " \t\t\tnode.parent.insertAfter(dropNode, node);",
+ " \t\t\t_this.model.selectNode(dropNode);\t",
+ " \t\t\t_this.changed();",
+ " \t\t\t// select it",
+ " \t\t\treturn true;",
+ " \t\t\t",
+ " \t\tdefault:",
+ " \t\t\t// should not happen",
+ " \t\t\treturn false;",
+ " \t}",
+ " \t",
+ "\t",
+ " ",
+ "\t\t",
+ "\t\t",
+ "",
+ "}",
+ " "
+ ],
+ "leave" : [
+ "( ) => {",
+ "\tthis.addHighlight(null,\"\");",
+ "",
+ "}",
+ ""
+ ],
+ "motion" : [
+ "( x, y) => {",
+ " ",
+ "\tvar is_shift = _this.keystate.is_shift > 0;",
+ "\t",
+ "\tGLib.debug(\"shift is %s\", _this.keystate.is_shift > 0 ? \"SHIFT\" : \"-\");",
+ "\tstring pos; // over / before / after..",
+ "",
+ " //GLib.debug(\"got drag motion\");",
+ "",
+ " GLib.Value v = GLib.Value(typeof(string));",
+ " \t//var str = drop.read_text( [ \"text/plain\" ] 0);",
+ " \tvar cont = this.el.current_drop.get_drag().content ;",
+ " \ttry {",
+ " \t\tcont.get_value(ref v);",
+ "\t} catch (GLib.Error e) {",
+ "\t GLib.debug(\"failed to get drag value\");",
+ "\t\treturn Gdk.DragAction.COPY;\t ",
+ "\t",
+ "\t}",
+ " ",
+ "\t//GLib.debug(\"got %s\", v.get_string());",
+ "\t ",
+ "\tif (this.lastDragString != v.get_string() || this.lastDragNode == null) {",
+ "\t\t// still dragging same node",
+ " ",
+ "\t\tthis.lastDragNode = new JsRender.Node(); ",
+ "\t\tthis.lastDragNode.loadFromJsonString(v.get_string(), 1);",
+ "\t}",
+ " ",
+ "",
+ "\tvar drop_on_to = _this.main_window.windowstate.file.palete().getDropList(",
+ "\t\t\t\tthis.lastDragNode.fqn());",
+ " ",
+ " string[] str = {};",
+ " foreach(var dp in drop_on_to) {",
+ " \tstr += dp;",
+ " \t}",
+ " \tGLib.debug(\"droplist: %s\", string.joinv(\", \", str));",
+ " ",
+ " ",
+ " // if there are not items in the tree.. the we have to set isOver to true for anything..",
+ " ",
+ " if (_this.model.el.n_items < 1) {",
+ " \t// FIXME check valid drop types?",
+ " \tif (drop_on_to.contains(\"*top\")) {",
+ "\t\t\tthis.addHighlight(_this.view.el, \"over\");",
+ "\t\t} else {",
+ "\t\t\tthis.addHighlight(null, \"\");\t\t",
+ "\t\t}",
+ "",
+ "\t\treturn Gdk.DragAction.COPY; // no need to highlight?",
+ " ",
+ " }",
+ " ",
+ " ",
+ " \tGLib.debug(\"check is over\");",
+ " \t ",
+ " // if path of source and dest are inside each other..",
+ " // need to add source info to drag?",
+ " // the fail();",
+ " \tvar row = _this.view.getRowAt(x,y, out pos);",
+ " \t",
+ " \tif (row < 0) {",
+ "\t\tthis.addHighlight(null, \"\");\t",
+ "\t \treturn Gdk.DragAction.COPY;",
+ " \t}",
+ "\tvar tr = (Gtk.TreeListRow)_this.view.el.model.get_object(row);",
+ "\t",
+ "\tvar node = (JsRender.Node)tr.get_item();",
+ "\t",
+ "\tGLib.debug(\"Drop over node: %s\", node.fqn());",
+ "\t",
+ "",
+ " \tif (pos == \"above\" || pos == \"below\") {",
+ "\t\tif (node.parent == null) {",
+ "\t\t\tGLib.debug(\"no parent try center\");",
+ "\t\t\tpos = \"over\";",
+ "\t\t} else {",
+ "\t \t\t ",
+ "\t \t\tif (!drop_on_to.contains(node.parent.fqn())) {",
+ "\t\t\t\tGLib.debug(\"drop on does not contain %s - try center\" , node.parent.fqn());",
+ "\t \t\t\tpos = \"over\";",
+ " \t\t\t} else {",
+ "\t\t\t\tGLib.debug(\"drop contains %s - using %s\" , node.parent.fqn(), pos);",
+ "\t\t\t\tif (_this.view.dragNode != null && is_shift) {",
+ "\t\t \t\t\tif (node.parent.oid == _this.view.dragNode.oid || node.parent.has_parent(_this.view.dragNode)) {",
+ "\t\t\t \t\t\tGLib.debug(\"shift drop not self not allowed\");",
+ "\t\t \t\t\t\tthis.addHighlight(null, \"\");",
+ "\t\t \t\t\t\treturn Gdk.DragAction.COPY;\t",
+ "\t\t \t\t\t}",
+ "\t\t \t\t\t",
+ "\t\t \t\t}",
+ "\t\t\t\t",
+ "\t\t\t}",
+ "\t\t\t",
+ "\t\t\t",
+ "\t\t\t",
+ " \t\t}",
+ " \t\t",
+ " \t\t",
+ " \t}",
+ " \tif (pos == \"over\") {",
+ "\t \tif (!drop_on_to.contains(node.fqn())) {",
+ "\t\t\tGLib.debug(\"drop on does not contain %s - try center\" , node.fqn());",
+ "\t\t\tthis.addHighlight(null, \"\"); ",
+ "\t\t\treturn is_shift ? Gdk.DragAction.MOVE : Gdk.DragAction.COPY;\t\t",
+ "\t\t}",
+ "\t\tif (_this.view.dragNode != null && is_shift) {",
+ " \t\t\tif (node.oid == _this.view.dragNode.oid || node.has_parent(_this.view.dragNode)) {",
+ "\t \t\t\tGLib.debug(\"shift drop not self not allowed\");",
+ " \t\t\t\tthis.addHighlight(null, \"\");",
+ " \t\t\t\treturn Gdk.DragAction.COPY;\t",
+ " \t\t\t}",
+ "\t\t}",
+ " \t\t\t",
+ "\t}",
+ " \t",
+ " \t",
+ " \t // _this.view.highlightDropPath(\"\", (Gtk.TreeViewDropPosition)0);",
+ "\tvar w = _this.view.getWidgetAt(x,y);",
+ "\tthis.addHighlight(w, pos); ",
+ "\treturn is_shift ? Gdk.DragAction.MOVE : Gdk.DragAction.COPY;\t\t",
+ "}"
+ ]
+ },
+ "string lastDragString" : "\"\"",
+ "xtype" : "DropTarget",
+ "| void addHighlight" : [
+ "(Gtk.Widget? w, string hl) {",
+ "\tif (this.highlightWidget != null) {",
+ "\t\tvar ww = this.highlightWidget;",
+ "\t\tGLib.debug(\"clear drag from previous highlight\");",
+ "\t\tif (ww.has_css_class(\"drag-below\")) {",
+ "\t\t\t ww.remove_css_class(\"drag-below\");",
+ "\t\t}",
+ "\t\tif (ww.has_css_class(\"drag-above\")) {",
+ "\t\t\t ww.remove_css_class(\"drag-above\");",
+ "\t\t}",
+ "\t\tif (ww.has_css_class(\"drag-over\")) {",
+ "\t\t\t ww.remove_css_class(\"drag-over\");",
+ "\t\t}",
+ "\t}",
+ "\tif (w != null) {",
+ "\t\tGLib.debug(\"add drag=%s to widget\", hl);\t",
+ "\t\tif (!w.has_css_class(\"drag-\" + hl)) {",
+ "\t\t\tw.add_css_class(\"drag-\" + hl);",
+ "\t\t}",
+ "\t}",
+ "\tthis.highlightWidget = w;",
+ "}"
+ ]
+ },
+ {
+ "$ xns" : "Gtk",
+ "* prop" : "model",
+ "id" : "selmodel",
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "* ctor" : "this.updateModel(null)",
+ "* prop" : "model",
+ "id" : "model",
+ "xtype" : "TreeListModel",
+ "| Gtk.TreeListModel updateModel" : [
+ "(GLib.ListStore? m) {",
+ "\tthis.el = new Gtk.TreeListModel(",
+ "\t\tm != null ? m : new GLib.ListStore(typeof(JsRender.Node)), //..... << that's our store..",
+ "\t\tfalse, // passthru",
+ "\t\ttrue, // autexpand",
+ "\t\t(item) => {",
+ "\t\t\treturn ((JsRender.Node)item).childstore;",
+ "\t\t",
+ "\t\t}",
+ "\t);",
+ "\tif (_this.selmodel.el == null) {",
+ "\t\treturn this.el;",
+ "\t}",
+ "\t_this.selmodel.el.set_model(this.el);",
+ "\treturn this.el;",
+ "}"
+ ],
+ "| int nodeToRow" : [
+ "(JsRender.Node node) ",
+ "{",
+ "\tvar row = -1;",
+ "\tvar s = _this.view.el.model as Gtk.SingleSelection;",
+ "\tfor (var i = 0; i < s.n_items; i++) {",
+ "\t\t//GLib.debug(\"check node %s\", s.get_item(i).get_type().name());",
+ "\t\tvar lr = s.get_item(i) as Gtk.TreeListRow;",
+ "\t\tGLib.debug(\"check node %s\", lr.get_item().get_type().name());",
+ "\t\tif ((lr.get_item() as JsRender.Node).oid == node.oid) {",
+ "\t\t\treturn i;",
+ "\t\t\t",
+ "\t\t}",
+ "\t}",
+ "\treturn -1;\t\t\t",
+ "\t",
+ "",
+ "}"
+ ],
+ "| void deleteSelected" : [
+ "() {",
+ "",
+ "",
+ "\t",
+ "\tvar node = _this.selmodel.getSelectedNode();",
+ "\t",
+ "",
+ " if (node == null) {",
+ " \tGLib.debug(\"delete Selected - no node slected?\");",
+ "\t return;",
+ " }",
+ " _this.selmodel.el.unselect_all();",
+ " ",
+ " node.remove();",
+ " \tGLib.debug(\"delete Selected - done\");",
+ " _this.changed();",
+ "/* ",
+ " print(\"DELETE SELECTED?\");",
+ " //_this.view.blockChanges = true;",
+ " print(\"GET SELECTION?\");",
+ "",
+ " var s = _this.view.el.get_selection();",
+ " ",
+ " print(\"GET SELECTED?\");",
+ " Gtk.TreeIter iter;",
+ " Gtk.TreeModel mod;",
+ "",
+ " ",
+ " if (!s.get_selected(out mod, out iter)) {",
+ " return; // nothing seleted..",
+ " }",
+ " ",
+ "",
+ "",
+ " this.activePath= \"\"; ",
+ " print(\"GET vnode value?\");",
+ "",
+ " GLib.Value value;",
+ " this.el.get_value(iter, 2, out value);",
+ " var data = (JsRender.Node)(value.get_object());",
+ " print(\"removing node from Render\\n\");",
+ " if (data.parent == null) {",
+ " _this.main_window.windowstate.file.tree = null;",
+ " } else {",
+ " data.remove();",
+ " }",
+ " print(\"removing node from Tree\\n\"); ",
+ " s.unselect_all();",
+ " this.el.remove(ref iter);",
+ "",
+ " ",
+ " ",
+ " ",
+ " // ",
+ " ",
+ " ",
+ "",
+ "",
+ " this.activePath= \"\"; // again!?!? ",
+ " //this.changed(null,true);",
+ " ",
+ " _this.changed();",
+ " ",
+ " _this.view.blockChanges = false;",
+ " */",
+ "}",
+ ""
+ ],
+ "| void loadFile" : [
+ "(JsRender.JsRender f) {",
+ " //console.dump(f);",
+ " ",
+ " _this.drop.highlightWidget = null;",
+ " ",
+ " var m = (GLib.ListStore) this.el.model;",
+ "\tm.remove_all();",
+ " _this.main_window.windowstate.leftTreeNodeSelected(null);",
+ " // needed???",
+ " _this.main_window.windowstate.file = f;",
+ " _this.last_error_counter = -1;",
+ " ",
+ " if (f.tree == null) {",
+ "\t try {",
+ "\t f.loadItems( );",
+ " } catch (Error e) {",
+ " \t\treturn;",
+ " }",
+ " }",
+ " // if it's still null?",
+ " if (f.tree == null) {",
+ "\t\t_this.main_window.windowstate.showAddObject(_this.view.el, null);",
+ " \t_this.updateErrors();",
+ " return;",
+ " }",
+ " \tm.append(f.tree);",
+ "\t_this.updateErrors();",
+ " ",
+ " _this.selmodel.el.set_selected(Gtk.INVALID_LIST_POSITION);",
+ " ",
+ " return;",
+ " ",
+ " ",
+ "}",
+ ""
+ ],
+ "| void selectNode" : [
+ "(JsRender.Node node) ",
+ "{",
+ "\tvar row = this.nodeToRow(node);",
+ "\tvar s = _this.view.el.model as Gtk.SingleSelection;",
+ "\t ",
+ "\tif (row < 0) {",
+ "\t\t// select none?",
+ "\t\tGLib.debug(\"Could not find node\");",
+ "\t\treturn;",
+ "\t}",
+ "\tGLib.debug(\"Select %d\", row);",
+ "\ts.set_selected(row);",
+ "\t_this.view.el.scroll_to(row, null, Gtk.ListScrollFlags.SELECT, null);",
+ "\t//_this.node_selected(node);\t\t\t",
+ "\t",
+ "",
+ "}"
+ ]
+ }
+ ],
+ "listeners" : {
+ "selection_changed" : [
+ "(position, n_items) => {",
+ "",
+ "\t",
+ "\t\t",
+ "\t\t//if (!this.button_is_pressed && !this.key_is_pressed) {",
+ "\t\t\t// then event was started by some other action",
+ "\t\t\t// which should manually trigger all the events..",
+ "\t\t//\tprint(\"SKIPPING select - no button or key pressed\\n\");",
+ "\t\t//\treturn;",
+ "\t\t//}",
+ "",
+ "",
+ "\t\t if (_this.view.blockChanges) { // probably not needed.. ",
+ "\t\t\tGLib.debug(\"SKIPPING select - blockchanges set..\"); ",
+ "\t\t return ;",
+ "\t\t }",
+ "",
+ "\t\t if (!_this.before_node_change( ) ) {",
+ "\t\t\t _this.view.blockChanges = true;",
+ "\t\t\t _this.selmodel.el.unselect_all();",
+ "\t\t\t _this.view.blockChanges = false;",
+ "\t\t\t ",
+ "\t\t\t return;",
+ "\t\t }",
+ "\t\t if (_this.main_window.windowstate.file == null) {",
+ "\t \t\tGLib.debug(\"SKIPPING select windowstate file is not set...\"); ",
+ "\t\t\treturn;",
+ "\t\t } ",
+ "\t\t ",
+ "\t\t //var render = this.get('/LeftTree').getRenderer(); ",
+ "\t\tGLib.debug(\"LEFT TREE -> view -> selection changed called\");",
+ "\t\t",
+ "\t\t",
+ "\t\t// -- it appears that the selection is not updated.",
+ "\t\t // select the node...",
+ "\t\t //_this.selmodel.el.set_selected(row);",
+ " ",
+ "\t\t GLib.debug(\"LEFT TREE -> view -> selection changed TIMEOUT CALLED\");",
+ "",
+ "\t var snode = _this.selmodel.getSelectedNode();",
+ "\t if (snode == null) {",
+ "",
+ "\t GLib.debug(\"selected rows < 1\");",
+ "\t //??this.model.load( false);",
+ "\t _this.node_selected(null);",
+ "\t ",
+ "\t return ;",
+ "\t }",
+ "\t ",
+ "\t // why dup_?",
+ "\t ",
+ "",
+ "\t GLib.debug (\"calling left_tree.node_selected\");",
+ "\t _this.node_selected(snode);",
+ "\t ",
+ "\t ",
+ "\t ",
+ "\t ",
+ "\t // no need to scroll. it's in the view as we clicked on it.",
+ "\t // _this.view.el.scroll_to_cell(new Gtk.TreePath.from_string(_this.model.activePath), null, true, 0.1f,0.0f);",
+ "\t ",
+ "\t return ;",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "SingleSelection",
+ "| JsRender.Node getNodeAt" : [
+ "(uint row) {",
+ "",
+ " var tr = (Gtk.TreeListRow)this.el.get_item(row);",
+ " ",
+ " var a = tr.get_item();; ",
+ " GLib.debug(\"get_item (2) = %s\", a.get_type().name());",
+ " \t",
+ " ",
+ " return (JsRender.Node)tr.get_item();",
+ "\t ",
+ "}"
+ ],
+ "| JsRender.Node? getSelectedNode" : [
+ "() {",
+ " if (this.el.selected_item == null) {",
+ "\t\treturn null;",
+ " }\t\t\t ",
+ " var tr = (Gtk.TreeListRow)this.el.selected_item;",
+ " return (JsRender.Node)tr.get_item();",
+ "\t ",
+ "}"
+ ]
+ },
+ {
+ "$ xns" : "Gtk",
+ "* pack" : "append_column",
+ "bool expand" : true,
+ "bool resizable" : true,
+ "id" : "maincol",
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "* prop" : "factory",
+ "listeners" : {
+ "bind" : [
+ "(listitem) => {",
+ "\t GLib.debug(\"listitme is is %s\", ((Gtk.ListItem)listitem).get_type().name());",
+ "\t",
+ "\t//var expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();",
+ "\tvar expand = (Gtk.TreeExpander) ((Gtk.ListItem)listitem).get_child();",
+ "\t ",
+ "\t ",
+ "\tvar hbox = (Gtk.Box) expand.child;",
+ " ",
+ "\t",
+ "\tvar img = (Gtk.Image) hbox.get_first_child();",
+ "\tvar lbl = (Gtk.Label) img.get_next_sibling();",
+ "\t",
+ "\tvar lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();",
+ "\tvar node = (JsRender.Node) lr.get_item();",
+ "\t",
+ " GLib.debug(\"node is %s\", node.get_type().name());",
+ "// was item (1) in old layout",
+ "",
+ "\t",
+ " ",
+ " \t /* ",
+ " \tvar ic = Gtk.IconTheme.get_for_display(_this.el.get_display());",
+ " var clsname = node.fqn();",
+ " ",
+ " var clsb = clsname.split(\".\");",
+ " var sub = clsb.length > 1 ? clsb[1].down() : \"\";",
+ " ",
+ " var fn = \"/usr/share/glade/pixmaps/hicolor/16x16/actions/widget-gtk-\" + sub + \".png\";",
+ " try { ",
+ " \t ",
+ " \t\t ",
+ "\t\tif (FileUtils.test (fn, FileTest.IS_REGULAR)) {",
+ "\t\t img.set_from_file(fn);",
+ "\t\t \t ",
+ "\t \t} else {",
+ "\t \t\timg.set_from_paintable(",
+ "\t\t\t \tic.lookup_icon (",
+ "\t\t\t \t\t\"media-playback-stop\", null, 16,1, ",
+ "\t \t\t\t Gtk.TextDirection.NONE, 0",
+ " \t\t\t)",
+ "\t\t\t );",
+ "\t \t}",
+ " \t} catch (GLib.Error e) {}",
+ " */",
+ " expand.set_hide_expander( !node.hasChildren() );",
+ " \texpand.set_list_row(lr);",
+ " \t",
+ " \tnode.bind_property(\"iconFilename\",",
+ " img, \"file\",",
+ " GLib.BindingFlags.SYNC_CREATE);",
+ " \t",
+ " \tnode.bind_property(\"nodeTitleProp\",",
+ " lbl, \"label\",",
+ " GLib.BindingFlags.SYNC_CREATE);",
+ " \tnode.bind_property(\"nodeTipProp\",",
+ " lbl, \"tooltip_markup\",",
+ " GLib.BindingFlags.SYNC_CREATE);",
+ " \t// bind image...",
+ " \t",
+ "}",
+ ""
+ ],
+ "setup" : [
+ "(listitem) => {",
+ "\t",
+ "\tvar expand = new Gtk.TreeExpander();",
+ "\t ",
+ "\texpand.set_indent_for_depth(true);",
+ "\texpand.set_indent_for_icon(true);",
+ "\tvar hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL,0);",
+ "\tvar icon = new Gtk.Image();",
+ "\tvar lbl = new Gtk.Label(\"\");",
+ "\tlbl.use_markup = true;",
+ "\tlbl.ellipsize = Pango.EllipsizeMode.END;",
+ "\t",
+ "\ticon.margin_end = 4;",
+ " \tlbl.justify = Gtk.Justification.LEFT;",
+ " \tlbl.xalign = 0;",
+ "",
+ "//\tlistitem.activatable = true; ??",
+ "\t",
+ "\thbox.append(icon);",
+ "\thbox.append(lbl);",
+ "\texpand.set_child(hbox);",
+ "\t((Gtk.ListItem)listitem).set_child(expand);",
+ "\t",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "SignalListItemFactory"
+ }
+ ],
+ "title" : "Property",
+ "xtype" : "ColumnViewColumn"
+ },
+ {
+ "$ xns" : "Gtk",
+ "* pack" : "append_column",
+ "int fixed_width" : 25,
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "* prop" : "factory",
+ "listeners" : {
+ "bind" : [
+ "(listitem) => {",
+ "",
+ " \tvar img = (Gtk.Image) ((Gtk.ListItem)listitem).get_child(); ",
+ " \tvar lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();",
+ "\tvar node = (JsRender.Node) lr.get_item();",
+ "\t",
+ " ",
+ " var ic = Gtk.IconTheme.get_for_display(_this.el.get_display());",
+ "\timg.set_from_paintable(",
+ "\t \tic.lookup_icon (",
+ "\t \t\t\"list-add\", null, 16,1, ",
+ "\t\t\t Gtk.TextDirection.NONE, 0",
+ "\t\t)",
+ "\t );",
+ "\t ",
+ " \tvar fqn = node.fqn();",
+ " var cn = _this.main_window.windowstate.project.palete.getChildList(fqn, false);",
+ "",
+ "\timg.set_visible(cn.size > 0 ? true : false);",
+ " \t ",
+ "}",
+ ""
+ ],
+ "setup" : [
+ "(listitem) => {",
+ "",
+ "\t ",
+ "\tvar icon = new Gtk.Image();",
+ "\t ",
+ "\t((Gtk.ListItem)listitem).set_child(icon);",
+ "}",
+ ""
+ ]
+ },
+ "xtype" : "SignalListItemFactory"
+ }
+ ],
+ "string title" : "Add",
+ "xtype" : "ColumnViewColumn"
+ }
+ ],
+ "string name" : "left-tree-view",
+ "xtype" : "ColumnView",
+ "| Gtk.Widget? getWidgetAt" : [
+ "(double x, double in_y) {",
+ "/*",
+ " \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*/",
+ " \tvar y = in_y + _this.viewwin.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 curr_y = 0;",
+ " \tvar header_height = 0;",
+ " \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\tcontinue;",
+ "\t }",
+ "\t\t line_no++;",
+ "",
+ "\t\t\tif (y < header_height) {",
+ "\t\t \treturn null;",
+ "\t \t}",
+ "",
+ "\t\t\tvar hh = child.get_height();",
+ "\t\t\t//GLib.debug(\"got cell xy = %d,%d w,h= %d,%d\", alloc.x, alloc.y, alloc.width, alloc.height);",
+ "\t\t\tif (child.has_css_class(\"node-err\") || ",
+ "\t\t\t\tchild.has_css_class(\"node-warn\") || ",
+ "\t\t\t\tchild.has_css_class(\"node-depr\")) {",
+ "\t\t\t\thh += 10;",
+ "\t\t\t",
+ "\t\t\t}\t",
+ "\t\t if (y > curr_y && y <= header_height + hh + curr_y ) {",
+ "\t\t\t return (Gtk.Widget)child;",
+ "\t\t }",
+ "\t\t curr_y += hh ;",
+ "",
+ "\t\t if (curr_y > y) {",
+ "\t\t return null;",
+ "\t }",
+ "\t child = child.get_next_sibling(); ",
+ " \t}",
+ " return null;",
+ "",
+ " }"
+ ],
+ "| 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\t//GLib.debug(\"Get Widget At Row %d\", (int)row);",
+ " var child = this.el.get_first_child(); ",
+ " \tvar line_no = -1; ",
+ " \tvar reading_header = true;",
+ "\t ",
+ " \twhile (child != null) {",
+ "\t\t\tGLib.debug(\"Got %s\", child.get_type().name());",
+ " \t ",
+ " \t if (reading_header) {",
+ "\t\t\t\t",
+ "",
+ "\t\t\t\tif (child.get_type().name() != \"GtkColumnListView\") {",
+ "\t\t\t\t ",
+ "\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 ",
+ "\t\t\t ",
+ "\t\t\t\t",
+ "\t\t\t\treading_header = false;",
+ "\t\t\t\tcontinue;",
+ "\t\t }",
+ "\t\t ",
+ "\t\t ",
+ " \t ",
+ "\t\t line_no++;",
+ "\t\t\tif (line_no == row) {",
+ "\t\t\t\t//GLib.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\t//GLib.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 };",
+ "\t\t//GLib.debug(\"Cehck %d, %d\", x,y);",
+ " var child = this.el.get_first_child(); ",
+ " \t ",
+ " \tvar col = 0;",
+ " \tvar offx = 0;",
+ " \twhile (child != null) {",
+ "\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\treturn 1;",
+ "\t\t\t//offx += child.get_width();",
+ "\t\t\t//col++;",
+ "\t\t\t//child = 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.viewwin.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\tcontinue;",
+ "\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",
+ "\t\t\tif (child.has_css_class(\"node-err\") || ",
+ "\t\t\t\tchild.has_css_class(\"node-warn\") || ",
+ "\t\t\t\tchild.has_css_class(\"node-depr\")) {",
+ "\t\t\t\thh += 10;",
+ "\t\t\t",
+ "\t\t\t}",
+ "\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;",
+ "",
+ " }"
+ ]
},
{
- "listeners" : {
- "activate" : " () => {\n var node = _this.getActiveElement();\n var name = DialogSaveModule.singleton().show(\n (Gtk.Window) _this.el.get_toplevel (), \n _this.main_window.windowstate.project, \n node\n );\n if (name.length < 1) {\n return;\n \n }\n node.props.set(\"* xinclude\", name);\n node.items.clear();\n\n\n var s = _this.view.el.get_selection();\n \n print(\"GET SELECTED?\");\n Gtk.TreeIter iter;\n Gtk.TreeModel mod;\n\n \n if (!s.get_selected(out mod, out iter)) {\n return; // nothing seleted..\n }\n Gtk.TreeIter citer;\n var n_cn = mod.iter_n_children(iter) -1;\n for (var i = n_cn; i > -1; i--) {\n mod.iter_nth_child(out citer, iter, i);\n \n\n print(\"removing node from Tree\\n\"); \n \n _this.model.el.remove(ref citer);\n }\n _this.changed();\n _this.node_selected(node, \"tree\");\n \n \n}"
- },
- "label" : "Save as Module",
- "xtype" : "MenuItem",
- "* pack" : "add",
- "$ xns" : "Gtk"
+ "$ xns" : "Gtk",
+ "* pack" : false,
+ "id" : "LeftTreeMenu",
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "* prop" : "child",
+ "Gtk.Orientation orientation" : "Gtk.Orientation.VERTICAL",
+ "int spacing" : 0,
+ "items" : [
+ {
+ "$ xns" : "Gtk",
+ "label" : "Delete Element",
+ "listeners" : {
+ "clicked" : [
+ " ( ) => {",
+ "_this.LeftTreeMenu.el.hide();",
+ " _this.model.deleteSelected();",
+ "_this.changed();",
+ "}"
+ ]
+ },
+ "xtype" : "Button"
+ },
+ {
+ "$ xns" : "Gtk",
+ "label" : "Save as Template",
+ "listeners" : {
+ "clicked" : [
+ " () => {",
+ "_this.LeftTreeMenu.el.hide();",
+ " DialogSaveTemplate.singleton().showIt(",
+ " (Gtk.Window) _this.el.get_root (), ",
+ " _this.main_window.windowstate.file.palete(), ",
+ " _this.getActiveElement()",
+ " );",
+ " ",
+ " ",
+ "}"
+ ]
+ },
+ "xtype" : "Button"
+ },
+ {
+ "$ xns" : "Gtk",
+ "label" : "Save as Module",
+ "listeners" : {
+ "clicked" : [
+ " () => {",
+ " ",
+ " _this.LeftTreeMenu.el.hide();",
+ " var node = _this.getActiveElement();",
+ " ",
+ " ",
+ " var sm = DialogSaveModule.singleton();",
+ " ",
+ " ",
+ " sm.showIt(",
+ " (Gtk.Window) _this.el.get_root (), ",
+ " _this.main_window.windowstate.project, ",
+ " node",
+ " );",
+ " /*",
+ " gtk4 migration - disabled this part.. probably not used muchanyway",
+ " ",
+ " ",
+ " if (name.length < 1) {",
+ " return;",
+ " ",
+ " }",
+ " node.set_prop( new JsRender.NodeProp.special(\"xinclude\", name));",
+ " node.items.clear();",
+ "",
+ "",
+ " var s = _this.view.el.get_selection();",
+ " ",
+ " print(\"GET SELECTED?\");",
+ " Gtk.TreeIter iter;",
+ " Gtk.TreeModel mod;",
+ "",
+ " ",
+ " if (!s.get_selected(out mod, out iter)) {",
+ " return; // nothing seleted..",
+ " }",
+ " Gtk.TreeIter citer;",
+ " var n_cn = mod.iter_n_children(iter) -1;",
+ " for (var i = n_cn; i > -1; i--) {",
+ " mod.iter_nth_child(out citer, iter, i);",
+ " ",
+ "",
+ " print(\"removing node from Tree\\n\"); ",
+ " ",
+ " _this.model.el.remove(ref citer);",
+ " }",
+ " _this.changed();",
+ " _this.node_selected(node, \"tree\");",
+ " */",
+ " ",
+ "}"
+ ]
+ },
+ "xtype" : "Button"
+ }
+ ],
+ "xtype" : "Box"
+ }
+ ],
+ "xtype" : "Popover"
}
- ]
+ ],
+ "xtype" : "ScrolledWindow"
}
+ ],
+ "xtype" : "Box",
+ "| JsRender.JsRender getActiveFile" : [
+ "() {",
+ " return this.main_window.windowstate.file;",
+ "}",
+ ""
+ ],
+ "| JsRender.Node? getActiveElement" : [
+ " () { // return path to actie node.",
+ "",
+ " ",
+ "\treturn _this.selmodel.getSelectedNode();",
+ " ",
+ " ",
+ "}",
+ ""
+ ],
+ "| void onresize" : [
+ "() {",
+ " ",
+ "\t ",
+ "\t//GLib.debug(\"Got allocation width of scrolled view %d\", allocation.width );",
+ "//\t_this.maincol.el.set_max_width( _this.viewwin.el.get_width() - 32 );",
+ "}",
+ "",
+ ""
+ ],
+ "| void removeErrors" : [
+ "() {",
+ "\tvar child = this.view.el.get_first_child(); ",
+ " ",
+ "\tvar reading_header = true;",
+ " ",
+ "\twhile (child != null) {",
+ "\t\t//GLib.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.getActiveFile();",
+ "\tvar ar = file.getErrors();",
+ "\t\tif (ar.size < 1) {",
+ "\t\tif (this.last_error_counter != file.error_counter) {",
+ "\t\t\tthis.removeErrors();",
+ "\t\t}",
+ "\t",
+ "\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) {",
+ "\t \tcontinue;",
+ " \t}",
+ " \tvar row = _this.model.nodeToRow(node);",
+ " \tif (row < 0) {",
+ " \t\tcontinue;",
+ "\t\t}",
+ " \tvar w = this.view.getWidgetAtRow(row);",
+ " \tif (w == null) {",
+ " \t\treturn;",
+ "\t\t}",
+ "\t\t// always show errors.",
+ "\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" : "WindowLeftTree"
}
\ No newline at end of file