[recipes] shopping: Replace serves with yield



commit fa6baba58e96d654486427e950379934bb5af31b
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jun 23 19:33:30 2017 -0400

    shopping: Replace serves with yield
    
    The popover in the recipe tiles here should use the
    same terminology we use in the edit page.

 src/gr-recipe-small-tile.c  |  102 +++++++++++++++++++++++++++++--------------
 src/gr-recipe-small-tile.h  |    8 ++--
 src/gr-recipe-small-tile.ui |   34 ++++++++++-----
 src/gr-shopping-page.c      |   38 ++++++++--------
 src/recipes.css             |    2 +-
 5 files changed, 116 insertions(+), 68 deletions(-)
---
diff --git a/src/gr-recipe-small-tile.c b/src/gr-recipe-small-tile.c
index 127d2e7..1cf80f5 100644
--- a/src/gr-recipe-small-tile.c
+++ b/src/gr-recipe-small-tile.c
@@ -41,40 +41,41 @@ struct _GrRecipeSmallTile
         GtkWidget *author;
         GtkWidget *image;
         GtkWidget *box;
-        GtkWidget *serves_label;
+        GtkWidget *yield_label;
         GtkWidget *popover;
-        GtkWidget *serves_spin;
+        GtkWidget *yield_spin;
+        GtkWidget *yield_unit_label;
         GtkWidget *remove_button;
 
         GCancellable *cancellable;
 
-        int serves;
+        double yield;
 };
 
 G_DEFINE_TYPE (GrRecipeSmallTile, gr_recipe_small_tile, GTK_TYPE_BUTTON)
 
 enum {
         PROP_0,
-        PROP_SERVES,
+        PROP_YIELD,
         N_PROPS
 };
 
 void
-gr_recipe_small_tile_set_serves (GrRecipeSmallTile *tile,
-                                 int                serves)
+gr_recipe_small_tile_set_yield (GrRecipeSmallTile *tile,
+                                double             yield)
 {
         g_autofree char *tmp = NULL;
 
-        if (tile->serves == serves)
+        if (tile->yield == yield)
                 return;
 
-        tile->serves = serves;
+        tile->yield = yield;
 
-        tmp = g_strdup_printf ("%d", serves);
-        gtk_label_set_label (GTK_LABEL (tile->serves_label), tmp);
-        gtk_spin_button_set_value (GTK_SPIN_BUTTON (tile->serves_spin), serves);
+        tmp = gr_number_format (yield);
+        gtk_label_set_label (GTK_LABEL (tile->yield_label), tmp);
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON (tile->yield_spin), yield);
 
-        g_object_notify (G_OBJECT (tile), "serves");
+        g_object_notify (G_OBJECT (tile), "yield");
 }
 
 static void
