[gnome-terminal/wip/text-objects: 3/4] Text-Objects: Make GUI more user friendly.



commit db16df4bec0e60a0e9092b3e39fb4f5a831747a5
Author: Rodolfo Granata <warlock cc gmail com>
Date:   Mon May 20 22:47:54 2019 -0400

    Text-Objects: Make GUI more user friendly.

 src/preferences.ui         |  4 +--
 src/profile-text-objects.c | 87 +++++++++++++++++++++++++++-------------------
 2 files changed, 53 insertions(+), 38 deletions(-)
---
diff --git a/src/preferences.ui b/src/preferences.ui
index b0c3ca15..023c7199 100644
--- a/src/preferences.ui
+++ b/src/preferences.ui
@@ -2406,7 +2406,7 @@
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="xalign">0</property>
-            <property name="label">Rule Name</property>
+            <property name="label">Rule Name (will overwrite rule with same name)</property>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -2526,7 +2526,7 @@
             </child>
             <child>
               <object class="GtkButton" id="txt-obj-edit-save">
-                <property name="label" translatable="yes">Save</property>
+                <property name="label" translatable="yes">Replace</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
diff --git a/src/profile-text-objects.c b/src/profile-text-objects.c
index 2faafce7..cdb9cee3 100644
--- a/src/profile-text-objects.c
+++ b/src/profile-text-objects.c
@@ -152,6 +152,24 @@ edit_text_object_hide_cb (GtkButton *button, gpointer user_data)
 #endif
 }
 
+/* search the profile's text-objects by rule-name to check if we're
+ * adding a new text-object or we're replacing an existing one */
+static gboolean
+check_existing_text_object (
+    GtkTreeModel *store, GtkTreeIter *list_iter, const gchar *rule_name)
+{
+  gboolean more_rows = gtk_tree_model_get_iter_first (store, list_iter);
+  while (more_rows) {
+    gs_free gchar *_name;
+    gtk_tree_model_get (store, list_iter, TEXT_OBJ_NAME, &_name, -1);
+    if (g_strcmp0 (rule_name, _name) == 0) {
+      return TRUE;
+    }
+    more_rows = gtk_tree_model_iter_next ((GtkTreeModel *) store, list_iter);
+  }
+  return FALSE;
+}
+
 /* callback for saving contents to text-object editor dialog */
 static void
 edit_text_object_save_cb (GtkButton *button, GSettings *profile)
@@ -169,30 +187,13 @@ edit_text_object_save_cb (GtkButton *button, GSettings *profile)
       GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")));
   gint64 prio = g_ascii_strtoll (sprio, NULL, 10);
 
