[recipes/inline-editing] wip: More work on ingredients list refactoring



commit 314b20e36d5c8270485b960914053f1f8339a6e6
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Apr 17 22:12:26 2017 -0400

    wip: More work on ingredients list refactoring
    
    Complete the non-editable mode and use it on the details page.

 src/gr-details-page.c            |   62 ++++--------------
 src/gr-edit-page.c               |   65 ++++++++++++++++++-
 src/gr-edit-page.ui              |   13 ++++
 src/gr-ingredients-viewer-row.c  |  132 +++++++++++++++++++++++++++++++++-----
 src/gr-ingredients-viewer-row.h  |    2 -
 src/gr-ingredients-viewer-row.ui |   11 +++-
 src/gr-ingredients-viewer.c      |  101 +++++++++++++++++++++++------
 src/gr-ingredients-viewer.ui     |    4 +-
 8 files changed, 297 insertions(+), 93 deletions(-)
---
diff --git a/src/gr-details-page.c b/src/gr-details-page.c
index fe961b0..edb7f87 100644
--- a/src/gr-details-page.c
+++ b/src/gr-details-page.c
@@ -36,6 +36,7 @@
 #include "gr-image.h"
 #include "gr-image-viewer.h"
 #include "gr-ingredients-list.h"
+#include "gr-ingredients-viewer.h"
 #include "gr-timer.h"
 #include "gr-recipe-printer.h"
 #include "gr-recipe-exporter.h"
@@ -52,6 +53,7 @@ struct _GrDetailsPage
         GrRecipe *recipe;
         GrChef *chef;
         GrIngredientsList *ingredients;
+        char *ing_text;
 
         GrRecipePrinter *printer;
         GrRecipeExporter *exporter;
@@ -237,6 +239,7 @@ details_page_finalize (GObject *object)
         g_clear_object (&self->printer);
         g_clear_object (&self->exporter);
         g_clear_pointer (&self->uri, g_free);
+        g_clear_pointer (&self->ing_text, g_free);
 
         G_OBJECT_CLASS (gr_details_page_parent_class)->finalize (object);
 }
