[recipes] query editor: Integrate spiciness search



commit c12e4c45c09a6ff94eed19e60d2d9f949f0cfd14
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Feb 6 17:14:57 2017 +0100

    query editor: Integrate spiciness search
    
    This adds another field just like the meals field,
    for spiciness levels.

 src/gr-query-editor.c  |  143 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/gr-query-editor.ui |   63 +++++++++++++++++++++
 2 files changed, 205 insertions(+), 1 deletions(-)
---
diff --git a/src/gr-query-editor.c b/src/gr-query-editor.c
index fb22c39..359a5cf 100644
--- a/src/gr-query-editor.c
+++ b/src/gr-query-editor.c
@@ -25,9 +25,10 @@
 #include "gr-query-editor.h"
 #include "gr-ingredient.h"
 #include "gr-meal.h"
-#include "gr-ingredient-row.h"
 #include "gr-meal-row.h"
+#include "gr-spice-row.h"
 #include "gr-diet-row.h"
+#include "gr-ingredient-row.h"
 
 struct _GrQueryEditor
 {
@@ -39,6 +40,10 @@ struct _GrQueryEditor
         GtkWidget *meal_search_button;
         GtkWidget *meal_search_button_label;
         GtkWidget *meal_list;
+        GtkWidget *spice_search_revealer;
+        GtkWidget *spice_search_button;
+        GtkWidget *spice_search_button_label;
+        GtkWidget *spice_list;
         GtkWidget *diet_search_revealer;
         GtkWidget *diet_search_button;
         GtkWidget *diet_search_button_label;
@@ -104,6 +109,28 @@ hide_meal_search_list (GrQueryEditor *self,
 }
 
 static void
+show_spice_search_list (GrQueryEditor *self)
+{
+        gtk_widget_hide (self->spice_search_button);
+        gtk_widget_show (self->spice_search_revealer);
+        gtk_revealer_set_reveal_child (GTK_REVEALER (self->spice_search_revealer), TRUE);
+}
+
+static void
+hide_spice_search_list (GrQueryEditor *self,
+                        gboolean       animate)
+{
+        gtk_widget_show (self->spice_search_button);
+        if (!animate)
+                gtk_revealer_set_transition_type (GTK_REVEALER (self->spice_search_revealer),
+                                                  GTK_REVEALER_TRANSITION_TYPE_NONE);
+        gtk_revealer_set_reveal_child (GTK_REVEALER (self->spice_search_revealer), FALSE);
+        if (!animate)
+                gtk_revealer_set_transition_type (GTK_REVEALER (self->spice_search_revealer),
+                                                  GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN);
+}
+
+static void
 show_diet_search_list (GrQueryEditor *self)
 {
         gtk_widget_hide (self->diet_search_button);
@@ -153,15 +180,27 @@ meal_search_button_clicked (GtkButton     *button,
                             GrQueryEditor *self)
 {
         hide_diet_search_list (self, TRUE);
+        hide_spice_search_list (self, TRUE);
         hide_ingredients_search_list (self, TRUE);
         show_meal_search_list (self);
 }
 
 static void
+spice_search_button_clicked (GtkButton     *button,
+                             GrQueryEditor *self)
+{
+        hide_meal_search_list (self, TRUE);
+        hide_diet_search_list (self, TRUE);
+        hide_ingredients_search_list (self, TRUE);
+        show_spice_search_list (self);
+}
+
+static void
 diet_search_button_clicked (GtkButton     *button,
                             GrQueryEditor *self)
 {
         hide_meal_search_list (self, TRUE);
+        hide_spice_search_list (self, TRUE);
         hide_ingredients_search_list (self, TRUE);
         show_diet_search_list (self);
 }
@@ -171,6 +210,7 @@ ing_search_button_clicked (GtkButton     *button,
                            GrQueryEditor *self)
 {
         hide_meal_search_list (self, TRUE);
+        hide_spice_search_list (self, TRUE);
         hide_diet_search_list (self, TRUE);
         show_ingredients_search_list (self);
 }
@@ -468,6 +508,71 @@ populate_meals_list (GrQueryEditor *self)
 }
 
 static void
+spice_header_func (GtkListBoxRow *row,
+                  GtkListBoxRow *before,
+                  gpointer       data)
+{
+        if (before != NULL && !GR_IS_SPICE_ROW (before))
+                gtk_list_box_row_set_header (row, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
+        else
+                gtk_list_box_row_set_header (row, NULL);
+}
+
+static void
+spice_row_activated (GtkListBox    *list,
+                     GtkListBoxRow *row,
+                     GrQueryEditor *self)
+{
+        gboolean include;
+
+        if (!GR_IS_SPICE_ROW (row)) {
+                GList *children, *l;
+
+                children = gtk_container_get_children (GTK_CONTAINER (list));
+                for (l = children; l; l = l->next) {
+                        row = l->data;
+                        if (GR_IS_SPICE_ROW (row)) {
+                                g_object_set (row, "include", FALSE, NULL);
+                        }
+                }
+                g_list_free (children);
+
+                hide_spice_search_list (self, TRUE);
+
+                return;
+        }
+
+        g_object_get (row, "include", &include, NULL);
+        g_object_set (row, "include", !include, NULL);
+}
+
+static void
+populate_spice_list (GrQueryEditor *self)
+{
+        int i;
+        GtkWidget *row;
+        const char *levels[] = { "mild", "spicy", "hot", "extreme" };
+
+        row = gtk_label_new (_("Any spiciness"));
+        g_object_set (row, "margin", 6, NULL);
+        gtk_label_set_xalign (GTK_LABEL (row), 0);
+        gtk_widget_show (row);
+        gtk_container_add (GTK_CONTAINER (self->spice_list), row);
+
+        for (i = 0; i < G_N_ELEMENTS (levels); i++) {
+                row = GTK_WIDGET (gr_spice_row_new (levels[i]));
+                gtk_widget_show (row);
+                gtk_container_add (GTK_CONTAINER (self->spice_list), row);
+                gr_spice_row_set_entry (GR_SPICE_ROW (row), GD_TAGGED_ENTRY (self->entry));
+        }
+
+        gtk_list_box_set_header_func (GTK_LIST_BOX (self->spice_list),
+                                      spice_header_func, self, NULL);
+
+        g_signal_connect (self->spice_list, "row-activated", G_CALLBACK (spice_row_activated), self);
+}
+
+static void
 tag_clicked (GdTaggedEntry    *entry,
              GdTaggedEntryTag *tag,
              GrQueryEditor    *self)
@@ -504,6 +609,7 @@ search_popover_notify (GObject       *object,
                        GrQueryEditor *self)
 {
         hide_meal_search_list (self, FALSE);
+        hide_spice_search_list (self, FALSE);
         hide_diet_search_list (self, FALSE);
         hide_ingredients_search_list (self, FALSE);
 }
@@ -575,6 +681,35 @@ entry_changed_cb (GtkWidget     *entry,
 
         g_string_truncate (s2, 0);
 
+        children = gtk_container_get_children (GTK_CONTAINER (editor->spice_list));
+        for (l = children; l; l = l->next) {
+                GtkWidget *row = l->data;
+                g_autofree char *term = NULL;
+                g_autofree char *label = NULL;
+
+                if (!GR_IS_SPICE_ROW (row))
+                        continue;
+
+                term = gr_spice_row_get_search_term (GR_SPICE_ROW (row));
+                if (term)
+                        g_ptr_array_add (a, g_strdup (term));
+
+                label = gr_spice_row_get_label (GR_SPICE_ROW (row));
+                if (label) {
+                        if (s2->len > 0)
+                                g_string_append (s2, ", ");
+                        g_string_append (s2, label);
+                }
+        }
+        g_list_free (children);
+
+        if (s2->len == 0)
+                g_string_append (s2, _("Any spiciness"));
+
+        gtk_label_set_label (GTK_LABEL (editor->spice_search_button_label), s2->str);
+
+        g_string_truncate (s2, 0);
+
         children = gtk_container_get_children (GTK_CONTAINER (editor->diet_list));
         for (l = children; l; l = l->next) {
                 GtkWidget *row = l->data;
@@ -745,6 +880,10 @@ gr_query_editor_class_init (GrQueryEditorClass *klass)
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, meal_search_button);
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, meal_search_button_label);
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, meal_list);
+        gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, spice_search_revealer);
+        gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, spice_search_button);
+        gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, spice_search_button_label);
+        gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, spice_list);
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, diet_search_revealer);
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, diet_search_button);
         gtk_widget_class_bind_template_child (widget_class, GrQueryEditor, diet_search_button_label);
