[recipes] shopping: Replace serves with yield
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [recipes] shopping: Replace serves with yield
- Date: Mon, 26 Jun 2017 01:47:08 +0000 (UTC)
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]