@@ -455,64 +458,21 @@ populate_ingredients (GrDetailsPage *page,
 {
         g_autoptr(GtkSizeGroup) group = NULL;
         g_autofree char **segments = NULL;
-        int i, j;
+        int j;
         GtkWidget *list;
-        GtkWidget *label;
 
         container_remove_all (GTK_CONTAINER (page->ingredients_box));
 
         group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
         segments = gr_ingredients_list_get_segments (page->ingredients);
         for (j = 0; segments[j]; j++) {
-                g_auto(GStrv) ings = NULL;
-
-                if (segments[j] && segments[j][0]) {
-                        label = gtk_label_new (segments[j]);
-                        gtk_widget_show (label);
-                        gtk_label_set_xalign (GTK_LABEL (label), 0);
-                        gtk_style_context_add_class (gtk_widget_get_style_context (label), "heading");
-                        gtk_container_add (GTK_CONTAINER (page->ingredients_box), label);
-                }
-
-                list = gtk_list_box_new ();
-                gtk_widget_show (list);
-                gtk_style_context_add_class (gtk_widget_get_style_context (list), "frame");
-                gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-                gtk_list_box_set_header_func (GTK_LIST_BOX (list), all_headers, NULL, NULL);
+                list = g_object_new (GR_TYPE_INGREDIENTS_VIEWER,
+                                     "title", segments[j],
+                                     "editable-title", FALSE,
+                                     "editable", FALSE,
+                                     "ingredients", page->ing_text,
+                                     NULL);
                 gtk_container_add (GTK_CONTAINER (page->ingredients_box), list);
-
-                ings = gr_ingredients_list_get_ingredients (page->ingredients, segments[j]);
-                for (i = 0; ings[i]; i++) {
-                        GtkWidget *row;
-                        GtkWidget *box;
-                        g_autofree char *s = NULL;
-
-                        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-                        gtk_widget_show (box);
-
-                        s = gr_ingredients_list_scale_unit (page->ingredients, segments[j], ings[i], num, 
denom);
-                        label = gtk_label_new (s);
-                        g_object_set (label,
-                                      "visible", TRUE,
-                                      "xalign", 0.0,
-                                      "margin", 10,
-                                      NULL);
-                        gtk_style_context_add_class (gtk_widget_get_style_context (label), "dim-label");
-                        gtk_container_add (GTK_CONTAINER (box), label);
-                        gtk_size_group_add_widget (group, label);
-
-                        label = gtk_label_new (ings[i]);
-                        g_object_set (label,
-                                      "visible", TRUE,
-                                      "xalign", 0.0,
-                                      "margin", 10,
-                                      NULL);
-                        gtk_container_add (GTK_CONTAINER (box), label);
-
-                        gtk_container_add (GTK_CONTAINER (list), box);
-                        row = gtk_widget_get_parent (box);
-                        gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
-                }
         }
 
         gtk_widget_hide (page->warning_box);
@@ -664,6 +624,8 @@ gr_details_page_set_recipe (GrDetailsPage *page,
 
         ing = gr_ingredients_list_new (ingredients);
         g_set_object (&page->ingredients, ing);
+        g_free (page->ing_text);
+        page->ing_text = g_strdup (ingredients);
 
         if (same_recipe)
                 want_serves = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (page->serves_spin));
diff --git a/src/gr-edit-page.c b/src/gr-edit-page.c
index ac67075..f1d8d9e 100644
--- a/src/gr-edit-page.c
+++ b/src/gr-edit-page.c
@@ -50,6 +50,7 @@
 #include "gr-account.h"
 #include "gr-recipe-tile.h"
 #include "gr-recipe-formatter.h"
+#include "gr-ingredients-viewer.h"
 
 
 struct _GrEditPage
@@ -93,6 +94,8 @@ struct _GrEditPage
         GtkWidget *ingredients_box;
         GtkWidget *cooking_view;
 
+        GtkWidget *ingredients_box2;
+
         GtkWidget *ing_list;
         GtkWidget *ing_search_button;
         GtkWidget *ing_search_button_label;
@@ -165,6 +168,8 @@ dismiss_error (GrEditPage *page)
 static void add_image_cb (GrEditPage *page);
 static void set_unsaved (GrEditPage *page);
 
+static void add_list2   (GtkButton *button, GrEditPage *page);
+
 static void
 populate_image_flowbox (GrEditPage *page)
 {
@@ -1621,6 +1626,9 @@ gr_edit_page_class_init (GrEditPageClass *klass)
         gtk_widget_class_bind_template_child (widget_class, GrEditPage, ing_search_button_label);
         gtk_widget_class_bind_template_child (widget_class, GrEditPage, ing_search_revealer);
 
+        gtk_widget_class_bind_template_child (widget_class, GrEditPage, ingredients_box2);
+        gtk_widget_class_bind_template_callback (widget_class, add_list2);
+
         gtk_widget_class_bind_template_child (widget_class, GrEditPage, unit_list);
         gtk_widget_class_bind_template_child (widget_class, GrEditPage, amount_search_button);
         gtk_widget_class_bind_template_child (widget_class, GrEditPage, amount_search_button_label);
@@ -1938,9 +1946,6 @@ static void
 populate_ingredients (GrEditPage *page,
                       const char *text)
 {
-        g_autoptr(GrIngredientsList) ingredients = NULL;
-        g_autofree char **segs = NULL;
-        int i, j;
         GtkWidget *button;
 
         container_remove_all (GTK_CONTAINER (page->ingredients_box));
@@ -1951,11 +1956,16 @@ populate_ingredients (GrEditPage *page,
         if (strcmp (text, "") == 0)
                 add_list (NULL, page);
         else {
+                g_autoptr(GrIngredientsList) ingredients = NULL;
+                g_autofree char **segs = NULL;
+                int j;
+
                 ingredients = gr_ingredients_list_new (text);
                 segs = gr_ingredients_list_get_segments (ingredients);
                 for (j = 0; segs[j]; j++) {
                         GtkWidget *list;
                         g_auto(GStrv) ings = NULL;
+                        int i;
 
                         list = add_ingredients_segment (page, segs[j]);
                         ings = gr_ingredients_list_get_ingredients (ingredients, segs[j]);
@@ -1983,6 +1993,55 @@ populate_ingredients (GrEditPage *page,
         gtk_box_pack_end (GTK_BOX (page->ingredients_box), button, FALSE, TRUE, 0);
         g_signal_connect (button, "clicked", G_CALLBACK (add_list), page);
         update_segments (page);
+
+        container_remove_all (GTK_CONTAINER (page->ingredients_box2));
+
+        if (strcmp (text, "") == 0) {
+                GtkWidget *list;
+
+                list = g_object_new (GR_TYPE_INGREDIENTS_VIEWER,
+                                     "title", "",
+                                     "editable-title", FALSE,
+                                     "editable", TRUE,
+                                     "ingredients", "",
+                                     NULL);
+                gtk_container_add (GTK_CONTAINER (page->ingredients_box2), list);
+        }
+        else {
+                g_autoptr(GrIngredientsList) ingredients = NULL;
+                g_autofree char **segs = NULL;
+                gboolean editable_title;
+                int j;
+
+                ingredients = gr_ingredients_list_new (text);
+                segs = gr_ingredients_list_get_segments (ingredients);
+                editable_title = g_strv_length (segs) > 1;
+                for (j = 0; segs[j]; j++) {
+                        GtkWidget *list;
+
+                        list = g_object_new (GR_TYPE_INGREDIENTS_VIEWER,
+                                             "title", segs[j],
+                                             "editable-title", editable_title,
+                                             "editable", TRUE,
+                                             "ingredients", text,
+                                             NULL);
+                        gtk_container_add (GTK_CONTAINER (page->ingredients_box2), list);
+                }
+        }
+}
+
+static void
+add_list2 (GtkButton *button, GrEditPage *page)
+{
+        GtkWidget *list;
+
+        list = g_object_new (GR_TYPE_INGREDIENTS_VIEWER,
+                             "title", "",
+                             "editable-title", TRUE,
+                             "editable", TRUE,
+                             "ingredients", "",
+                             NULL);
+        gtk_container_add (GTK_CONTAINER (page->ingredients_box2), list);
 }
 
 static void
diff --git a/src/gr-edit-page.ui b/src/gr-edit-page.ui
index 717a840..6dcf5c6 100644
--- a/src/gr-edit-page.ui
+++ b/src/gr-edit-page.ui
@@ -242,6 +242,19 @@
                         <property name="orientation">vertical</property>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkBox" id="ingredients_box2">
+                        <property name="visible">1</property>
+                        <property name="orientation">vertical</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkButton">
+                        <property name="visible">1</property>
+                        <property name="label" translatable="yes">Add List</property>
+                        <signal name="clicked" handler="add_list2"/>
+                      </object>
+                    </child>
                   </object>
                   <packing>
                     <property name="left-attach">0</property>
diff --git a/src/gr-ingredients-viewer-row.c b/src/gr-ingredients-viewer-row.c
index 5119044..9644d45 100644
--- a/src/gr-ingredients-viewer-row.c
+++ b/src/gr-ingredients-viewer-row.c
@@ -31,16 +31,27 @@ struct _GrIngredientsViewerRow
 {
         GtkListBoxRow parent_instance;
 
-        GtkWidget *label;
+        GtkWidget *unit_label;
+        GtkWidget *ingredient_label;
 
+        char *amount;
+        char *unit;
         char *ingredient;
+
+        gboolean editable;
+
+        GtkSizeGroup *group;
 };
 
 G_DEFINE_TYPE (GrIngredientsViewerRow, gr_ingredients_viewer_row, GTK_TYPE_LIST_BOX_ROW)
 
 enum {
         PROP_0,
-        PROP_INGREDIENT
+        PROP_AMOUNT,
+        PROP_UNIT,
+        PROP_INGREDIENT,
+        PROP_SIZE_GROUP,
+        PROP_EDITABLE
 };
 
 static void
@@ -48,8 +59,12 @@ gr_ingredients_viewer_row_finalize (GObject *object)
 {
         GrIngredientsViewerRow *self = GR_INGREDIENTS_VIEWER_ROW (object);
 
+        g_free (self->amount);
+        g_free (self->unit);
         g_free (self->ingredient);
 
+        g_clear_object (&self->group);
+
         G_OBJECT_CLASS (gr_ingredients_viewer_row_parent_class)->finalize (object);
 }
 
@@ -63,15 +78,69 @@ gr_ingredients_viewer_row_get_property (GObject    *object,
 
         switch (prop_id)
           {
+          case PROP_AMOUNT:
+                g_value_set_string (value, self->amount);
+                break;
+
+          case PROP_UNIT:
+                g_value_set_string (value, self->unit);
+                break;
+
           case PROP_INGREDIENT:
                 g_value_set_string (value, self->ingredient);
                 break;
+
+          case PROP_SIZE_GROUP:
+                g_value_set_object (value, self->group);
+                break;
+
+          case PROP_EDITABLE:
+                g_value_set_boolean (value, self->editable);
+                break;
+
           default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
           }
 }
 
 static void
+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);
+}
+
+
+static void
+gr_ingredients_viewer_row_set_amount (GrIngredientsViewerRow *row,
+                                      const char             *amount)
+{
+        g_free (row->amount);
+        row->amount = g_strdup (amount);
+        update_unit (row);
+}
+
+static void
+gr_ingredients_viewer_row_set_unit (GrIngredientsViewerRow *row,
+                                    const char             *unit)
+{
+        g_free (row->unit);
+        row->unit = g_strdup (unit);
+        update_unit (row);
+}
+
+static void
+gr_ingredients_viewer_row_set_ingredient (GrIngredientsViewerRow *row,
+                                          const char             *ingredient)
+{
+        g_free (row->ingredient);
+        row->ingredient = g_strdup (ingredient);
+        gtk_label_set_label (GTK_LABEL (row->ingredient_label), ingredient);
+}
+
+static void
 gr_ingredients_viewer_row_set_property (GObject      *object,
                                        guint         prop_id,
                                        const GValue *value,
@@ -81,13 +150,31 @@ gr_ingredients_viewer_row_set_property (GObject      *object,
 
         switch (prop_id)
           {
+          case PROP_AMOUNT:
+                gr_ingredients_viewer_row_set_amount (self, g_value_get_string (value));
+                break;
+
+          case PROP_UNIT:
+                gr_ingredients_viewer_row_set_unit (self, g_value_get_string (value));
+                break;
+
           case PROP_INGREDIENT:
-                {
-                        g_free (self->ingredient);
-                        self->ingredient = g_value_dup_string (value);
-                        gtk_label_set_label (GTK_LABEL (self->label), self->ingredient);
-                }
+                gr_ingredients_viewer_row_set_ingredient (self, g_value_get_string (value));
+                break;
+
+          case PROP_SIZE_GROUP:
+                if (self->group)
+                        gtk_size_group_remove_widget (self->group, self->unit_label);
+                g_set_object (&self->group, g_value_get_object (value));
+                if (self->group)
+                        gtk_size_group_add_widget (self->group, self->unit_label);
                 break;
+
+          case PROP_EDITABLE:
+                self->editable = g_value_get_boolean (value);
+                gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (object), self->editable);
+                break;
+
           default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
           }
@@ -104,14 +191,35 @@ gr_ingredients_viewer_row_class_init (GrIngredientsViewerRowClass *klass)
         object_class->get_property = gr_ingredients_viewer_row_get_property;
         object_class->set_property = gr_ingredients_viewer_row_set_property;
 
+        pspec = g_param_spec_string ("amount", NULL, NULL,
+                                     NULL,
+                                     G_PARAM_READWRITE);
+        g_object_class_install_property (object_class, PROP_AMOUNT, pspec);
+
+        pspec = g_param_spec_string ("unit", NULL, NULL,
+                                     NULL,
+                                     G_PARAM_READWRITE);
+        g_object_class_install_property (object_class, PROP_UNIT, pspec);
+
         pspec = g_param_spec_string ("ingredient", NULL, NULL,
                                      NULL,
                                      G_PARAM_READWRITE);
         g_object_class_install_property (object_class, PROP_INGREDIENT, pspec);
 
+        pspec = g_param_spec_object ("size-group", NULL, NULL,
+                                     GTK_TYPE_SIZE_GROUP,
+                                     G_PARAM_READWRITE);
+        g_object_class_install_property (object_class, PROP_SIZE_GROUP, pspec);
+
+        pspec = g_param_spec_boolean ("editable", NULL, NULL,
+                                      FALSE,
+                                      G_PARAM_READWRITE|G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class, PROP_EDITABLE, pspec);
+
         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, label);
+        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, unit_label);
+        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewerRow, ingredient_label);
 }
 
 static void
@@ -120,11 +228,3 @@ gr_ingredients_viewer_row_init (GrIngredientsViewerRow *self)
         gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
         gtk_widget_init_template (GTK_WIDGET (self));
 }
-
-GrIngredientsViewerRow *
-gr_ingredients_viewer_row_new (const char *ingredient)
-{
-        return GR_INGREDIENTS_VIEWER_ROW (g_object_new (GR_TYPE_INGREDIENTS_VIEWER_ROW,
-                                         "ingredient", ingredient,
-                                         NULL));
-}
diff --git a/src/gr-ingredients-viewer-row.h b/src/gr-ingredients-viewer-row.h
index a3d9fd2..317037e 100644
--- a/src/gr-ingredients-viewer-row.h
+++ b/src/gr-ingredients-viewer-row.h
@@ -28,6 +28,4 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (GrIngredientsViewerRow, gr_ingredients_viewer_row, GR, INGREDIENTS_VIEWER_ROW, 
GtkListBoxRow)
 
-GrIngredientsViewerRow *gr_ingredients_viewer_row_new (const char *ingredient);
-
 G_END_DECLS
diff --git a/src/gr-ingredients-viewer-row.ui b/src/gr-ingredients-viewer-row.ui
index 5fb713f..e1c7413 100644
--- a/src/gr-ingredients-viewer-row.ui
+++ b/src/gr-ingredients-viewer-row.ui
@@ -8,7 +8,16 @@
         <property name="spacing">12</property>
         <property name="margin">6</property>
         <child>
-          <object class="GtkLabel" id="label">
+          <object class="GtkLabel" id="unit_label">
+            <property name="visible">1</property>
+            <property name="xalign">0</property>
+            <style>
+              <class name="dim-label"/>
+            </style>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel" id="ingredient_label">
             <property name="visible">1</property>
             <property name="xalign">0</property>
           </object>
diff --git a/src/gr-ingredients-viewer.c b/src/gr-ingredients-viewer.c
index 51478fd..1530ca0 100644
--- a/src/gr-ingredients-viewer.c
+++ b/src/gr-ingredients-viewer.c
@@ -24,6 +24,7 @@
 
 #include "gr-ingredients-viewer.h"
 #include "gr-ingredients-viewer-row.h"
+#include "gr-ingredients-list.h"
 #include "gr-utils.h"
 
 
@@ -34,8 +35,13 @@ struct _GrIngredientsViewer
         GtkWidget *title_stack;
         GtkWidget *title_entry;
         GtkWidget *list;
+        GtkWidget *add_button;
 
-        char **ingredients;
+        char *title;
+        char *ingredients;
+        gboolean editable;
+
+        GtkSizeGroup *group;
 };
 
 
