From cd947cb25bcde2d11d50567bd670e93ac63e20b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 25 Aug 2026 12:24:10 -0700 Subject: [PATCH 1/5] SearchBar: improve settings handling --- src/Widgets/SearchBar.vala | 106 ++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/src/Widgets/SearchBar.vala b/src/Widgets/SearchBar.vala index 6d90cec0e..cd749b49b 100644 --- a/src/Widgets/SearchBar.vala +++ b/src/Widgets/SearchBar.vala @@ -62,10 +62,6 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou * "Down", it will go at the start of the file to search for the content * of the search entry. **/ - private Granite.SwitchModelButton cycle_search_button ; - private Gtk.ComboBoxText case_sensitive_search_button; - private Granite.SwitchModelButton regex_search_button; - private Granite.SwitchModelButton whole_word_search_button; private Gtk.SearchEntry search_entry; private Gtk.SearchEntry replace_entry; private Gtk.Label search_occurence_count_label; @@ -116,9 +112,9 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou }; tool_arrow_up.clicked.connect (search_previous); - cycle_search_button = new Granite.SwitchModelButton (_("Cyclic Search")); + var cycle_search_button = new Granite.SwitchModelButton (_("Cyclic Search")); - case_sensitive_search_button = new Gtk.ComboBoxText (); + var case_sensitive_search_button = new Gtk.ComboBoxText (); case_sensitive_search_button.append ("never", _("Never")); case_sensitive_search_button.append ("mixed", _("Mixed Case")); case_sensitive_search_button.append ("always", _("Always")); @@ -131,8 +127,8 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou case_sensitive_box.add (case_sensitive_search_button); case_sensitive_box.get_style_context ().add_class (Gtk.STYLE_CLASS_MENUITEM); - regex_search_button = new Granite.SwitchModelButton (_("Use Regular Expressions")); - whole_word_search_button = new Granite.SwitchModelButton (_("Match Whole Words")); + var regex_search_button = new Granite.SwitchModelButton (_("Use Regular Expressions")); + var whole_word_search_button = new Granite.SwitchModelButton (_("Match Whole Words")); var search_option_box = new Gtk.Box (VERTICAL, 0) { margin_top = 3, @@ -158,10 +154,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou }; search_menubutton.add (search_buttonbox); - cycle_search_button.toggled.connect (on_search_parameters_changed); - case_sensitive_search_button.changed.connect (on_search_parameters_changed); - whole_word_search_button.toggled.connect (on_search_parameters_changed); - regex_search_button.toggled.connect (on_search_parameters_changed); + settings.changed.connect (on_settings_changed); // Bind some application settings settings.bind ("cyclic-search", cycle_search_button, "active", DEFAULT); @@ -170,18 +163,10 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou settings.bind ("regex-search", regex_search_button, "active", DEFAULT); // These settings are ignored when regex searching - regex_search_button.bind_property ( - "active", cycle_search_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN - ); - regex_search_button.bind_property ( - "active", whole_word_search_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN - ); - regex_search_button.bind_property ( - "active", case_sensitive_search_label, "sensitive", SYNC_CREATE | INVERT_BOOLEAN - ); - regex_search_button.bind_property ( - "active", case_sensitive_search_button, "sensitive", SYNC_CREATE | INVERT_BOOLEAN - ); + settings.bind ("regex-search", cycle_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", whole_word_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", case_sensitive_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", case_sensitive_search_label, "sensitive", INVERT_BOOLEAN); var search_box = new Gtk.Box (HORIZONTAL, 0) { margin_top = 3, @@ -227,7 +212,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou replace_flow_box_child.add (replace_grid); // Connecting to some signals - search_entry.changed.connect (on_search_parameters_changed); + search_entry.changed.connect (on_search_entry_changed); search_entry.notify["is-focus"].connect (() => { if (search_entry.is_focus && text_buffer != null) { Idle.add (() => { @@ -287,8 +272,8 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou this.text_buffer = text_view.get_buffer (); this.text_buffer.changed.connect (update_search_widgets); this.search_context = new Gtk.SourceSearchContext (text_buffer as Gtk.SourceBuffer, null); - search_context.settings.wrap_around = cycle_search_button.active; - search_context.settings.regex_enabled = regex_search_button.active; + search_context.settings.wrap_around = settings.get_boolean ("cyclic-search"); + search_context.settings.regex_enabled = settings.get_boolean ("regex-search"); search_context.settings.search_text = search_entry.text; update_search_widgets (); } @@ -337,7 +322,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou Gtk.TextIter? start_iter, end_iter; if (text_buffer != null) { text_buffer.get_selection_bounds (out start_iter, out end_iter); - if (!search_for_iter_backward (start_iter, out end_iter) && cycle_search_button.active) { + if (!search_for_iter_backward (start_iter, out end_iter) && settings.get_boolean ("cyclic-search")) { text_buffer.get_end_iter (out start_iter); search_for_iter_backward (start_iter, out end_iter); } @@ -351,7 +336,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou Gtk.TextIter? start_iter, end_iter, end_iter_tmp; if (text_buffer != null) { text_buffer.get_selection_bounds (out start_iter, out end_iter); - if (!search_for_iter (end_iter, out end_iter_tmp) && cycle_search_button.active) { + if (!search_for_iter (end_iter, out end_iter_tmp) && settings.get_boolean ("cyclic-search")) { text_buffer.get_start_iter (out start_iter); search_for_iter (start_iter, out end_iter); } @@ -456,31 +441,44 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou this.window.get_current_document ().toggle_changed_handlers (true); } - // Called when one of the settings buttons or the search term changes - private void on_search_parameters_changed () { - if (search_context != null) { - var search_string = search_entry.text; - search_context.settings.search_text = search_string; - var case_mode = (CaseSensitiveMode)(case_sensitive_search_button.active); - switch (case_mode) { - case CaseSensitiveMode.NEVER: - search_context.settings.case_sensitive = false; - break; - case CaseSensitiveMode.MIXED: - var found = ((search_string.up () == search_string) || - (search_string.down () == search_string) - ); - search_context.settings.case_sensitive = !found; - break; - case CaseSensitiveMode.ALWAYS: - search_context.settings.case_sensitive = true; - break; - default: - assert_not_reached (); - } + private void on_settings_changed (string key) requires (search_context != null) { + switch (key) { + case "case-sensitive-search": + switch (settings.get_enum (key)) { + case CaseSensitiveMode.NEVER: + search_context.settings.case_sensitive = false; + break; + case CaseSensitiveMode.MIXED: + var found = ( + search_entry.text.up () == search_entry.text || + search_entry.text.down () == search_entry.text + ); + search_context.settings.case_sensitive = !found; + break; + case CaseSensitiveMode.ALWAYS: + search_context.settings.case_sensitive = true; + break; + default: + assert_not_reached (); + } + break; + case "regex-search": + search_context.settings.regex_enabled = settings.get_boolean (key); + break; + case "wholeword-search": + search_context.settings.at_word_boundaries = settings.get_boolean (key); + break; + default: + // Don't update widgets for non-search settings change + return; + } - search_context.settings.at_word_boundaries = whole_word_search_button.active; - search_context.settings.regex_enabled = regex_search_button.active; + update_search_widgets (); + } + + private void on_search_entry_changed () { + if (search_context != null) { + search_context.settings.search_text = search_entry.text; } update_search_widgets (); @@ -596,7 +594,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou tool_arrow_up.sensitive = false; tool_arrow_down.sensitive = false; } else { - if (cycle_search_button.active) { + if (settings.get_boolean ("cyclic-search")) { tool_arrow_down.sensitive = true; tool_arrow_up.sensitive =true; } else { From 3c3f3b89369280fc45832099348d3614900d22db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 25 Aug 2026 12:47:05 -0700 Subject: [PATCH 2/5] Recycle search_settings and bind --- src/Widgets/SearchBar.vala | 64 ++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/Widgets/SearchBar.vala b/src/Widgets/SearchBar.vala index cd749b49b..8b9fd7f7b 100644 --- a/src/Widgets/SearchBar.vala +++ b/src/Widgets/SearchBar.vala @@ -70,6 +70,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou private Scratch.Widgets.SourceView? text_view = null; private Gtk.TextBuffer? text_buffer = null; private Gtk.SourceSearchContext? search_context; + private Gtk.SourceSearchSettings search_settings; private uint update_search_label_timeout_id = 0; private Gtk.Revealer revealer; private Gtk.EventControllerKey key_controller; @@ -154,20 +155,6 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou }; search_menubutton.add (search_buttonbox); - settings.changed.connect (on_settings_changed); - - // Bind some application settings - settings.bind ("cyclic-search", cycle_search_button, "active", DEFAULT); - settings.bind ("wholeword-search", whole_word_search_button, "active", DEFAULT); - settings.bind ("case-sensitive-search", case_sensitive_search_button, "active-id", DEFAULT); - settings.bind ("regex-search", regex_search_button, "active", DEFAULT); - - // These settings are ignored when regex searching - settings.bind ("regex-search", cycle_search_button, "sensitive", INVERT_BOOLEAN); - settings.bind ("regex-search", whole_word_search_button, "sensitive", INVERT_BOOLEAN); - settings.bind ("regex-search", case_sensitive_search_button, "sensitive", INVERT_BOOLEAN); - settings.bind ("regex-search", case_sensitive_search_label, "sensitive", INVERT_BOOLEAN); - var search_box = new Gtk.Box (HORIZONTAL, 0) { margin_top = 3, margin_end = 3, @@ -211,8 +198,28 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou replace_flow_box_child.can_focus = false; replace_flow_box_child.add (replace_grid); + search_settings = new Gtk.SourceSearchSettings (); + + // Bind some application settings + settings.bind ("case-sensitive-search", case_sensitive_search_button, "active-id", DEFAULT); + settings.bind ("cyclic-search", cycle_search_button, "active", DEFAULT); + settings.bind ("cyclic-search", search_settings, "wrap-around", DEFAULT); + settings.bind ("regex-search", regex_search_button, "active", DEFAULT); + settings.bind ("regex-search", search_settings, "regex-enabled", DEFAULT); + settings.bind ("wholeword-search", search_settings, "at-word-boundaries", DEFAULT); + settings.bind ("wholeword-search", whole_word_search_button, "active", DEFAULT); + + // These settings are ignored when regex searching + settings.bind ("regex-search", cycle_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", whole_word_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", case_sensitive_search_button, "sensitive", INVERT_BOOLEAN); + settings.bind ("regex-search", case_sensitive_search_label, "sensitive", INVERT_BOOLEAN); + + settings.changed.connect (on_settings_changed); + // Connecting to some signals - search_entry.changed.connect (on_search_entry_changed); + search_entry.bind_property ("text", search_settings, "search-text", SYNC_CREATE); + search_entry.changed.connect (update_search_widgets); search_entry.notify["is-focus"].connect (() => { if (search_entry.is_focus && text_buffer != null) { Idle.add (() => { @@ -271,10 +278,9 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou this.text_view = text_view; this.text_buffer = text_view.get_buffer (); this.text_buffer.changed.connect (update_search_widgets); - this.search_context = new Gtk.SourceSearchContext (text_buffer as Gtk.SourceBuffer, null); - search_context.settings.wrap_around = settings.get_boolean ("cyclic-search"); - search_context.settings.regex_enabled = settings.get_boolean ("regex-search"); - search_context.settings.search_text = search_entry.text; + + search_context = new Gtk.SourceSearchContext ((Gtk.SourceBuffer) text_buffer, search_settings); + update_search_widgets (); } @@ -441,32 +447,30 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou this.window.get_current_document ().toggle_changed_handlers (true); } - private void on_settings_changed (string key) requires (search_context != null) { + private void on_settings_changed (string key) { switch (key) { case "case-sensitive-search": switch (settings.get_enum (key)) { case CaseSensitiveMode.NEVER: - search_context.settings.case_sensitive = false; + search_settings.case_sensitive = false; break; case CaseSensitiveMode.MIXED: var found = ( search_entry.text.up () == search_entry.text || search_entry.text.down () == search_entry.text ); - search_context.settings.case_sensitive = !found; + search_settings.case_sensitive = !found; break; case CaseSensitiveMode.ALWAYS: - search_context.settings.case_sensitive = true; + search_settings.case_sensitive = true; break; default: assert_not_reached (); } break; + case "cyclic-search": case "regex-search": - search_context.settings.regex_enabled = settings.get_boolean (key); - break; case "wholeword-search": - search_context.settings.at_word_boundaries = settings.get_boolean (key); break; default: // Don't update widgets for non-search settings change @@ -476,14 +480,6 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou update_search_widgets (); } - private void on_search_entry_changed () { - if (search_context != null) { - search_context.settings.search_text = search_entry.text; - } - - update_search_widgets (); - } - private bool has_matches () { if (text_buffer == null || search_entry.text == "") { return false; From 34af20aaf7da74ab8c410baba21b02f270a71e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 25 Aug 2026 13:26:46 -0700 Subject: [PATCH 3/5] Fix mixed mode --- src/Widgets/SearchBar.vala | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/Widgets/SearchBar.vala b/src/Widgets/SearchBar.vala index 8b9fd7f7b..6df2781e9 100644 --- a/src/Widgets/SearchBar.vala +++ b/src/Widgets/SearchBar.vala @@ -450,34 +450,15 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou private void on_settings_changed (string key) { switch (key) { case "case-sensitive-search": - switch (settings.get_enum (key)) { - case CaseSensitiveMode.NEVER: - search_settings.case_sensitive = false; - break; - case CaseSensitiveMode.MIXED: - var found = ( - search_entry.text.up () == search_entry.text || - search_entry.text.down () == search_entry.text - ); - search_settings.case_sensitive = !found; - break; - case CaseSensitiveMode.ALWAYS: - search_settings.case_sensitive = true; - break; - default: - assert_not_reached (); - } - break; case "cyclic-search": case "regex-search": case "wholeword-search": + update_search_widgets (); break; default: // Don't update widgets for non-search settings change return; } - - update_search_widgets (); } private bool has_matches () { @@ -624,6 +605,23 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou } } + switch (settings.get_enum ("case-sensitive-search")) { + case CaseSensitiveMode.NEVER: + search_settings.case_sensitive = false; + break; + case CaseSensitiveMode.MIXED: + search_settings.case_sensitive = !( + search_entry.text.up () == search_entry.text || + search_entry.text.down () == search_entry.text + ); + break; + case CaseSensitiveMode.ALWAYS: + search_settings.case_sensitive = true; + break; + default: + assert_not_reached (); + } + // Update appearance of search entry var ctx = search_entry.get_style_context (); From 94b616608223689a640ee9c36e36e8c1373ee6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 25 Aug 2026 13:28:23 -0700 Subject: [PATCH 4/5] less diff --- src/Widgets/SearchBar.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Widgets/SearchBar.vala b/src/Widgets/SearchBar.vala index 6df2781e9..e5ddbf3e6 100644 --- a/src/Widgets/SearchBar.vala +++ b/src/Widgets/SearchBar.vala @@ -278,7 +278,6 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou this.text_view = text_view; this.text_buffer = text_view.get_buffer (); this.text_buffer.changed.connect (update_search_widgets); - search_context = new Gtk.SourceSearchContext ((Gtk.SourceBuffer) text_buffer, search_settings); update_search_widgets (); From 4e6797a56491ca6b80cd1dd91b011f9bbbefb204 Mon Sep 17 00:00:00 2001 From: Jeremy Wootten Date: Wed, 26 Aug 2026 13:07:11 +0100 Subject: [PATCH 5/5] Fix merge of master --- src/Widgets/SearchBar.vala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Widgets/SearchBar.vala b/src/Widgets/SearchBar.vala index fd03d9062..40a5781da 100644 --- a/src/Widgets/SearchBar.vala +++ b/src/Widgets/SearchBar.vala @@ -68,6 +68,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou **/ private Gtk.SearchEntry search_entry; private Gtk.SearchEntry replace_entry; + private Granite.SwitchModelButton cycle_search_button; private Gtk.Label search_occurence_count_label; private Scratch.Widgets.SourceView? text_view = null; private Gtk.TextBuffer? text_buffer = null; @@ -141,7 +142,7 @@ public class Scratch.Widgets.SearchBar : Gtk.Box { //TODO In Gtk4 use a BinLayou ) }; - var cycle_search_button = new Granite.SwitchModelButton (_("Cyclic Search")); + cycle_search_button = new Granite.SwitchModelButton (_("Cyclic Search")); var case_sensitive_search_button = new Gtk.ComboBoxText (); case_sensitive_search_button.append ("never", _("Never"));