Fix #8098 - refinements to code navigator
[roobuilder] / src / Builder4 / Editor.bjs
index dd0a0c2..2127fc9 100644 (file)
                "    return ;",
                "}",
                ""
+              ],
+              "cursor_moved" : [
+               "( ) => {",
+               "",
+               "\tGtk.TextIter iter;",
+               "\tthis.el.get_iter_at_offset (",
+               "\t\t\tout iter, this.el.cursor_position);",
+               "\tvar line = iter.get_line();",
+               "\t_this.navigation.updateSelectedLine(",
+               "\t\t\t(uint)iter.get_line(),",
+               "\t\t\t(uint)iter.get_line_offset()",
+               "\t\t);",
+               "",
+               "",
+               "}",
+               ""
               ]
              },
              "| bool OLDhighlightErrorsJson" : [
        "id" : "navigationwindow",
        "items" : [
         {
+         "# int last_selected_line" : "-1",
+         "$ Gtk.Widget? selected_row" : "null",
          "$ xns" : "Gtk",
          "* prop" : "child",
          "id" : "navigation",
                "\tvar lr = (Gtk.TreeListRow)((Gtk.ListItem)listitem).get_item();",
                "\tvar sym = (Lsp.DocumentSymbol) lr.get_item();",
                "\t",
-               "\tGLib.debug(\"got %d children for %s\" , (int)sym.children.get_n_items(), sym.name);",
+               "\tsym.set_data<Gtk.Widget>(\"widget\", expand.get_parent());",
+               "\texpand.get_parent().get_parent().set_data<Lsp.DocumentSymbol>(\"symbol\", sym);",
+               "\t",
+               "\tGLib.debug(\"save sym on %s\", expand.get_parent().get_parent().get_type().name());",
+               "\t",
+               "\t//GLib.debug(\"got %d children for %s\" , (int)sym.children.get_n_items(), sym.name);",
                "    ",
                "    expand.set_hide_expander( sym.children.get_n_items()  < 1);",
                " \texpand.set_list_row(lr);",
             {
              "$ xns" : "Gtk",
              "* prop" : "model",
+             "id" : "navigationsort",
              "items" : [
               {
                "$ Gtk.TreeListModelCreateModelFunc create_func" : [
                  "$ xns" : "GLib",
                  "* prop" : "root",
                  "id" : "navliststore",
-                 "xtype" : "ListStore"
+                 "xtype" : "ListStore",
+                 "| Lsp.DocumentSymbol? symbolAtLine" : [
+                  "(uint line, uint chr) {",
+                  " ",
+                  "\t",
+                  "\tfor(var i = 0; i < this.el.get_n_items();i++) {",
+                  "\t\tvar el = (Lsp.DocumentSymbol)this.el.get_item(i);",
+                  "\t\t//GLib.debug(\"Check sym %s : %d-%d\",",
+                  "\t\t//\tel.name , (int)el.range.start.line,",
+                  "\t\t//\t(int)el.range.end.line",
+                  "\t\t//);",
+                  "\t\tvar ret = el.containsLine(line,chr);",
+                  "\t\tif (ret != null) {",
+                  "\t\t\treturn ret;",
+                  "\t\t}",
+                  "\t\t",
+                  "\t}",
+                  "\t",
+                  "\treturn null;",
+                  "}"
+                 ]
                 }
                ],
                "xtype" : "TreeListModel"
                "xtype" : "TreeListRowSorter"
               }
              ],
-             "xtype" : "SortListModel"
+             "xtype" : "SortListModel",
+             "| Lsp.DocumentSymbol? getSymbolAt" : [
+              "(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 (Lsp.DocumentSymbol)tr.get_item();",
+              "\t ",
+              "}"
+             ],
+             "| int getRowFromSymbol" : [
+              "(Lsp.DocumentSymbol sym) {",
+              "",
+              "\tfor (var i=0;i < this.el.get_n_items(); i++) {",
+              "\t\tvar tr = (Gtk.TreeListRow)this.el.get_item(i);",
+              "\t   ",
+              "\t\tif (sym.equals( (Lsp.DocumentSymbol)tr.get_item())) {",
+              "\t\t\treturn i;",
+              "\t\t}",
+              "\t}",
+              "   \treturn -1;",
+              "}"
+             ]
             }
            ],
-           "xtype" : "NoSelection",
-           "| Lsp.DocumentSymbol? getSymoblAt" : [
-            "(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 (Lsp.DocumentSymbol)tr.get_item();",
-            "\t ",
-            "}"
-           ]
+           "xtype" : "NoSelection"
           },
           {
            "$ xns" : "Gtk",
             "pressed" : [
              "(n_press, x, y) => {",
              "\tstring pos;",
-             "  \tvar row = _this.navigation.getRowAt(x,y, out pos );",
-             "    if (row < 0) {",
+             "  \tvar row = _this.navigation.getRowWidgetAt(x,y, out pos );",
+             "",
+             "    if (row == null) {",
              "\t    GLib.debug(\"no row selected items\");",
              "\t    return;",
              "    }",
+             "\tGLib.debug(\"got click on %s\", row.get_type().name());    ",
              "    //Lsp.DocumentSymbol",
-             "    var sym =   _this.navigationselmodel.getSymoblAt(row);",
+             "    var sym =  row.get_data<Lsp.DocumentSymbol>(\"symbol\");",
              "    if (sym == null) {",
              "    \treturn;",
              "\t}",
              "                \"character\" : 39",
              "              }",
              "            },",
-             "            */",
+             "        */",
+             "     GLib.debug(\"goto line %d\",   (int)sym.range.start.line); ",
              "    _this.scroll_to_line((int)sym.range.start.line);",
+             "    Gtk.TextIter iter;",
+             "    _this.buffer.el.get_iter_at_line_offset(out iter, ",
+             "    \t(int)sym.range.start.line,",
+             "    \t(int)sym.range.start.character",
+             "\t);",
+             "    _this.buffer.el.place_cursor(iter);",
              "\t",
              "}"
             ]
          ],
          "string name" : "editor-navigation",
          "xtype" : "ColumnView",