@@ -93,17 +94,20 @@ recipe_small_tile_set_recipe (GrRecipeSmallTile *tile,
         if (tile->recipe) {
                 const char *name;
                 const char *author;
+                const char *yield;
                 g_autoptr(GrChef) chef = NULL;
                 g_autofree char *tmp = NULL;
                 GPtrArray *images;
 
                 name = gr_recipe_get_translated_name (recipe);
                 author = gr_recipe_get_author (recipe);
+                yield = gr_recipe_get_yield_unit (recipe);
                 chef = gr_recipe_store_get_chef (store, author);
 
                 gtk_label_set_label (GTK_LABEL (tile->label), name);
                 tmp = g_strdup_printf (_("by %s"), chef ? gr_chef_get_name (chef) : _("Anonymous"));
                 gtk_label_set_label (GTK_LABEL (tile->author), tmp);
+                gtk_label_set_label (GTK_LABEL (tile->yield_unit_label), yield && yield[0] ? yield : 
_("servings"));
 
                 images = gr_recipe_get_images (recipe);
                 if (images->len > 0) {
@@ -130,12 +134,41 @@ tile_clicked (GrRecipeSmallTile *tile)
 }
 
 static void
-serves_value_changed (GrRecipeSmallTile *tile)
+yield_spin_value_changed (GrRecipeSmallTile *tile)
 {
-        int serves;
+        double yield;
 
-        serves = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (tile->serves_spin));
-        gr_recipe_small_tile_set_serves (tile, serves);
+        yield = gtk_spin_button_get_value (GTK_SPIN_BUTTON (tile->yield_spin));
+        gr_recipe_small_tile_set_yield (tile, yield);
+}
+
+static int
+yield_spin_input (GtkSpinButton *spin,
+                  double        *new_val)
+{
+        char *text;
+
+        text = (char *)gtk_entry_get_text (GTK_ENTRY (spin));
+
+        if (!gr_number_parse (new_val, &text, NULL)) {
+                *new_val = 0.0;
+                return GTK_INPUT_ERROR;
+        }
+
+        return TRUE;
+}
+
+static int
+yield_spin_output (GtkSpinButton *spin)
+{
+        GtkAdjustment *adj;
+        g_autofree char *text = NULL;
+
+        adj = gtk_spin_button_get_adjustment (spin);
+        text = gr_number_format (gtk_adjustment_get_value (adj));
+        gtk_entry_set_text (GTK_ENTRY (spin), text);
+
+        return TRUE;
 }
 
 static void
@@ -165,7 +198,7 @@ gr_recipe_small_tile_init (GrRecipeSmallTile *tile)
 {
         gtk_widget_set_has_window (GTK_WIDGET (tile), FALSE);
         gtk_widget_init_template (GTK_WIDGET (tile));
-        gr_recipe_small_tile_set_serves (tile, 1);
+        gr_recipe_small_tile_set_yield (tile, 1.0);
 }
 
 static void
@@ -177,8 +210,8 @@ recipe_small_tile_get_property (GObject    *object,
         GrRecipeSmallTile *self = GR_RECIPE_SMALL_TILE (object);
 
         switch (prop_id) {
-        case PROP_SERVES:
-                g_value_set_int (value, self->serves);
+        case PROP_YIELD:
+                g_value_set_double (value, self->yield);
                 break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -194,8 +227,8 @@ recipe_small_tile_set_property (GObject      *object,
         GrRecipeSmallTile *self = GR_RECIPE_SMALL_TILE (object);
 
         switch (prop_id) {
-        case PROP_SERVES:
-                gr_recipe_small_tile_set_serves (self, g_value_get_int (value));
+        case PROP_YIELD:
+                gr_recipe_small_tile_set_yield (self, g_value_get_double (value));
                 break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -213,10 +246,10 @@ gr_recipe_small_tile_class_init (GrRecipeSmallTileClass *klass)
         object_class->get_property = recipe_small_tile_get_property;
         object_class->set_property = recipe_small_tile_set_property;
 
-        pspec = g_param_spec_int ("serves", NULL, NULL,
-                                  0, G_MAXINT, 1,
-                                  G_PARAM_READWRITE);
-        g_object_class_install_property (object_class, PROP_SERVES, pspec);
+        pspec = g_param_spec_double ("yield", NULL, NULL,
+                                     0.0, G_MAXDOUBLE, 1.0,
+                                     G_PARAM_READWRITE);
+        g_object_class_install_property (object_class, PROP_YIELD, pspec);
 
         gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Recipes/gr-recipe-small-tile.ui");
 
@@ -224,25 +257,28 @@ gr_recipe_small_tile_class_init (GrRecipeSmallTileClass *klass)
         gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, author);
         gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, image);
         gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, box);
-        gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, serves_label);
+        gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, yield_label);
         gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, popover);
-        gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, serves_spin);
+        gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, yield_spin);
+        gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, yield_unit_label);
         gtk_widget_class_bind_template_child (widget_class, GrRecipeSmallTile, remove_button);
 
         gtk_widget_class_bind_template_callback (widget_class, tile_clicked);
