[recipes/inline-editing] Add Initial Editing for GrIngredientsViewerRow



commit afde7a998994c2e9dee2e1c39c600d7e33513551
Author: Ekta Nandwani <mailnandwaniekta gmail com>
Date:   Tue Apr 25 11:52:00 2017 +0530

    Add Initial Editing for GrIngredientsViewerRow
    
    Show GtkEntry to edit ingredient and pressing enter shows the GtkLabel with changed text

 src/gr-ingredients-viewer-row.c  |   59 +++++++++++++++++++++++++----
 src/gr-ingredients-viewer-row.ui |   78 ++++++++++++++++++++++++++++++++++----
 src/gr-ingredients-viewer.c      |    8 ++++
 3 files changed, 129 insertions(+), 16 deletions(-)
---
diff --git a/src/gr-ingredients-viewer-row.c b/src/gr-ingredients-viewer-row.c
index a8b0cea..99c704f 100644
--- a/src/gr-ingredients-viewer-row.c
+++ b/src/gr-ingredients-viewer-row.c
@@ -32,9 +32,9 @@ struct _GrIngredientsViewerRow
 {
         GtkListBoxRow parent_instance;
 
-        GtkWidget *unit_label;
-        GtkWidget *ingredient_label;
         GtkWidget *buttons_stack;
+        GtkWidget *unit_stack;
+        GtkWidget *ingredient_stack;
         GtkWidget *ebox;
 
         char *amount;
@@ -62,6 +62,7 @@ enum {
 enum {
         DELETE,
         MOVE,
+        EDIT,
         N_SIGNALS
 };
 
@@ -126,7 +127,7 @@ update_unit (GrIngredientsViewerRow *row)
         g_autofree char *tmp = NULL;
 
         tmp = g_strconcat (row->amount ? row->amount : "", " ", row->unit, NULL);
-        gtk_label_set_label (GTK_LABEL (row->unit_label), tmp);
+        gtk_label_set_label (GTK_LABEL (gtk_stack_get_child_by_name (GTK_STACK (row->unit_stack), 
"unit_label")), tmp);
 }
 
 
@@ -154,7 +155,7 @@ gr_ingredients_viewer_row_set_ingredient (GrIngredientsViewerRow *row,
 {
         g_free (row->ingredient);
         row->ingredient = g_strdup (ingredient);
-        gtk_label_set_label (GTK_LABEL (row->ingredient_label), ingredient);
+        gtk_label_set_label (GTK_LABEL (gtk_stack_get_child_by_name (GTK_STACK (row->ingredient_stack), 
"ingredient_label")), ingredient);
 }
 
 static void
@@ -162,10 +163,10 @@ gr_ingredients_viewer_row_set_size_group (GrIngredientsViewerRow *row,
                                           GtkSizeGroup           *group)
 {
         if (row->group)
-                gtk_size_group_remove_widget (row->group, row->unit_label);
+                gtk_size_group_remove_widget (row->group, row->unit_stack);
         g_set_object (&row->group, group);
         if (row->group)
-                gtk_size_group_add_widget (row->group, row->unit_label);
+                gtk_size_group_add_widget (row->group, row->unit_stack);
 }
 
 static void
@@ -235,6 +236,39 @@ drag_handle_clicked (GrIngredientsViewerRow *row)
 }
 
 static void
+edit_ingredient (GrIngredientsViewerRow *row)
+{
+        GtkEntry *unit_entry = GTK_ENTRY (gtk_stack_get_child_by_name (GTK_STACK (row->unit_stack), 
"unit_entry"));
+        GtkEntry *ingredient_entry = GTK_ENTRY (gtk_stack_get_child_by_name (GTK_STACK 
(row->ingredient_stack), "ingredient_entry"));
+        g_autofree char *tmp = NULL;
+
+        tmp = g_strconcat (row->amount, " ", row->unit, NULL);
+        gtk_entry_set_text (unit_entry,tmp);
+        gtk_entry_set_text (ingredient_entry, gtk_label_get_text (GTK_LABEL (gtk_stack_get_child_by_name 
(GTK_STACK (row->ingredient_stack), "ingredient_label"))));
+
+        gtk_stack_set_visible_child_name (GTK_STACK (row->unit_stack), "unit_entry");
+        gtk_stack_set_visible_child_name (GTK_STACK (row->ingredient_stack), "ingredient_entry");
+        g_signal_emit (row, signals[EDIT], 0);
+
+}
+
+static void
+save_row (GrIngredientsViewerRow *row)
+{
+        char** strv = g_strsplit (gtk_entry_get_text (GTK_ENTRY (gtk_stack_get_child_by_name (GTK_STACK 
(row->unit_stack), "unit_entry"))), " ", -1);
+        GtkLabel *ingredient_label = GTK_LABEL(gtk_stack_get_child_by_name (GTK_STACK 
(row->ingredient_stack), "ingredient_label"));
+
+        row->amount = strv[0];
+        row->unit = strv[1];
+        row->ingredient = g_strdup (gtk_entry_get_text (GTK_ENTRY (gtk_stack_get_child_by_name (GTK_STACK 
(row->ingredient_stack), "ingredient_entry"))));
+        update_unit(row);
+        gtk_label_set_label (ingredient_label, gtk_entry_get_text (GTK_ENTRY (gtk_stack_get_child_by_name 
(GTK_STACK (row->ingredient_stack), "ingredient_entry"))));
+
+        gtk_stack_set_visible_child_name (GTK_STACK (row->unit_stack), "unit_label");
+        gtk_stack_set_visible_child_name (GTK_STACK (row->ingredient_stack), "ingredient_label");
+}
+
+static void
 gr_ingredients_viewer_row_class_init (GrIngredientsViewerRowClass *klass)
 {
         GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
@@ -290,16 +324,25 @@ gr_ingredients_viewer_row_class_init (GrIngredientsViewerRowClass *klass)
                                       NULL, NULL,
                                       NULL,
                                       G_TYPE_NONE, 1, GR_TYPE_INGREDIENTS_VIEWER_ROW);
+                signals[EDIT] = g_signal_new ("edit",
+                                      G_TYPE_FROM_CLASS (object_class),
+                                      G_SIGNAL_RUN_FIRST,
+                                      0,
+                                      NULL, NULL,
+                                      NULL,
+                                      G_TYPE_NONE, 0);
 
         gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Recipes/gr-ingredients-viewer-row.ui");
 
-        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, unit_label);
-        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, ingredient_label);
+        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, unit_stack);
+        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, ingredient_stack);
         gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, buttons_stack);
         gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, ebox);
 
         gtk_widget_class_bind_template_callback (widget_class, emit_delete);
         gtk_widget_class_bind_template_callback (widget_class, drag_handle_clicked);