+         "| Gtk.Widget? getRowWidgetAt" : [
+          "(double x,  double  y, out string pos) {",
+          "",
+          "\tpos = \"\";",
+          "\tvar w = this.el.pick(x, y, Gtk.PickFlags.DEFAULT);",
+          "\t//GLib.debug(\"got widget %s\", w == null ? \"nothing\" : w.get_type().name());",
+          "\tif (w == null) {",
+          "\t\treturn null;",
+          "\t}",
+          "\t",
+          "\tvar row= w.get_ancestor(GLib.Type.from_name(\"GtkColumnViewRowWidget\"));",
+          "\tif (row == null) {",
+          "\t\treturn null;",
+          "\t}",
+          "\t",
+          "\t//GLib.debug(\"got colview %s\", row == null ? \"nothing\" : row.get_type().name());",
+          "\t ",
+          " ",
+          "\t",
+          "\t//GLib.debug(\"row number is %d\", rn);",
+          "\t//GLib.debug(\"click %d, %d\", (int)x, (int)y);",
+          "\t// above or belw",
+          "\tGraphene.Rect  bounds;",
+          "\trow.compute_bounds(this.el, out bounds);",
+          "\t//GLib.debug(\"click x=%d, y=%d, w=%d, h=%d\", ",
+          "\t//\t(int)bounds.get_x(), (int)bounds.get_y(),",
+          "\t//\t(int)bounds.get_width(), (int)bounds.get_height()",
+          "\t//\t);",
+          "\tvar ypos = y - bounds.get_y();",
+          "\t//GLib.debug(\"rel ypos = %d\", (int)ypos);\t",
+          "\tvar rpos = 100.0 * (ypos / bounds.get_height());",
+          "\t//GLib.debug(\"rel pos = %d %%\", (int)rpos);",
+          "\tpos = \"over\";",
+          "\t",
+          "\tif (rpos > 80) {",
+          "\t\tpos = \"below\";",
+          "\t} else if (rpos < 20) {",
+          "\t\tpos = \"above\";",
+          "\t} ",
+          "\treturn row;",
+          " }"
+         ],
          "| int getRowAt" : [
           "(double x,  double  y, out string pos) {",
           "",
           "\t",
           "",
           "}"
+         ],
+         "| void updateSelectedLine" : [
+          "(uint line, uint chr) {",
+          "\tif (line == this.last_selected_line) {",
+          "\t\treturn;",
+          "\t}",
+          "\tGLib.debug(\"select line %d\", (int)line);",
+          "\tthis.last_selected_line = (int)line;",
+          "\t",
+          "\t",
+          "\tvar new_row = -1;",
+          "\tvar sym = _this.navliststore.symbolAtLine(line, chr);",
+          "\tif (sym != null) {",
+          "\t \tnew_row = _this.navigationsort.getRowFromSymbol(sym);",
+          " \t\tGLib.debug(\"select line %d - row found %d\", (int)line, new_row);",
+          " \t} else {",
+          " \t\tGLib.debug(\" no symbol found at line %d\", (int)line);",
+          " \t}",
+          " \t",
+          "\tif (this.selected_row != null) { ",
+          "\t\tGLib.debug(\" remove selected row\");",
+          "\t\tthis.selected_row.remove_css_class(\"selected-row\");",
+          "\t}",
+          "\tthis.selected_row  = null;",
+          "\tif (new_row > -1) {",
+          "\t\tthis.el.scroll_to(new_row,null,Gtk.ListScrollFlags.NONE, null);",
+          "\t\tvar row = sym.get_data<Gtk.Widget>(\"widget\");",
+          "\t\tif (row != null) {",
+          "\t\t\tGLib.debug(\" Add selected row\");",
+          " \t\t\t",
+          "\t\t\trow.add_css_class(\"selected-row\");",
+          "\t\t\tthis.selected_row = row;",
+          "",
+          "\t\t\t",
+          "\t\t} else {",
+          "\t\t\tGLib.debug(\"could not find widget on row %d\", new_row);",
+          "\t\t}",
+          "",
+          "\t}",
+          "",
+          "",
+          "}"
          ]
         }
        ],