diff --git a/data/io.elementary.code.gschema.xml b/data/io.elementary.code.gschema.xml index 1794882fa9..d0bad47f8d 100644 --- a/data/io.elementary.code.gschema.xml +++ b/data/io.elementary.code.gschema.xml @@ -121,6 +121,7 @@ Whether Code should use auto indentation + 4 Tab Size Specifies the number of spaces that should be displayed instead of Tab characters. diff --git a/plugins/editorconfig/editorconfig.vala b/plugins/editorconfig/editorconfig.vala index 79e99efb30..8a5b8f4285 100644 --- a/plugins/editorconfig/editorconfig.vala +++ b/plugins/editorconfig/editorconfig.vala @@ -32,7 +32,11 @@ public class Scratch.Plugins.EditorConfigPlugin: Peas.ExtensionBase, Peas.Activa }); plugins.hook_document.connect ((d) => { - format_bar.tab_set_by_editor_config = false; + // Ensure use global settings by default + format_bar.tab_style_set_by_editor_config = false; + format_bar.tab_width_set_by_editor_config = false; + format_bar.set_document (d); + Scratch.Widgets.SourceView view = d.source_view; File file = d.file; @@ -52,13 +56,13 @@ public class Scratch.Plugins.EditorConfigPlugin: Peas.ExtensionBase, Peas.Activa /* These are all properties (https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties) */ switch (name) { case "indent_style": - format_bar.tab_set_by_editor_config = true; + format_bar.tab_style_set_by_editor_config = true; var use_spaces = (val != "tab"); format_bar.set_insert_spaces_instead_of_tabs (use_spaces); break; case "indent_size": case "tab_width": - format_bar.tab_set_by_editor_config = true; + format_bar.tab_width_set_by_editor_config = true; var indent_width = (int.parse (val)).clamp (2, 16); format_bar.set_tab_width (indent_width); break; @@ -73,6 +77,9 @@ public class Scratch.Plugins.EditorConfigPlugin: Peas.ExtensionBase, Peas.Activa case "max_line_length": view.right_margin_position = int.parse (val); break; + default: + warning ("unrecognised name/value %s/%s", name, val); + break; } } }); diff --git a/src/Widgets/FormatBar.vala b/src/Widgets/FormatBar.vala index 04c3ca0fb6..53d4673eef 100644 --- a/src/Widgets/FormatBar.vala +++ b/src/Widgets/FormatBar.vala @@ -18,8 +18,12 @@ */ public class Code.FormatBar : Gtk.Box { - public bool tab_set_by_editor_config { get; set; default = false; } + public bool tab_style_set_by_editor_config { get; set; default = false; } + public bool tab_width_set_by_editor_config { get; set; default = false; } public FormatButton line_menubutton { get; private set;} + public Gtk.InfoBar editorconfig_infobar { get; set construct; } + public Gtk.Box tab_box { get; set construct; } + public Gtk.SpinButton width_spinbutton { get; set construct; } private FormatButton lang_menubutton; private FormatButton tab_menubutton; @@ -137,7 +141,7 @@ public class Code.FormatBar : Gtk.Box { } private void create_tabulation_popover () { - var editorconfig_infobar = new Gtk.InfoBar () { + editorconfig_infobar = new Gtk.InfoBar () { margin_top = 9, margin_end = 9, margin_start = 9 @@ -154,15 +158,15 @@ public class Code.FormatBar : Gtk.Box { hexpand = true }; - var tab_width = new Gtk.SpinButton.with_range (1, 24, 1); + width_spinbutton = new Gtk.SpinButton.with_range (2, 16, 1); - var tab_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 12) { + tab_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 12) { margin_top = 6, margin_end = 12, margin_start = 12, }; tab_box.add (width_label); - tab_box.add (tab_width); + tab_box.add (width_spinbutton); var box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0) { margin_bottom = 12 @@ -180,27 +184,42 @@ public class Code.FormatBar : Gtk.Box { tab_menubutton.popover = tab_popover; - Scratch.settings.bind ("auto-indent", autoindent_modelbutton, "active", SettingsBindFlags.DEFAULT); - Scratch.settings.bind ("indent-width", tab_width, "value", SettingsBindFlags.GET); - Scratch.settings.bind ("spaces-instead-of-tabs", space_tab_modelbutton, "active", SettingsBindFlags.GET); Scratch.settings.changed["indent-width"].connect (format_tab_header_from_global_settings); Scratch.settings.changed["spaces-instead-of-tabs"].connect (format_tab_header_from_global_settings); + Scratch.settings.bind ("auto-indent", autoindent_modelbutton, "active", SettingsBindFlags.DEFAULT); - bind_property ("tab-set-by-editor-config", editorconfig_infobar, "revealed", BindingFlags.SYNC_CREATE); - bind_property ("tab-set-by-editor-config", space_tab_modelbutton, "sensitive", BindingFlags.INVERT_BOOLEAN | BindingFlags.SYNC_CREATE); - bind_property ("tab-set-by-editor-config", tab_box, "sensitive", BindingFlags.INVERT_BOOLEAN | BindingFlags.SYNC_CREATE); + format_tab_header_from_global_settings (); + width_spinbutton.value_changed.connect (() => { + if (!tab_width_set_by_editor_config) { + Scratch.settings.set_int ( + "indent-width", + (int)width_spinbutton.@value + ); + } + }); + + space_tab_modelbutton.clicked.connect (() => { + if (!tab_style_set_by_editor_config) { + Scratch.settings.set_boolean ( + "spaces-instead-of-tabs", + space_tab_modelbutton.active + ); + } + }); } private void format_tab_header_from_global_settings () { - if (tab_set_by_editor_config) { - return; + if (!tab_style_set_by_editor_config) { + set_insert_spaces_instead_of_tabs (Scratch.settings.get_boolean ("spaces-instead-of-tabs")); } - var indent_width = Scratch.settings.get_int ("indent-width"); - var spaces_instead_of_tabs = Scratch.settings.get_boolean ("spaces-instead-of-tabs"); + if (!tab_width_set_by_editor_config) { + set_tab_width (Scratch.settings.get_int ("indent-width")); + } - set_tab_width (indent_width); - set_insert_spaces_instead_of_tabs (spaces_instead_of_tabs); + editorconfig_infobar.revealed = tab_style_set_by_editor_config || tab_width_set_by_editor_config; + space_tab_modelbutton.sensitive = !tab_style_set_by_editor_config; + tab_box.sensitive = !tab_width_set_by_editor_config; } private void format_line_header () { @@ -209,7 +228,6 @@ public class Code.FormatBar : Gtk.Box { Gtk.TextIter iter; buffer.get_iter_at_offset (out iter, position); var line = iter.get_line () + 1; - line_menubutton.text = "%d.%d".printf (line, iter.get_line_offset () + 1); goto_entry.text = "%d.%d".printf (line, iter.get_line_offset () + 1); } @@ -236,9 +254,7 @@ public class Code.FormatBar : Gtk.Box { // We need to connect_after because otherwise, the text isn't parsed into the "value" property and we only get the previous value goto_entry.activate.connect_after (() => { int line, column; - goto_entry.text = goto_entry.text.replace (":", "."); - goto_entry.text.scanf ("%i.%i", out line, out column); doc.source_view.go_to_line (line, column - 1); // Focuses parent to the source view, so that the cursor, which indicates line and column is actually visible. @@ -250,6 +266,7 @@ public class Code.FormatBar : Gtk.Box { if (this.doc != null) { this.doc.source_view.buffer.notify["cursor-position"].disconnect (format_line_header); } + this.doc = doc; update_current_lang (); format_tab_header_from_global_settings (); @@ -265,6 +282,7 @@ public class Code.FormatBar : Gtk.Box { } public void set_tab_width (int indent_width) { + width_spinbutton.@value = indent_width; if (space_tab_modelbutton.active) { tab_menubutton.text = ngettext ("%d Space", "%d Spaces", indent_width).printf (indent_width); } else { diff --git a/src/Widgets/SourceView.vala b/src/Widgets/SourceView.vala index 349d3007c5..ef67e56d1d 100644 --- a/src/Widgets/SourceView.vala +++ b/src/Widgets/SourceView.vala @@ -241,9 +241,10 @@ namespace Scratch.Widgets { auto_indent = Scratch.settings.get_boolean ("auto-indent"); show_right_margin = Scratch.settings.get_boolean ("show-right-margin"); right_margin_position = Scratch.settings.get_int ("right-margin-position"); + insert_spaces_instead_of_tabs = Scratch.settings.get_boolean ("spaces-instead-of-tabs"); var source_buffer = (Gtk.SourceBuffer) buffer; source_buffer.highlight_matching_brackets = Scratch.settings.get_boolean ("highlight-matching-brackets"); - + space_drawer.enable_matrix = false; switch ((ScratchDrawSpacesState) Scratch.settings.get_enum ("draw-spaces")) { case ScratchDrawSpacesState.ALWAYS: space_drawer.set_types_for_locations ( @@ -269,9 +270,10 @@ namespace Scratch.Widgets { break; } + space_drawer.enable_matrix = true; update_draw_spaces (); - insert_spaces_instead_of_tabs = Scratch.settings.get_boolean ("spaces-instead-of-tabs"); + tab_width = (uint) Scratch.settings.get_int ("indent-width"); if (Scratch.settings.get_boolean ("line-wrap")) { set_wrap_mode (Gtk.WrapMode.WORD);