+  GtkTreeIter list_iter;
   GtkTreeView *tree_view =
     (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list");
   GtkListStore *store = (GtkListStore *) gtk_tree_view_get_model(tree_view);
 
-  /* search the profile's text-objects by rule-name to check if we're
-   * adding a new text-object or we're replacing an existing one */
-  GtkTreeIter list_iter;
-  gboolean more_rows =
-    gtk_tree_model_get_iter_first ((GtkTreeModel *) store, &list_iter);
-  gboolean existing = FALSE;
-  while (more_rows && !existing) {
-    gs_free gchar *_name;
-    gtk_tree_model_get ((GtkTreeModel *) store, &list_iter,
-                        TEXT_OBJ_NAME, &_name, -1);
-    existing = (g_strcmp0 (name, _name) == 0);
-    /* found an existing text-object with the same rule-name, we'll replace it */
-    if (existing) {
-      break;
-    }
-    more_rows = gtk_tree_model_iter_next ((GtkTreeModel *) store, &list_iter);
-  }
-
   /* if no existing rule found we'll append a new one */
-  if (!existing) {
+  if (!check_existing_text_object ((GtkTreeModel *) store, &list_iter, name)) {
     gtk_list_store_append (store, &list_iter);
   }
 
@@ -203,7 +204,6 @@ edit_text_object_save_cb (GtkButton *button, GSettings *profile)
       TEXT_OBJ_REWRITE, rewrite,
       TEXT_OBJ_PRIO, prio,
       -1);
-
   profile_save_text_objects (profile, store);
 
   /* Hide the popover */
@@ -212,7 +212,7 @@ edit_text_object_save_cb (GtkButton *button, GSettings *profile)
 
 /* callback to pre-populate text-object edition dialog with current selection */
 static void
-toggle_text_object_buttons_cb (GtkTreeSelection *selection, gpointer user_data)
+selection_text_object_change_cb (GtkTreeSelection *selection, gpointer user_data)
 {
   GtkBuilder *builder = the_pref_data->builder;
   GtkTreeIter list_iter;
@@ -244,6 +244,11 @@ toggle_text_object_buttons_cb (GtkTreeSelection *selection, gpointer user_data)
         GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-rewrite")), rewrite);
     gtk_entry_set_text (
         GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-prio")), sprio);
+    gtk_button_set_label (
+        GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "Edit");
+  } else {
+    gtk_button_set_label (
+        GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-button")), "New");
   }
 }
 
@@ -252,9 +257,10 @@ validate_text_object_cb (GtkEntry *entry, gpointer user_data)
 {
   GtkBuilder *builder = the_pref_data->builder;
   gboolean valid = TRUE;
+  GtkButton *save = GTK_BUTTON (gtk_builder_get_object (builder, "txt-obj-edit-save"));
 
   /* check that all fields have some text */
-  const char *text = gtk_entry_get_text (entry);
+  const gchar *text = gtk_entry_get_text (entry);
   valid &= (strlen(text) > 0);
 
   /* Check that Priority/Rank is an integer */
@@ -277,12 +283,23 @@ validate_text_object_cb (GtkEntry *entry, gpointer user_data)
     }
   }
 
+  /* Adjust the label on the Save button depending if replacing or adding new item */
+  GtkEntry *rule = GTK_ENTRY (gtk_builder_get_object (builder, "txt-obj-name"));
+  if (entry == rule) {
+    GtkTreeIter list_iter;
+    GtkTreeModel *store = gtk_tree_view_get_model(
+        (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list"));
+    const gchar *label = check_existing_text_object (store, &list_iter, text)
+      ?  "Replace" : "Create";
+    gtk_button_set_label (GTK_BUTTON (save), label);
+  }
+
   /* react to input being valid: set warning icon and toggle Save button */
   gtk_entry_set_icon_from_icon_name (
       entry,
       GTK_ENTRY_ICON_PRIMARY, valid ? NULL : "dialog-warning");
-  gtk_widget_set_sensitive (
-      (GtkWidget *) gtk_builder_get_object (builder, "txt-obj-edit-save"), valid);
+  gtk_widget_set_sensitive ((GtkWidget *) save, valid);
+
 }
 
 /* bind the text-object GUI elements to callbacks */
@@ -306,17 +323,15 @@ profile_text_objects_bind(GSettings *profile)
       gtk_builder_get_object (builder, "txt-obj-edit-save"),
       "clicked", G_CALLBACK (edit_text_object_save_cb), profile);
 
-  profile_prefs_signal_connect (
-      (GtkEntry *) gtk_builder_get_object (builder, "txt-obj-match"),
-      "changed", G_CALLBACK (validate_text_object_cb), NULL);
-
-  profile_prefs_signal_connect (
-      (GtkEntry *) gtk_builder_get_object (builder, "txt-obj-rewrite"),
-      "changed", G_CALLBACK (validate_text_object_cb), NULL);
-
-  profile_prefs_signal_connect (
-      (GtkEntry *) gtk_builder_get_object (builder, "txt-obj-prio"),
-      "changed", G_CALLBACK (validate_text_object_cb), NULL);
+  guint i;
+  const gchar *fields[] = {
+    "txt-obj-name", "txt-obj-match", "txt-obj-rewrite", "txt-obj-prio",
+  };
+  for (i = 0; i < G_N_ELEMENTS (fields); i++) {
+    profile_prefs_signal_connect (
+        (GtkEntry *) gtk_builder_get_object (builder, fields[i]),
+        "changed", G_CALLBACK (validate_text_object_cb), NULL);
+  }
 
   /* disable edit buttons if we can't write settings */
   if (g_settings_is_writable (profile, "text-objects")) {
@@ -325,7 +340,7 @@ profile_text_objects_bind(GSettings *profile)
         (GtkTreeView *) gtk_builder_get_object (builder, "text-object-list"));
     profile_prefs_signal_connect (
         selection,
-        "changed", G_CALLBACK (toggle_text_object_buttons_cb), NULL);
+        "changed", G_CALLBACK (selection_text_object_change_cb), NULL);
   } else {
     gtk_widget_set_sensitive (
         GTK_WIDGET (gtk_builder_get_object (builder, "txt-obj-remove-button")), FALSE);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]