Fix #8033 - text size zoom
[roobuilder] / src / Builder4 / Editor.bjs
index 16e7df7..9d335fd 100644 (file)
@@ -10,6 +10,7 @@
    "# Xcls_MainWindow window" : "null",
    "# bool dirty" : false,
    "# bool pos" : false,
+   "# int last_error_counter" : 0,
    "# int pos_root_x" : "",
    "# int pos_root_y" : "",
    "# string activeEditor" : "\"\"",
        "* ctor" : "new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL,6, 30, 1)",
        "* init" : [
         "{",
-        "\tthis.el.set_range(6,30);",
-        "\tthis.el.set_value(8);",
+        "\t//this.el.set_range(6,30);",
+        " \tthis.el.set_value ( BuilderApplication.settings.editor_font_size);",
+        " \tBuilderApplication.settings.editor_font_size_updated.connect(",
+        " \t\t() => {",
+        " \t\t\tBuilderApplication.settings.editor_font_size_inchange = true;",
+        " \t\t\tGLib.debug(\"update range\");",
+        " \t\t \tthis.el.set_value (BuilderApplication.settings.editor_font_size);",
+        " \t\t \tBuilderApplication.settings.editor_font_size_inchange = false;",
+        " \t\t}",
+        "\t);",
+        "\t",
+        " ",
         "}",
         ""
        ],
        "listeners" : {
         "change_value" : [
          "(st, val ) => {",
-         "\t ",
-         "\t   ",
-         "\t  _this.view.css.load_from_string(",
-         "\t  \t\t\"#editor-view { font: %dpx monospace; }\".printf((int)val)",
-         "\t   );",
-         "     ",
+         "\tif (BuilderApplication.settings.editor_font_size_inchange) {",
+         "\t\treturn false;",
+         "\t}",
+         "  \tBuilderApplication.settings.editor_font_size = val;",
          " \treturn false;",
          "}"
         ]
        "$ xns" : "GtkSource",
        "* init" : [
         "",
-        "",
-        "this.css = new Gtk.CssProvider();",
-        "",
-        "this.css.load_from_string(",
-        "\t\"#editor-view { font:  12px monospace;}\"",
-        ");",
         " ",
-        "Gtk.StyleContext.add_provider_for_display(",
-        "\tthis.el.get_display(),",
-        "\tthis.css,",
-        "\tGtk.STYLE_PROVIDER_PRIORITY_APPLICATION",
-        ");",
         "\t",
         " ",
-        "\t ",
-        "/*",
-        "this is pretty flakey - triggers Gtk with  < 0 d",
-        " var cp = new GtkSource.CompletionWords(\"test\"); ",
-        " cp.minimum_word_size  = 3;",
-        " //cp.priority = 100; //?? does this do anything",
-        " cp.proposals_batch_size  = 10;",
-        " cp.scan_batch_size = 1000;",
         " ",
-        "cp.register(_this.buffer.el);",
-        "this.el.completion.add_provider(cp);",
-        "*/",
-        "this.el.completion.add_provider(new Palete.CompletionProvider(_this));",
+        "this.el.completion.add_provider(",
+        "\tnew Palete.CompletionProvider(_this)",
+        ");",
         "  ",
         "//this.el.completion.unblock_interactive();",
         "this.el.completion.select_on_show = true; // select",
         "",
         "",
         "var attrs = new GtkSource.MarkAttributes();",
-        "var  pink =   Gdk.RGBA();",
-        "pink.parse ( \"pink\");",
-        "attrs.set_background ( pink);",
+        "",
         "attrs.set_icon_name ( \"process-stop\");    ",
         "attrs.query_tooltip_text.connect(( mark) => {",
         "     GLib.debug(\"tooltip query? %s\", mark.name);",
         "});",
         "this.el.set_mark_attributes (\"ERR\", attrs, 1);",
         "attrs.ref();",
-        " var wattrs = new GtkSource.MarkAttributes();",
-        "var  blue =   Gdk.RGBA();",
-        "blue.parse ( \"#ABF4EB\");",
-        "wattrs.set_background ( blue);",
+        "",
+        "",
+        "var wattrs = new GtkSource.MarkAttributes();",
         "wattrs.set_icon_name ( \"process-stop\");    ",
         "wattrs.query_tooltip_text.connect(( mark) => {",
         "     GLib.debug(\"tooltip query? %s\", mark.name);",
         "this.el.set_mark_attributes (\"WARN\", wattrs, 1);",
         "wattrs.ref();",
         "",
+        " ",
+        "var dattrs = new GtkSource.MarkAttributes();",
+        " ",
+        "dattrs.set_icon_name ( \"process-stop\"); ",
         "",
-        " var dattrs = new GtkSource.MarkAttributes();",
-        "var  purple =   Gdk.RGBA();",
-        "purple.parse ( \"#EEA9FF\");",
-        "dattrs.set_background ( purple);",
-        "dattrs.set_icon_name ( \"process-stop\");    ",
         "dattrs.query_tooltip_text.connect(( mark) => {",
         "\tGLib.debug(\"tooltip query? %s\", mark.name);",
         "    return strdup(mark.name);",
         "});",
-        "dattrs.query_tooltip_markup.connect(( mark) => {",
-        "\tGLib.debug(\"tooltip query? %s\", mark.name);",
-        "    return strdup(mark.name);",
-        "});",
+        "//dattrs.query_tooltip_markup.connect(( mark) => {",
+        "//\tGLib.debug(\"tooltip query? %s\", mark.name);",
+        " //   return strdup(mark.name);",
+        "//});",
         "this.el.set_mark_attributes (\"DEPR\", dattrs, 1);",
         "dattrs.ref();    ",
         "",
        "bool vexpand" : true,
        "boolean show_line_marks" : true,
        "boolean show_line_numbers" : true,
+       "css_classes" : "{ \"code-editor\" }",
        "gboolean highlight_current_line" : true,
        "id" : "view",
        "indent_width" : 4,
          "$ xns" : "GtkSource",
          "$ xtype" : "Buffer",
          "* init" : [
-          "{",
-          "\tvar buf = this.el;",
-          "\tbuf.create_tag (\"bold\", \"weight\", Pango.Weight.BOLD);",
-          "    buf.create_tag (\"type\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#204a87\");",
-          "    buf.create_tag (\"keyword\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#a40000\");",
-          "    buf.create_tag (\"text\", \"weight\", Pango.Weight.NORMAL, \"foreground\", \"#729fcf\");",
-          "    buf.create_tag (\"number\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#ad7fa8\");",
-          "    buf.create_tag (\"method\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#729fcf\");",
-          "    buf.create_tag (\"property\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#BC1F51\");",
-          "    buf.create_tag (\"variable\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#A518B5\");",
           "",
-          "}",
+          "var buf = this.el;",
+          "buf.create_tag (\"bold\", \"weight\", Pango.Weight.BOLD);",
+          "buf.create_tag (\"type\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#204a87\");",
+          "buf.create_tag (\"keyword\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#a40000\");",
+          "buf.create_tag (\"text\", \"weight\", Pango.Weight.NORMAL, \"foreground\", \"#729fcf\");",
+          "buf.create_tag (\"number\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#ad7fa8\");",
+          "buf.create_tag (\"method\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#729fcf\");",
+          "buf.create_tag (\"property\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#BC1F51\");",
+          "buf.create_tag (\"variable\", \"weight\", Pango.Weight.BOLD, \"foreground\", \"#A518B5\");",
+          "",
+          "",
+          "buf.create_tag (\"ERR\", \"weight\", Pango.Weight.BOLD, \"background\", \"pink\");",
+          "buf.create_tag (\"WARN\", \"weight\", Pango.Weight.BOLD, \"background\", \"#ABF4EB\");",
+          "buf.create_tag (\"DEPR\", \"weight\", Pango.Weight.BOLD, \"background\", \"#EEA9FF\");",
+          "",
+          "",
           ""
          ],
          "* prop" : "buffer",
            ""
           ]
          },