@@ -45,6 +51,7 @@ enum {
         PROP_0,
         PROP_TITLE,
         PROP_EDITABLE_TITLE,
+        PROP_EDITABLE,
         PROP_INGREDIENTS
 };
 
@@ -53,7 +60,10 @@ gr_ingredients_viewer_finalize (GObject *object)
 {
         GrIngredientsViewer *viewer = GR_INGREDIENTS_VIEWER (object);
 
-        g_strfreev (viewer->ingredients);
+        g_free (viewer->title);
+        g_free (viewer->ingredients);
+
+        g_clear_object (&viewer->group);
 
         G_OBJECT_CLASS (gr_ingredients_viewer_parent_class)->finalize (object);
 }
@@ -65,23 +75,25 @@ gr_ingredients_viewer_get_property (GObject    *object,
                                     GParamSpec *pspec)
 {
         GrIngredientsViewer *self = GR_INGREDIENTS_VIEWER (object);
+        const char *visible;
 
         switch (prop_id)
           {
           case PROP_TITLE:
-                g_value_set_string (value, gtk_entry_get_text (GTK_ENTRY (self->title_entry)));
+                g_value_set_string (value, self->title);
                 break;
 
-          case PROP_EDITABLE_TITLE: {
-                        const char *visible;
+          case PROP_EDITABLE_TITLE:
+                visible = gtk_stack_get_visible_child_name (GTK_STACK (self->title_stack));
+                g_value_set_boolean (value, strcmp (visible, "entry") == 0);
+                break;
 
-                        visible = gtk_stack_get_visible_child_name (GTK_STACK (self->title_stack));
-                        g_value_set_boolean (value, strcmp (visible, "entry") == 0);
-                }
+          case PROP_EDITABLE:
+                g_value_set_boolean (value, self->editable);
                 break;
 
           case PROP_INGREDIENTS:
-                g_value_set_boxed (value, self->ingredients);
+                g_value_set_string (value, self->ingredients);
                 break;
 
           default:
@@ -90,26 +102,63 @@ gr_ingredients_viewer_get_property (GObject    *object,
 }
 
 static void
-gr_ingredients_viewer_set_ingredients (GrIngredientsViewer  *viewer,
-                                       const char          **ings)
+gr_ingredients_viewer_set_ingredients (GrIngredientsViewer *viewer,
+                                       const char          *text)
 {
+        g_autoptr(GrIngredientsList) ingredients = NULL;
+        g_auto(GStrv) ings = NULL;
         int i;
 
-        g_strfreev (viewer->ingredients);
-        viewer->ingredients = g_strdupv ((char **)ings);
+        g_free (viewer->ingredients);
+        viewer->ingredients = g_strdup (text);
 
         container_remove_all (GTK_CONTAINER (viewer->list));
 
+        ingredients = gr_ingredients_list_new (text);
+        ings = gr_ingredients_list_get_ingredients (ingredients, viewer->title);
         for (i = 0; ings && ings[i]; i++) {
+                g_autofree char *s = NULL;
+                g_auto(GStrv) strv = NULL;
+                const char *amount;
+                const char *unit;
                 GtkWidget *row;
 
-                row = g_object_new (GR_TYPE_INGREDIENTS_VIEWER_ROW, "ingredient", ings[i], NULL);
+                s = gr_ingredients_list_scale_unit (ingredients, viewer->title, ings[i], 1, 1);
+                strv = g_strsplit (s, " ", 2);
+                amount = strv[0];
+                unit = strv[1] ? strv[1] : "";
+
+                row = g_object_new (GR_TYPE_INGREDIENTS_VIEWER_ROW,
+                                    "amount", amount,
+                                    "unit", unit,
+                                    "ingredient", ings[i],
+                                    "size-group", viewer->group,
+                                    "editable", viewer->editable,
+                                    NULL);
 
                 gtk_container_add (GTK_CONTAINER (viewer->list), row);
         }
 }
 
 static void
+gr_ingredients_viewer_set_title (GrIngredientsViewer *viewer,
+                                 const char          *title)
+{
+        g_free (viewer->title);
+        viewer->title = g_strdup (title);
+
+        gtk_entry_set_text (GTK_ENTRY (viewer->title_entry), title);
+}
+
+static void
+gr_ingredients_viewer_set_editable (GrIngredientsViewer *viewer,
+                                    gboolean             editable)
+{
+        viewer->editable = editable;
+        gtk_widget_set_visible (viewer->add_button, editable);
+}
+
+static void
 gr_ingredients_viewer_set_property (GObject      *object,
                                     guint         prop_id,
                                     const GValue *value,
@@ -120,7 +169,7 @@ gr_ingredients_viewer_set_property (GObject      *object,
         switch (prop_id)
           {
           case PROP_TITLE:
-                gtk_entry_set_text (GTK_ENTRY (self->title_entry), g_value_get_string (value));
+                gr_ingredients_viewer_set_title (self, g_value_get_string (value));
                 break;
 
           case PROP_EDITABLE_TITLE: {
@@ -132,8 +181,12 @@ gr_ingredients_viewer_set_property (GObject      *object,
                 }
                 break;
 
+          case PROP_EDITABLE:
+                gr_ingredients_viewer_set_editable (self, g_value_get_boolean (value));
+                break;
+
           case PROP_INGREDIENTS:
-                gr_ingredients_viewer_set_ingredients (self, (const char **)g_value_get_boxed (value));
+                gr_ingredients_viewer_set_ingredients (self, g_value_get_string (value));
                 break;
 
           default:
@@ -146,6 +199,10 @@ gr_ingredients_viewer_init (GrIngredientsViewer *self)
 {
         gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
         gtk_widget_init_template (GTK_WIDGET (self));
+
+        gtk_list_box_set_header_func (GTK_LIST_BOX (self->list), all_headers, self, NULL);
+
+        self->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 }
 
 
@@ -165,18 +222,24 @@ gr_ingredients_viewer_class_init (GrIngredientsViewerClass *klass)
                                       G_PARAM_READWRITE);
         g_object_class_install_property (object_class, PROP_EDITABLE_TITLE, pspec);
 
+        pspec = g_param_spec_boolean ("editable", NULL, NULL,
+                                      FALSE,
+                                      G_PARAM_READWRITE);
+        g_object_class_install_property (object_class, PROP_EDITABLE, pspec);
+
         pspec = g_param_spec_string ("title", NULL, NULL,
                                      NULL,
                                      G_PARAM_READWRITE);
         g_object_class_install_property (object_class, PROP_TITLE, pspec);
 
-        pspec = g_param_spec_boxed ("ingredients", NULL, NULL,
-                                    G_TYPE_STRV,
-                                    G_PARAM_READWRITE);
+        pspec = g_param_spec_string ("ingredients", NULL, NULL,
+                                     NULL,
+                                     G_PARAM_READWRITE);
         g_object_class_install_property (object_class, PROP_INGREDIENTS, pspec);
 
         gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Recipes/gr-ingredients-viewer.ui");
         gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewer, title_stack);
         gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewer, title_entry);
         gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewer, list);
+        gtk_widget_class_bind_template_child (widget_class, GrIngredientsViewer, add_button);
 }
diff --git a/src/gr-ingredients-viewer.ui b/src/gr-ingredients-viewer.ui
index f02c15d..6a3f2d8 100644
--- a/src/gr-ingredients-viewer.ui
+++ b/src/gr-ingredients-viewer.ui
@@ -52,7 +52,7 @@
     <child>
       <object class="GtkListBox" id="list">
         <property name="visible">1</property>
-        <property name="selection-mode">single</property>
+        <property name="selection-mode">none</property>
         <style>
           <class name="frame"/>
         </style>
@@ -74,7 +74,7 @@
       </object>
     </child>
     <child>
-      <object class="GtkButton">
+      <object class="GtkButton" id="add_button">
         <property name="visible">1</property>
         <property name="halign">start</property>
         <property name="margin-top">10</property>


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