@@ -759,6 +898,7 @@ gr_query_editor_class_init (GrQueryEditorClass *klass)
         gtk_widget_class_bind_template_callback (widget_class, tag_button_clicked);
         gtk_widget_class_bind_template_callback (widget_class, search_popover_notify);
         gtk_widget_class_bind_template_callback (widget_class, meal_search_button_clicked);
+        gtk_widget_class_bind_template_callback (widget_class, spice_search_button_clicked);
         gtk_widget_class_bind_template_callback (widget_class, diet_search_button_clicked);
         gtk_widget_class_bind_template_callback (widget_class, ing_search_button_clicked);
         gtk_widget_class_bind_template_callback (widget_class, entry_key_press_event_cb);
@@ -779,6 +919,7 @@ gr_query_editor_init (GrQueryEditor *self)
         gtk_search_bar_connect_entry (GTK_SEARCH_BAR (self), GTK_ENTRY (self->entry));
 
         populate_meals_list (self);
+        populate_spice_list (self);
         populate_diets_list (self);
         populate_ingredients_list (self);
 }
diff --git a/src/gr-query-editor.ui b/src/gr-query-editor.ui
index 4222fb6..b6ea104 100644
--- a/src/gr-query-editor.ui
+++ b/src/gr-query-editor.ui
@@ -108,6 +108,69 @@
             <property name="xalign">0</property>
             <property name="width-chars">30</property>
             <property name="margin-bottom">10</property>