-        gtk_widget_class_bind_template_callback (widget_class, serves_value_changed);
+        gtk_widget_class_bind_template_callback (widget_class, yield_spin_value_changed);
+        gtk_widget_class_bind_template_callback (widget_class, yield_spin_input);
+        gtk_widget_class_bind_template_callback (widget_class, yield_spin_output);
         gtk_widget_class_bind_template_callback (widget_class, remove_recipe);
 }
 
 GtkWidget *
 gr_recipe_small_tile_new (GrRecipe *recipe,
-                          int       serves)
+                          double    yield)
 {
         GrRecipeSmallTile *tile;
 
         tile = g_object_new (GR_TYPE_RECIPE_SMALL_TILE, NULL);
         recipe_small_tile_set_recipe (tile, recipe);
-        gr_recipe_small_tile_set_serves (tile, serves);
+        gr_recipe_small_tile_set_yield (tile, yield);
 
         return GTK_WIDGET (tile);
 }
@@ -253,8 +289,8 @@ gr_recipe_small_tile_get_recipe (GrRecipeSmallTile *tile)
         return tile->recipe;
 }
 
-int
-gr_recipe_small_tile_get_serves (GrRecipeSmallTile *tile)
+double
+gr_recipe_small_tile_get_yield (GrRecipeSmallTile *tile)
 {
-        return tile->serves;
+        return tile->yield;
 }
diff --git a/src/gr-recipe-small-tile.h b/src/gr-recipe-small-tile.h
index 7afd9b8..1f3c945 100644
--- a/src/gr-recipe-small-tile.h
+++ b/src/gr-recipe-small-tile.h
@@ -31,10 +31,10 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GrRecipeSmallTile, gr_recipe_small_tile, GR, RECIPE_SMALL_TILE, GtkButton)
 
 GtkWidget      *gr_recipe_small_tile_new        (GrRecipe          *recipe,
-                                                 int                serves);
+                                                 double             yield);
 GrRecipe       *gr_recipe_small_tile_get_recipe (GrRecipeSmallTile *tile);
-int             gr_recipe_small_tile_get_serves (GrRecipeSmallTile *tile);
-void            gr_recipe_small_tile_set_serves (GrRecipeSmallTile *tile,
-                                                 int                serves);
+double          gr_recipe_small_tile_get_yield  (GrRecipeSmallTile *tile);
+void            gr_recipe_small_tile_set_yield  (GrRecipeSmallTile *tile,
+                                                 double             yield);
 
 G_END_DECLS
diff --git a/src/gr-recipe-small-tile.ui b/src/gr-recipe-small-tile.ui
index 63cebb1..06ddfc9 100644
--- a/src/gr-recipe-small-tile.ui
+++ b/src/gr-recipe-small-tile.ui
@@ -66,12 +66,12 @@
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="serves_label">
+              <object class="GtkLabel" id="yield_label">
                 <property name="visible">1</property>
                 <property name="halign">end</property>
                 <property name="valign">start</property>
                 <style>
-                  <class name="serves-overlay"/>
+                  <class name="yield-overlay"/>
                 </style>
               </object>
             </child>
@@ -80,25 +80,25 @@
       </object>
     </child>
   </template>
-  <object class="GtkAdjustment" id="serves_adjustment">
+  <object class="GtkAdjustment" id="yield_adjustment">
     <property name="lower">1</property>
     <property name="upper">99</property>
     <property name="step-increment">1</property>
     <property name="page-increment">10</property>
   </object>
   <object class="GtkPopover" id="popover">
-    <property name="relative-to">serves_label</property>
+    <property name="relative-to">yield_label</property>
     <child>
       <object class="GtkGrid">
         <property name="visible">1</property>
         <property name="margin">10</property>
         <property name="row-spacing">10</property>
