[gtranslator: 7/10] search-bar: Refactor how actions were used
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtranslator: 7/10] search-bar: Refactor how actions were used
- Date: Mon, 21 Mar 2022 07:03:15 +0000 (UTC)
commit 864b78a125cca7aa5b34e14bff7d417972a88524
Author: Maximiliano Sandoval R <msandova gnome org>
Date: Wed Mar 16 00:14:20 2022 +0100
search-bar: Refactor how actions were used
Allows to add back the menu.
It works as follow, for each option a property was added, which has an
associated GPropertyAction, then both the menu and the check button use
this action.
src/gtr-search-bar.c | 376 +++++++++++++++++++++++++++++---------------------
src/gtr-search-bar.ui | 5 +
2 files changed, 225 insertions(+), 156 deletions(-)
---
diff --git a/src/gtr-search-bar.c b/src/gtr-search-bar.c
index f490ac19..5926d9f3 100644
--- a/src/gtr-search-bar.c
+++ b/src/gtr-search-bar.c
@@ -36,7 +36,6 @@ struct _GtrSearchBar
GObject *search_entry_tag;
- GtkCheckButton *case_sensitive;
GtkButton *replace_all_button;
GtkButton *replace_button;
GtkButton *previous_button;
@@ -44,22 +43,29 @@ struct _GtrSearchBar
GtkEntry *replace_entry;
GtkEntry *search_entry;
GtkGrid *search_options;
- GtkCheckButton *whole_word;
- GtkCheckButton *wrap_around_button;
- GtkCheckButton *original_text_checkbutton;
- GtkCheckButton *translated_text_checkbutton;
GtkLabel *search_text_error;
GtrWindow *active_window;
guint show_options : 1;
guint replace_mode : 1;
+
+ gboolean case_sensitive;
+ gboolean at_word_boundaries;
+ gboolean wrap_around;
+ gboolean at_original_text;
+ gboolean at_translated_text;
};
enum {
PROP_0,
PROP_REPLACE_MODE,
PROP_SHOW_OPTIONS,
+ PROP_CASE_SENSITIVE,
+ PROP_AT_WORD_BOUNDARIES,
+ PROP_WRAP_AROUND,
+ PROP_AT_ORIGINAL_TEXT,
+ PROP_AT_TRANSLATED_TEXT,
N_PROPS
};
@@ -117,110 +123,117 @@ gtr_search_bar_get_replace_text (GtrSearchBar *dialog)
}
void
-gtr_search_bar_set_original_text (GtrSearchBar *dialog,
- gboolean match_case)
+gtr_search_bar_set_original_text (GtrSearchBar *self,
+ gboolean at_original_text)
{
- g_return_if_fail (GTR_IS_SEARCH_BAR (dialog));
+ g_return_if_fail (GTR_IS_SEARCH_BAR (self));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->original_text_checkbutton),
- match_case);
+ if (self->at_original_text == at_original_text)
+ return;
+
+ self->at_original_text = at_original_text;
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_AT_ORIGINAL_TEXT]);
+
+ /* Make sure at least one is activated */
+ if (!at_original_text && !self->at_translated_text)
+ gtr_search_bar_set_translated_text (self, TRUE);
}
gboolean
-gtr_search_bar_get_original_text (GtrSearchBar *dialog)
+gtr_search_bar_get_original_text (GtrSearchBar *self)
{
- g_return_val_if_fail (GTR_IS_SEARCH_BAR (dialog), FALSE);
+ g_return_val_if_fail (GTR_IS_SEARCH_BAR (self), FALSE);
- return
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->original_text_checkbutton));
+ return self->at_original_text;
}
void
-gtr_search_bar_set_translated_text (GtrSearchBar *dialog,
- gboolean match_case)
+gtr_search_bar_set_translated_text (GtrSearchBar *self,
+ gboolean at_translated_text)
{
+ g_return_if_fail (GTR_IS_SEARCH_BAR (self));
- g_return_if_fail (GTR_IS_SEARCH_BAR (dialog));
+ if (self->at_translated_text == at_translated_text)
+ return;
+
+ self->at_translated_text = at_translated_text;
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_AT_TRANSLATED_TEXT]);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->translated_text_checkbutton),
- match_case);
+ /* Make sure at least one is activated */
+ if (!self->at_original_text && !at_translated_text)
+ gtr_search_bar_set_original_text (self, TRUE);
}
gboolean
-gtr_search_bar_get_translated_text (GtrSearchBar *dialog)
+gtr_search_bar_get_translated_text (GtrSearchBar *self)
{
+ g_return_val_if_fail (GTR_IS_SEARCH_BAR (self), FALSE);
- g_return_val_if_fail (GTR_IS_SEARCH_BAR (dialog), FALSE);
-
- return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->translated_text_checkbutton));
+ return self->at_translated_text;
}
void
-gtr_search_bar_set_match_case (GtrSearchBar *dialog,
- gboolean match_case)
+gtr_search_bar_set_match_case (GtrSearchBar *self,
+ gboolean case_sensitive)
{
+ g_return_if_fail (GTR_IS_SEARCH_BAR (self));
- g_return_if_fail (GTR_IS_SEARCH_BAR (dialog));
+ if (self->case_sensitive == case_sensitive)
+ return;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->case_sensitive),
- match_case);
+ self->case_sensitive = case_sensitive;
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_CASE_SENSITIVE]);
}
gboolean
-gtr_search_bar_get_match_case (GtrSearchBar *dialog)
+gtr_search_bar_get_match_case (GtrSearchBar *self)
{
- g_return_val_if_fail (GTR_IS_SEARCH_BAR (dialog), FALSE);
+ g_return_val_if_fail (GTR_IS_SEARCH_BAR (self), FALSE);
- return
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->case_sensitive));
+ return self->case_sensitive;
}
void
-gtr_search_bar_set_entire_word (GtrSearchBar *dialog,
- gboolean entire_word)
+gtr_search_bar_set_entire_word (GtrSearchBar *self,
+ gboolean at_word_boundaries)
{
- g_return_if_fail (GTR_IS_SEARCH_BAR (dialog));
+ g_return_if_fail (GTR_IS_SEARCH_BAR (self));
+
+ if (self->at_word_boundaries == at_word_boundaries)
+ return;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->whole_word),
- entire_word);
+ self->at_word_boundaries = at_word_boundaries;
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_AT_WORD_BOUNDARIES]);
}
gboolean
-gtr_search_bar_get_entire_word (GtrSearchBar *dialog)
+gtr_search_bar_get_entire_word (GtrSearchBar *self)
{
+ g_return_val_if_fail (GTR_IS_SEARCH_BAR (self), FALSE);
- g_return_val_if_fail (GTR_IS_SEARCH_BAR (dialog), FALSE);
-
- return
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->whole_word));
+ return self->at_word_boundaries;
}
void
-gtr_search_bar_set_wrap_around (GtrSearchBar *dialog,
- gboolean wrap_around)
+gtr_search_bar_set_wrap_around (GtrSearchBar *self,
+ gboolean wrap_around)
{
- g_return_if_fail (GTR_IS_SEARCH_BAR (dialog));
+ g_return_if_fail (GTR_IS_SEARCH_BAR (self));
+
+ if (self->wrap_around == wrap_around)
+ return;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->wrap_around_button),
- wrap_around);
+ self->wrap_around = wrap_around;
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_WRAP_AROUND]);
}
gboolean
-gtr_search_bar_get_wrap_around (GtrSearchBar *dialog)
+gtr_search_bar_get_wrap_around (GtrSearchBar *self)
{
- g_return_val_if_fail (GTR_IS_SEARCH_BAR (dialog), FALSE);
+ g_return_val_if_fail (GTR_IS_SEARCH_BAR (self), FALSE);
- return
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->wrap_around_button));
+ return self->wrap_around;
}
void
@@ -295,56 +308,6 @@ insert_text_handler (GtkEditable * editable,
g_free (escaped_text);
}
-/*
- * Functions to make sure either translated or original checkbutton
- * is selected at any time. Anything else does not make any sense.
- */
-static void
-translated_checkbutton_toggled (GtkToggleButton * button,
- GtrSearchBar * dialog)
-{
- gboolean original_text;
- gboolean translated_text;
-
- original_text =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->original_text_checkbutton));
- translated_text =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (
- dialog->translated_text_checkbutton));
-
- if (!original_text && !translated_text)
- {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->original_text_checkbutton),
- TRUE);
- }
-}
-
-static void
-original_checkbutton_toggled (GtkToggleButton * button,
- GtrSearchBar * dialog)
-{
- gboolean original_text;
- gboolean translated_text;
-
- original_text =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (dialog->original_text_checkbutton));
- translated_text =
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (
- dialog->translated_text_checkbutton));
-
- if (!original_text && !translated_text)
- {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (dialog->translated_text_checkbutton),
- TRUE);
- }
-}
-
/*-----------------------------END OF NEW RE_WRITTEN METHODS-----------------*/
gboolean
@@ -433,6 +396,52 @@ gtr_search_bar_grab_focus (GtkWidget *widget)
gtk_widget_grab_focus (GTK_WIDGET (self->search_entry));
}
+static void
+search_entry_populate_popup (GtrSearchBar *self,
+ GtkWidget *widget,
+ GtkEntry *entry)
+{
+ g_assert (GTR_IS_SEARCH_BAR (self));
+ g_assert (GTK_IS_MENU (widget));
+ g_assert (GTK_IS_ENTRY (entry));
+
+ if (GTK_IS_MENU (widget))
+ {
+ GtkWidget *item;
+ GtkWidget *sep;
+ guint pos = 0;
+
+ item = gtk_check_menu_item_new_with_label (_("Case sensitive"));
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (item), "search-settings.case-sensitive");
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), item, pos++);
+ gtk_widget_show (item);
+
+ item = gtk_check_menu_item_new_with_label (_("Match whole word only"));
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (item), "search-settings.at-word-boundaries");
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), item, pos++);
+ gtk_widget_show (item);
+
+ item = gtk_check_menu_item_new_with_label (_("Wrap around"));
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (item), "search-settings.wrap-around");
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), item, pos++);
+ gtk_widget_show (item);
+
+ item = gtk_check_menu_item_new_with_label (_("Original text"));
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (item), "search-settings.at-original-text");
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), item, pos++);
+ gtk_widget_show (item);
+
+ item = gtk_check_menu_item_new_with_label (_("Translated text"));
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (item), "search-settings.at-translated-text");
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), item, pos++);
+ gtk_widget_show (item);
+
+ sep = gtk_separator_menu_item_new ();
+ gtk_menu_shell_insert (GTK_MENU_SHELL (widget), sep, pos++);
+ gtk_widget_show (sep);
+ }
+}
+
static void
gtr_search_bar_real_stop_search (GtrSearchBar *self)
{
@@ -484,6 +493,35 @@ gtr_search_bar_set_show_options (GtrSearchBar *self,
}
}
+static void
+add_actions (GtrSearchBar *self)
+{
+ GSimpleActionGroup *group;
+ GPropertyAction *action;
+
+ group = g_simple_action_group_new ();
+
+ action = g_property_action_new ("case-sensitive", self, "case-sensitive");
+ g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action));
+
+ action = g_property_action_new ("at-word-boundaries", self, "at-word-boundaries");
+ g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action));
+
+ action = g_property_action_new ("wrap-around", self, "wrap-around");
+ g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action));
+
+ action = g_property_action_new ("at-original-text", self, "at-original-text");
+ g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action));
+
+ action = g_property_action_new ("at-translated-text", self, "at-translated-text");
+ g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action));
+
+ gtk_widget_insert_action_group (GTK_WIDGET (self), "search-settings", G_ACTION_GROUP (group));
+
+ g_object_unref (action);
+}
+
+
static void
gtr_search_bar_get_property (GObject *object,
guint prop_id,
@@ -502,6 +540,26 @@ gtr_search_bar_get_property (GObject *object,
g_value_set_boolean (value, gtr_search_bar_get_show_options (self));
break;
+ case PROP_CASE_SENSITIVE:
+ g_value_set_boolean (value, gtr_search_bar_get_match_case (self));
+ break;
+
+ case PROP_AT_WORD_BOUNDARIES:
+ g_value_set_boolean (value, gtr_search_bar_get_entire_word (self));
+ break;
+
+ case PROP_WRAP_AROUND:
+ g_value_set_boolean (value, gtr_search_bar_get_wrap_around (self));
+ break;
+
+ case PROP_AT_ORIGINAL_TEXT:
+ g_value_set_boolean (value, gtr_search_bar_get_original_text (self));
+ break;
+
+ case PROP_AT_TRANSLATED_TEXT:
+ g_value_set_boolean (value, gtr_search_bar_get_translated_text (self));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -525,6 +583,26 @@ gtr_search_bar_set_property (GObject *object,
gtr_search_bar_set_show_options (self, g_value_get_boolean (value));
break;
+ case PROP_CASE_SENSITIVE:
+ gtr_search_bar_set_match_case (self, g_value_get_boolean (value));
+ break;
+
+ case PROP_AT_WORD_BOUNDARIES:
+ gtr_search_bar_set_entire_word (self, g_value_get_boolean (value));
+ break;
+
+ case PROP_WRAP_AROUND:
+ gtr_search_bar_set_wrap_around (self, g_value_get_boolean (value));
+ break;
+
+ case PROP_AT_ORIGINAL_TEXT:
+ gtr_search_bar_set_original_text (self, g_value_get_boolean (value));
+ break;
+
+ case PROP_AT_TRANSLATED_TEXT:
+ gtr_search_bar_set_translated_text (self, g_value_get_boolean (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -550,6 +628,26 @@ gtr_search_bar_class_init (GtrSearchBarClass *klass)
g_param_spec_boolean ("show-options", NULL, NULL, FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ properties [PROP_CASE_SENSITIVE] =
+ g_param_spec_boolean ("case-sensitive", NULL, NULL, FALSE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
+ properties [PROP_AT_WORD_BOUNDARIES] =
+ g_param_spec_boolean ("at-word-boundaries", NULL, NULL, FALSE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
+ properties [PROP_WRAP_AROUND] =
+ g_param_spec_boolean ("wrap-around", NULL, NULL, TRUE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
+ properties [PROP_AT_ORIGINAL_TEXT] =
+ g_param_spec_boolean ("at-original-text", NULL, NULL, TRUE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
+ properties [PROP_AT_TRANSLATED_TEXT] =
+ g_param_spec_boolean ("at-translated-text", NULL, NULL, TRUE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (object_class, N_PROPS, properties);
signals [STOP_SEARCH] =
@@ -562,7 +660,6 @@ gtr_search_bar_class_init (GtrSearchBarClass *klass)
G_TYPE_NONE, 0);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/translator/gtr-search-bar.ui");
- gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, case_sensitive);
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, replace_all_button);
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, replace_button);
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, replace_entry);
@@ -571,10 +668,6 @@ gtr_search_bar_class_init (GtrSearchBarClass *klass)
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, next_button);
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, search_options);
gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, search_text_error);
- gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, whole_word);
- gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, wrap_around_button );
- gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, original_text_checkbutton);
- gtk_widget_class_bind_template_child (widget_class, GtrSearchBar, translated_text_checkbutton);
gtk_widget_class_set_css_name (widget_class, "gtrsearchbar");
}
@@ -584,19 +677,13 @@ gtr_search_bar_init (GtrSearchBar *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
- // Sets the Original-text, Translated-text and Wrap-around checkbuttons toggled by default.
+ // Sets the Original-text, Translated-text and Wrap-around enabled by default.
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (self->original_text_checkbutton),
- TRUE);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (self->translated_text_checkbutton),
- TRUE);
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
- (self->wrap_around_button),
- TRUE);
+ self->case_sensitive = FALSE;
+ self->at_word_boundaries = FALSE;
+ self->wrap_around = TRUE;
+ self->at_original_text = TRUE;
+ self->at_translated_text = TRUE;
g_object_set (G_OBJECT (self->next_button), "can-default", TRUE, NULL);
@@ -612,47 +699,22 @@ gtr_search_bar_init (GtrSearchBar *self)
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL,
pacify_null_text, pacify_null_text, NULL, NULL);
- g_binding_group_bind (self->search_bindings, "case-sensitive",
- self->case_sensitive, "active",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
- g_binding_group_bind (self->search_bindings, "at-word-boundaries",
- self->whole_word, "active",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
- g_binding_group_bind (self->search_bindings, "wrap-around",
- self->whole_word, "active",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
- g_binding_group_bind (self->search_bindings, "at-original-text",
- self->whole_word, "active",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
- g_binding_group_bind (self->search_bindings, "at-translated-text",
- self->whole_word, "active",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
-
g_signal_connect (self->search_entry,
"insert_text", G_CALLBACK (insert_text_handler), NULL);
g_signal_connect (self->replace_entry,
"insert_text", G_CALLBACK (insert_text_handler), NULL);
- g_signal_connect (self->original_text_checkbutton,
- "toggled",
- G_CALLBACK (original_checkbutton_toggled),
- self);
-
- g_signal_connect (self->translated_text_checkbutton,
- "toggled",
- G_CALLBACK (translated_checkbutton_toggled),
- self);
-
g_signal_connect_swapped (self->search_entry,
"activate",
G_CALLBACK (gtr_search_bar_find_next),
self);
+ g_signal_connect_swapped (self->search_entry,
+ "populate-popup",
+ G_CALLBACK (search_entry_populate_popup),
+ self);
+
g_signal_connect_swapped (self->next_button,
"clicked",
G_CALLBACK (gtr_search_bar_find_next),
@@ -677,6 +739,8 @@ gtr_search_bar_init (GtrSearchBar *self)
"stop-search",
G_CALLBACK (search_entry_stop_search),
self);
+
+ add_actions (self);
}
void
diff --git a/src/gtr-search-bar.ui b/src/gtr-search-bar.ui
index 447c6d68..eb32eb51 100644
--- a/src/gtr-search-bar.ui
+++ b/src/gtr-search-bar.ui
@@ -214,6 +214,7 @@
<property name="can-focus">false</property>
<property name="xalign">0</property>
<property name="draw-indicator">true</property>
+ <property name="action-name">search-settings.case-sensitive</property>
</object>
<packing>
<property name="left_attach">0</property>
@@ -227,6 +228,7 @@
<property name="can-focus">false</property>
<property name="xalign">0</property>
<property name="draw-indicator">true</property>
+ <property name="action-name">search-settings.at-word-boundaries</property>
</object>
<packing>
<property name="left_attach">1</property>
@@ -240,6 +242,7 @@
<property name="can-focus">false</property>
<property name="xalign">1</property>
<property name="draw-indicator">true</property>
+ <property name="action-name">search-settings.wrap-around</property>
</object>
<packing>
<property name="left_attach">2</property>
@@ -253,6 +256,7 @@
<property name="can-focus">false</property>
<property name="xalign">1</property>
<property name="draw-indicator">true</property>
+ <property name="action-name">search-settings.at-original-text</property>
</object>
<packing>
<property name="left_attach">0</property>
@@ -266,6 +270,7 @@
<property name="can-focus">false</property>
<property name="xalign">1</property>
<property name="draw-indicator">true</property>
+ <property name="action-name">search-settings.at-translated-text</property>
</object>
<packing>
<property name="left_attach">1</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]