-         "| bool checkSyntax" : [
-          " () {",
-          " ",
-          "    ",
-          "    var str = this.toString();",
-          "    ",
-          "    // needed???",
-          "    if (this.error_line > 0) {",
-          "         Gtk.TextIter start;",
-          "         Gtk.TextIter end;     ",
-          "        this.el.get_bounds (out start, out end);",
-          "",
-          "        this.el.remove_source_marks (start, end, null);",
-          "    }",
-          "    if (str.length < 1) {",
-          "        print(\"checkSyntax - empty string?\\n\");",
-          "        return true;",
-          "    }",
-          "    ",
-          "    // bit presumptiona",
-          "    if (_this.file.xtype == \"PlainFile\") {",
-          "    ",
-          "        // assume it's gtk...",
-          "         var  oldcode =_this.file.toSource();",
-          "        _this.file.setSource(str);",
-          "        _this.file.getLanguageServer().document_change(_this.file);",
-          "\t    BuilderApplication.showSpinner(\"appointment soon\",\"document change pending\");",
-          "        _this.file.setSource(oldcode);",
-          "        ",
-          "\t\t ",
-          "        return true;",
-          "    ",
-          "    }",
-          "   if (_this.file == null) {",
-          "       return true;",
-          "   }",
-          " ",
-          "    ",
-          "",
-          "      ",
-          "     ",
-          "    GLib.debug(\"calling validate\");    ",
-          "    // clear the buttons.",
-          " \tif (_this.prop.name == \"xns\" || _this.prop.name == \"xtype\") {",
-          "\t\treturn true ;",
-          "\t}",
-          "\tvar oldcode  = _this.prop.val;",
-          "\t",
-          "\t_this.prop.val = str;",
-          "\t_this.node.updated_count++;",
-          "    _this.file.getLanguageServer().document_change(_this.file);",
-          "    _this.node.updated_count++;",
-          "    _this.prop.val = oldcode;",
-          "    ",
-          "    ",
-          "    //print(\"done mark line\\n\");",
-          "     ",
-          "    return true; // at present allow saving - even if it's invalid..",
-          "}",
-          ""
-         ],
-         "| bool highlightErrors" : [
-          "( Gee.HashMap<int,string> validate_res) {",
-          "         ",
-          "\tthis.error_line = validate_res.size;",
-          "",
-          "\tif (this.error_line < 1) {",
-          "\t\treturn true;",
-          "\t}",
-          "\tvar tlines = this.el.get_line_count ();",
-          "\tGtk.TextIter iter;",
-          "\tvar valiter = validate_res.map_iterator();",
-          "\twhile (valiter.next()) {",
-          "",
-          "\t//        print(\"get inter\\n\");",
-          "\t\tvar eline = valiter.get_key();",
-          "\t\tif (eline > tlines) {",
-          "\t\t\tcontinue;",
-          "\t\t}",
-          "\t\tthis.el.get_iter_at_line( out iter, eline);",
-          "\t\t//print(\"mark line\\n\");",
-          "\t\tthis.el.create_source_mark(valiter.get_value(), \"ERR\", iter);",
-          "\t}   ",
-          "\treturn false;",
-          "}"
-         ],
-         "| bool highlightErrorsJson" : [
+         "| bool OLDhighlightErrorsJson" : [
           "(string type, Json.Object obj) {",
           "\tGtk.TextIter start;",
           "\tGtk.TextIter end;     ",
           "\t}",
           ""
          ],
+         "| bool checkSyntax" : [
+          " () {",
+          " ",
+          "    ",
+          "    var str = this.toString();",
+          "    ",
+          "    // needed???",
+          "    if (this.error_line > 0) {",
+          "         Gtk.TextIter start;",
+          "         Gtk.TextIter end;     ",
+          "        this.el.get_bounds (out start, out end);",
+          "",
+          "        this.el.remove_source_marks (start, end, null);",
+          "    }",
+          "    if (str.length < 1) {",
+          "        print(\"checkSyntax - empty string?\\n\");",
+          "        return true;",
+          "    }",
+          "    ",
+          "    // bit presumptiona",
+          "    if (_this.file.xtype == \"PlainFile\") {",
+          "    ",
+          "        // assume it's gtk...",
+          "         var  oldcode =_this.file.toSource();",
+          "        _this.file.setSource(str);",
+          "\t    BuilderApplication.showSpinner(\"appointment soon\",\"document change pending\");",
+          "    \t_this.file.getLanguageServer().document_change(_this.file);",
+          "",
+          "        _this.file.setSource(oldcode);",
+          "        ",
+          "\t\t ",
+          "        return true;",
+          "    ",
+          "    }",
+          "   if (_this.file == null) {",
+          "       return true;",
+          "   }",
+          " ",
+          "    ",
+          "",
+          "      ",
+          "     ",
+          "    GLib.debug(\"calling validate\");    ",
+          "    // clear the buttons.",
+          " \tif (_this.prop.name == \"xns\" || _this.prop.name == \"xtype\") {",
+          "\t\treturn true ;",
+          "\t}",
+          "\tvar oldcode  = _this.prop.val;",
+          "\t",
+          "\t_this.prop.val = str;",
+          "\t_this.node.updated_count++;",
+          "    _this.file.getLanguageServer().document_change(_this.file);",
+          "    _this.node.updated_count++;",
+          "    _this.prop.val = oldcode;",
+          "    ",
+          "    ",
+          "    //print(\"done mark line\\n\");",
+          "     ",
+          "    return true; // at present allow saving - even if it's invalid..",
+          "}",
+          ""
+         ],
+         "| bool highlightErrors" : [
+          "( Gee.HashMap<int,string> validate_res) {",
+          "         ",
+          "\tthis.error_line = validate_res.size;",
+          "",
+          "\tif (this.error_line < 1) {",
+          "\t\treturn true;",
+          "\t}",
+          "\tvar tlines = this.el.get_line_count ();",
+          "\tGtk.TextIter iter;",
+          "\tvar valiter = validate_res.map_iterator();",
+          "\twhile (valiter.next()) {",
+          "",
+          "\t//        print(\"get inter\\n\");",
+          "\t\tvar eline = valiter.get_key();",
+          "\t\tif (eline > tlines) {",
+          "\t\t\tcontinue;",
+          "\t\t}",
+          "\t\tthis.el.get_iter_at_line( out iter, eline);",
+          "\t\t//print(\"mark line\\n\");",
+          "\t\tthis.el.create_source_mark(valiter.get_value(), \"ERR\", iter);",
+          "\t}   ",
+          "\treturn false;",
+          "}"
+         ],
          "| string toString" : [
           "  () {",
           "    ",
          ]
         },
         {
+         "# bool is_control" : false,
          "$ xns" : "Gtk",
+         "id" : "keystate",
          "listeners" : {
+          "key_pressed" : [
+           "(keyval, keycode, state) => {",
+           "",
+           " \tif (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {",
+           " \t\tthis.is_control = true;",
+           "\t}",
+           "\treturn false;",
+           "}",
+           ""
+          ],
           "key_released" : [
            "(keyval, keycode, state) => {",
            "",
-           "  ",
+           " \t if (keyval == Gdk.Key.Control_L || keyval == Gdk.Key.Control_R) {",
+           " \t\tthis.is_control = false;",
+           "\t}",
            "    if (keyval == Gdk.Key.s && (state & Gdk.ModifierType.CONTROL_MASK ) > 0 ) {",
            "        GLib.debug(\"SAVE: ctrl-S  pressed\");",
            "        _this.saveContents();",
           ]
          },
          "xtype" : "EventControllerKey"
+        },
+        {
+         "# double distance" : "0.0f",
+         "$ xns" : "Gtk",
+         "Gtk.EventControllerScrollFlags flags" : "Gtk.EventControllerScrollFlags.VERTICAL",
+         "listeners" : {
+          "scroll" : [
+           "(dx, dy) => {",
+           "\tif (!_this.keystate.is_control) {",
+           "\t\treturn false;",
+           "\t}",
+           "\t//GLib.debug(\"scroll %f\",  dy);",
+           "\t",
+           "\tthis.distance += dy;",
+           "\tif (this.distance < 1) {",
+           "\t\tBuilderApplication.settings.editor_font_size ++;",
+           "\t\tthis.distance = 0;",
+           "\t}",
+           "\tif (this.distance > -1) {",
+           "\t\tBuilderApplication.settings.editor_font_size --;",
+           "\t\tthis.distance = 0;",
+           "\t}",
+           "",
+           "\treturn true;",
+           "}",
+           ""
+          ]
+         },
+         "xtype" : "EventControllerScroll"
         }
        ],
        "listeners" : {
         "    _this.dirty = false;",
         "    this.el.grab_focus();",
         "    _this.save_button.el.sensitive = false;",
+        "    _this.last_error_counter = -1;",
         "}"
        ]
       }
     "",
     "\tif (this.searchcontext == null) {",
     "\t\treturn;",