-        <property name="column-spacing">20</property>
+        <property name="column-spacing">10</property>
         <child>
           <object class="GtkLabel">
             <property name="visible">1</property>
             <property name="xalign">0</property>
-            <property name="label" translatable="yes">Serves</property>
+            <property name="label" translatable="yes">Yield</property>
             <property name="valign">baseline</property>
           </object>
           <packing>
@@ -107,12 +107,14 @@
           </packing>
         </child>
         <child>
-          <object class="GtkSpinButton" id="serves_spin">
+          <object class="GtkSpinButton" id="yield_spin">
             <property name="visible">1</property>
-            <property name="adjustment">serves_adjustment</property>
-            <property name="width-chars">2</property>
+            <property name="adjustment">yield_adjustment</property>
+            <property name="width-chars">4</property>
             <property name="valign">baseline</property>
-            <signal name="value-changed" handler="serves_value_changed" swapped="yes"/>
+            <signal name="value-changed" handler="yield_spin_value_changed" swapped="yes"/>
+            <signal name="input" handler="yield_spin_input"/>
+            <signal name="output" handler="yield_spin_output"/>
           </object>
           <packing>
             <property name="left-attach">1</property>
@@ -120,6 +122,16 @@
           </packing>
         </child>
         <child>
+          <object class="GtkLabel" id="yield_unit_label">
+            <property name="visible">1</property>
+            <property name="valign">baseline</property>
+          </object>
+          <packing>
+            <property name="left-attach">2</property>
+            <property name="top-attach">0</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkButton" id="remove_button">
             <property name="visible">1</property>
             <property name="label" translatable="yes">Remove</property>
@@ -132,7 +144,7 @@
           <packing>
             <property name="left-attach">0</property>
             <property name="top-attach">1</property>
-            <property name="width">2</property>
+            <property name="width">3</property>
           </packing>
         </child>
       </object>
diff --git a/src/gr-shopping-page.c b/src/gr-shopping-page.c
index cbffdb9..ff00ec2 100644
--- a/src/gr-shopping-page.c
+++ b/src/gr-shopping-page.c
@@ -452,7 +452,7 @@ add_ingredient (GrShoppingPage *page,
 static void
 collect_ingredients_from_recipe (GrShoppingPage *page,
                                  GrRecipe       *recipe,
-                                 int             serves)
+                                 double          yield)
 {
         g_autoptr(GrIngredientsList) il = NULL;
         g_autofree char **seg = NULL;
@@ -468,7 +468,7 @@ collect_ingredients_from_recipe (GrShoppingPage *page,
                         double amount;
 
                         amount = gr_ingredients_list_get_amount (il, seg[i], ing[j]);
-                        amount = amount * serves / (double)gr_recipe_get_serves (recipe);
+                        amount = amount * yield / gr_recipe_get_yield (recipe);
                         unit = gr_ingredients_list_get_unit (il, seg[i], ing[j]);
                         add_ingredient (page, amount, unit, ing[j]);
                 }
@@ -492,11 +492,11 @@ collect_ingredients (GrShoppingPage *page)
         for (l = children; l; l = l->next) {
                 GtkWidget *tile = gtk_bin_get_child (GTK_BIN (l->data));
                 GrRecipe *recipe;
-                int serves;
+                double yield;
 
                 recipe = gr_recipe_small_tile_get_recipe (GR_RECIPE_SMALL_TILE (tile));
-                serves = gr_recipe_small_tile_get_serves (GR_RECIPE_SMALL_TILE (tile));
-                collect_ingredients_from_recipe (page, recipe, serves);
+                yield = gr_recipe_small_tile_get_yield (GR_RECIPE_SMALL_TILE (tile));
+                collect_ingredients_from_recipe (page, recipe, yield);
         }
         g_list_free (children);
 
@@ -520,24 +520,24 @@ collect_ingredients (GrShoppingPage *page)
 }
 
 static void