+        gtk_widget_class_bind_template_callback (widget_class, edit_ingredient);
+        gtk_widget_class_bind_template_callback (widget_class, save_row);
 }
 
 static GtkTargetEntry entries[] = {
diff --git a/src/gr-ingredients-viewer-row.ui b/src/gr-ingredients-viewer-row.ui
index ae66467..d72d721 100644
--- a/src/gr-ingredients-viewer-row.ui
+++ b/src/gr-ingredients-viewer-row.ui
@@ -5,22 +5,66 @@
     <child>
       <object class="GtkBox" id="box">
         <property name="visible">1</property>
-        <property name="spacing">12</property>
+        <property name="spacing">10</property>
         <property name="margin-start">6</property>
         <property name="margin-end">6</property>
         <child>
-          <object class="GtkLabel" id="unit_label">
+          <object class="GtkStack" id="unit_stack">
             <property name="visible">1</property>
-            <property name="xalign">0</property>
-            <style>
-              <class name="dim-label"/>
-            </style>
+            <child>
+              <object class="GtkLabel" id="unit_label">
+                <property name="visible">1</property>
+                <property name="xalign">0</property>
+                <property name="width-chars">10</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="name">unit_label</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="unit_entry">
+                <property name="visible">1</property>
+                <property name="xalign">0</property>
+                <property name="placeholder-text" translatable="yes">Amount Unit</property>
+                <property name="width-chars">10</property>
+                <property name="max-length">10</property>
+                <signal name="activate" handler="save_row" swapped="yes"/>
+              </object>
+              <packing>
+                <property name="name">unit_entry</property>
+              </packing>
+            </child>
           </object>
         </child>
         <child>
-          <object class="GtkLabel" id="ingredient_label">
+          <object class="GtkStack" id="ingredient_stack">
             <property name="visible">1</property>
-            <property name="xalign">0</property>
+            <child>
+              <object class="GtkLabel" id="ingredient_label">
+                <property name="visible">1</property>
+                <property name="xalign">0</property>
+                <property name="width-chars">10</property>
+                <property name="width-chars">10</property>
+              </object>
+              <packing>
+                <property name="name">ingredient_label</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="ingredient_entry">
+                <property name="visible">1</property>
+                <property name="xalign">0</property>
+                <property name="width-chars">10</property>
+                <property name="placeholder-text" translatable="yes">Ingredient</property>
+                <signal name="activate" handler="save_row" swapped="yes"/>
+              </object>
+              <packing>
+                <property name="name">ingredient_entry</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">1</property>
@@ -49,6 +93,24 @@
                   <object class="GtkButton">
                     <property name="visible">1</property>
                     <property name="relief">none</property>
+                    <signal name="clicked" handler="edit_ingredient" swapped="yes"/>
+                    <style>
+                      <class name="image-button"/>
+                      <class name="circular"/>
+                    </style>
+                    <child>
+                      <object class="GtkImage">
+                        <property name="visible">1</property>
+                        <property name="icon-name">document-edit-symbolic</property>
+                        <property name="icon-size">1</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkButton">
+                    <property name="visible">1</property>
+                    <property name="relief">none</property>
                     <signal name="clicked" handler="emit_delete" swapped="yes"/>
                     <style>
                       <class name="image-button"/>
diff --git a/src/gr-ingredients-viewer.c b/src/gr-ingredients-viewer.c
index 1084c93..1bb6622 100644
--- a/src/gr-ingredients-viewer.c
+++ b/src/gr-ingredients-viewer.c
@@ -222,6 +222,12 @@ move_row (GtkWidget           *source,
 
         g_object_notify (G_OBJECT (viewer), "ingredients");
 }
+static void
+edit_ingredeint_row (GrIngredientsViewerRow *row,
+                     GrIngredientsViewer    *viewer)
+{
+        g_object_notify (G_OBJECT (viewer), "ingredients");
+}
 
 static void
 add_row (GtkButton           *button,
@@ -238,6 +244,7 @@ add_row (GtkButton           *button,
                             NULL);
         g_signal_connect (row, "delete", G_CALLBACK (delete_row), viewer);
         g_signal_connect (row, "move", G_CALLBACK (move_row), viewer);
+        g_signal_connect (row, "notify::ingredient" , G_CALLBACK(edit_ingredeint_row), viewer);
 
         gtk_container_add (GTK_CONTAINER (viewer->list), row);
         g_object_notify (G_OBJECT (viewer), "ingredients");
@@ -283,6 +290,7 @@ gr_ingredients_viewer_set_ingredients (GrIngredientsViewer *viewer,
                                     NULL);
                 g_signal_connect (row, "delete", G_CALLBACK (delete_row), viewer);
                 g_signal_connect (row, "move", G_CALLBACK (move_row), viewer);
+                g_signal_connect (row, "edit", G_CALLBACK (edit_ingredeint_row), viewer);
 
                 gtk_container_add (GTK_CONTAINER (viewer->list), row);
         }


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