-    "\t} ",
+    "\t}",
     "\t",
     "\tGtk.TextIter beg, st,en;",
     "\tbool has_wrapped_around;",
     "",
     "        // find the text for the node..",
     "        this.view.load( prop.val );",
-    "        ",
+    "        this.updateErrorMarks();",
     "        ",
     "        this.close_btn.el.show();       ",
     "    ",
     "    } else {",
     "        this.view.load(        file.toSource() );",
+    "         this.updateErrorMarks();",
     "        this.close_btn.el.hide();",
+    "        ",
     "    }",
     " ",
     "}"
    ],
    "| void updateErrorMarks" : [
-    "(string category) {",
+    "() {",
     "\t",
     " ",
     "",
     "\tGtk.TextIter end;     ",
     "\tbuf.get_bounds (out start, out end);",
     "",
-    "\tbuf.remove_source_marks (start, end, category);",
+    "\t",
+    "",
     " ",
     "\t//GLib.debug(\"highlight errors\");\t\t ",
     "",
     "\t\treturn;",
     "",
     "\t}",
-    "\tvar ar = this.file.getErrors(category);",
-    "\tif (ar == null || ar.get_n_items() < 1) {",
+    "\tvar ar = this.file.getErrors();",
+    "\tif (ar.size < 1) {",
+    "\t\tbuf.remove_source_marks (start, end, \"ERR\");",
+    "\t\tbuf.remove_source_marks (start, end, \"WARN\");",
+    "\t\tbuf.remove_source_marks (start, end, \"DEPR\");",
+    "\t\tbuf.remove_tag_by_name (\"ERR\", start, end);",
+    "\t\tbuf.remove_tag_by_name (\"WARN\", start, end);",
+    "\t\tbuf.remove_tag_by_name (\"DEPR\", start, end);",
+    "\t\tthis.last_error_counter = file.error_counter ;",
     "\t\t//GLib.debug(\"highlight %s :  %s has no errors\", this.file.relpath, category);",
     "\t\treturn;",
     "\t}",
-    " ",
+    "\t",
     "",
-    " ",
+    " // basicaly check if there is no change, then we do not do any update..",
+    " // we can do this by just using an error counter?",
+    " // if that's changed then we will do an update, otherwise dont bother.",
+    "\t  ",
     "\t",
     "\tvar offset = 0;",
-    "\t ",
+    "\tvar hoffset = 0;",
     "",
     "\tvar tlines = buf.get_line_count () +1;",
     "\t",
     "\tif (_this.prop != null) {",
     "\t\t// this still seems flaky...",
-    "\t\t",
+    "",
     "\t\ttlines = _this.prop.end_line;",
     "\t\toffset = _this.prop.start_line;",
+    "\t\thoffset = _this.node.node_pad.length + 2; //shift it left  by 2 ? ..",
+    "\t\t",
     "\t\t ",
-    "\t}",
-    "\t ",
-    "\tfor (var i = 0; i < ar.get_n_items();i++) {",
-    "\t\tvar err = (Palete.CompileError) ar.get_item(i);",
+    "\t} else {",
+    "\t\t// no update...",
+    "\t\tif (this.last_error_counter == file.error_counter) {",
     "\t\t",
+    "\t\t\treturn;",
+    "\t\t}",
+    "\t",
+    "\t}",
+    "\tbuf.remove_source_marks (start, end, \"ERR\");",
+    "\tbuf.remove_source_marks (start, end, \"WARN\");",
+    "\tbuf.remove_source_marks (start, end, \"DEPR\");",
+    "\tbuf.remove_tag_by_name (\"ERR\", start, end);",
+    "\tbuf.remove_tag_by_name (\"WARN\", start, end);",
+    "\tbuf.remove_tag_by_name (\"DEPR\", start, end);",
+    "\t",
+    "\tforeach(var diag in ar) { ",
     "\t     Gtk.TextIter iter;",
     "//        print(\"get inter\\n\");",
-    "\t    var eline = err.line - offset;",
+    "\t    var eline = (int)diag.range.start.line - offset;",
+    "\t    var eline_to = (int)diag.range.end.line - offset;",
+    "\t    //var eline =  diag.range.end_line - offset;",
     "\t    //GLib.debug(\"GOT ERROR on line %d -- converted to %d  (offset = %d)\",",
     "\t    //\terr.line ,eline, offset);",
     "\t    ",
     "\t    ",
     "\t    if (eline > tlines || eline < 0) {",
-    "\t        return;",
+    "\t        continue;",
     "\t    }",
-    "\t   ",
     "\t    ",
     "\t    buf.get_iter_at_line( out iter, eline);",
-    "\t   ",
-    "\t   ",
-    "\t\tvar msg = \"Line: %d %s : %s\".printf(eline+1, err.category, err.msg);",
-    "\t    buf.create_source_mark( msg, err.category, iter);",
+    "\t   \tvar msg = \"Line: %d %s : %s\".printf(eline+1, diag.category, diag.message);",
+    "\t    buf.create_source_mark( msg, diag.category, iter);",
+    "\t    ",
+    " \t    var spos = (int)diag.range.start.character - hoffset;",
+    " \t    if (spos < 0) { spos =0 ; }",
+    " \t    if (spos > iter.get_chars_in_line()) {",
+    " \t    \tspos = iter.get_chars_in_line();",
+    "    \t}",
+    "\t\tbuf.get_iter_at_line( out iter, eline_to);",
+    "\t\tvar epos = (int)diag.range.end.character - hoffset;",
+    " \t    if (epos < 0) { epos =0 ; }",
+    " \t    if (epos > iter.get_chars_in_line()) {",
+    " \t    \tepos = iter.get_chars_in_line();",
+    "    \t}",
+    " \t     ",
+    " \t    ",
+    " \t    buf.get_iter_at_line_offset( out start, eline, spos); ",
+    " \t   ",
+    " \t    buf.get_iter_at_line_offset( out end, eline_to,epos); ",
+    " \t    \t",
+    "\t    buf.apply_tag_by_name(diag.category, start, end);",
+    "\t    ",
     "\t   // GLib.debug(\"set line %d to %s\", eline, msg);",
     "\t    //this.marks.set(eline, msg);",
     "\t}",
-    "\treturn ;",
+    "\tthis.last_error_counter = file.error_counter ;",
     "",
     "",
     "",