+            <property name="label" translatable="yes">Spiciness</property>
+            <style>
+              <class name="dim-label"/>
+            </style>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton" id="spice_search_button">
+            <property name="visible">1</property>
+            <signal name="clicked" handler="spice_search_button_clicked"/>
+            <child>
+              <object class="GtkBox">
+                <property name="visible">1</property>
+                <property name="spacing">10</property>
+                <child>
+                  <object class="GtkLabel" id="spice_search_button_label">
+                    <property name="visible">1</property>
+                    <property name="xalign">0</property>
+                    <property name="ellipsize">end</property>
+                    <property name="max-width-chars">25</property>
+                    <property name="label" translatable="yes">Any spiciness</property>
+                  </object>
+                  <packing>
+                    <property name="expand">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">1</property>
+                    <property name="icon-name">pan-down-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkRevealer" id="spice_search_revealer">
+            <property name="visible">1</property>
+            <property name="margin-bottom">20</property>
+            <child>
+              <object class="GtkScrolledWindow">
+                <property name="visible">1</property>
+                <property name="shadow-type">in</property>
+                <property name="hscrollbar-policy">never</property>
+                <property name="vscrollbar-policy">never</property>
+                <child>
+                  <object class="GtkListBox" id="spice_list">
+                    <property name="visible">1</property>
+                    <property name="selection-mode">none</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel">
+            <property name="visible">1</property>
+            <property name="xalign">0</property>
+            <property name="width-chars">30</property>
+            <property name="margin-bottom">10</property>
             <property name="label" translatable="yes">Dietary restrictions</property>
             <style>
               <class name="dim-label"/>


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