-serves_changed (GObject *object, GParamSpec *pspec, GrShoppingPage *page)
+yield_changed (GObject *object, GParamSpec *pspec, GrShoppingPage *page)
 {
         GrRecipeSmallTile *tile = GR_RECIPE_SMALL_TILE (object);
         GrRecipeStore *store;
         GrRecipe *recipe;
-        int serves;
+        double yield;
 
         recipe = gr_recipe_small_tile_get_recipe (tile);
-        serves = gr_recipe_small_tile_get_serves (tile);
+        yield = gr_recipe_small_tile_get_yield (tile);
 
         store = gr_recipe_store_get ();
 
-        gr_recipe_store_add_to_shopping (store, recipe, serves);
+        gr_recipe_store_add_to_shopping (store, recipe, yield);
 }
 
 static void
 search_started (GrRecipeSearch *search,
-                GrShoppingPage     *page)
+                GrShoppingPage *page)
 {
         container_remove_all (GTK_CONTAINER (page->recipe_list));
         page->recipe_count = 0;
@@ -556,11 +556,11 @@ search_hits_added (GrRecipeSearch *search,
         for (l = hits; l; l = l->next) {
                 GrRecipe *recipe = l->data;
                 GtkWidget *tile;
-                int serves;
+                double yield;
 
-                serves = gr_recipe_store_get_shopping_serves (store, recipe);
-                tile = gr_recipe_small_tile_new (recipe, serves);
-                g_signal_connect (tile, "notify::serves", G_CALLBACK (serves_changed), page);
+                yield = gr_recipe_store_get_shopping_yield (store, recipe);
+                tile = gr_recipe_small_tile_new (recipe, yield);
+                g_signal_connect (tile, "notify::yield", G_CALLBACK (yield_changed), page);
                 gtk_container_add (GTK_CONTAINER (page->recipe_list), tile);
                 page->recipe_count++;
         }
@@ -903,21 +903,21 @@ recipe_added (GrShoppingPage *page,
 {
         GrRecipeStore *store;
         GList *children, *l;
-        int serves;
+        double yield;
 
         if (!gtk_widget_is_drawable (GTK_WIDGET (page)))
                 return;
 
         store = gr_recipe_store_get ();
 
-        serves = gr_recipe_store_get_shopping_serves (store, recipe);
+        yield = gr_recipe_store_get_shopping_yield (store, recipe);
 
         children = gtk_container_get_children (GTK_CONTAINER (page->recipe_list));
         for (l = children; l; l = l->next) {
                 GtkWidget *tile = gtk_bin_get_child (GTK_BIN (l->data));
 
                 if (recipe == gr_recipe_small_tile_get_recipe (GR_RECIPE_SMALL_TILE (tile))) {
-                        gr_recipe_small_tile_set_serves (GR_RECIPE_SMALL_TILE (tile), serves);
+                        gr_recipe_small_tile_set_yield (GR_RECIPE_SMALL_TILE (tile), yield);
                         break;
                 }
         }
@@ -926,8 +926,8 @@ recipe_added (GrShoppingPage *page,
         if (l == NULL) {
                 GtkWidget *tile;
 
-                tile = gr_recipe_small_tile_new (recipe, serves);
-                g_signal_connect (tile, "notify::serves", G_CALLBACK (serves_changed), page);
+                tile = gr_recipe_small_tile_new (recipe, yield);
+                g_signal_connect (tile, "notify::yield", G_CALLBACK (yield_changed), page);
                 gtk_container_add (GTK_CONTAINER (page->recipe_list), tile);
         }
 
diff --git a/src/recipes.css b/src/recipes.css
index ce86565..67f1838 100644
--- a/src/recipes.css
+++ b/src/recipes.css
@@ -395,7 +395,7 @@ box.cooking.overlay.confirm button:last-child {
         color: #ccc;
 }
 
-label.serves-overlay {
+label.yield-overlay {
         background-color: @theme_selected_bg_color;
         color: @theme_selected_fg_color;
         padding: 5px;


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