[recipes] Add completion for ingredients and units
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [recipes] Add completion for ingredients and units
- Date: Fri, 28 Apr 2017 01:48:19 +0000 (UTC)
commit 2b4a27be64e378aa5ace5da81e2291e51d94b0d2
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Apr 20 22:35:06 2017 -0400
Add completion for ingredients and units
This is somewhat simple-minded, and not very efficient, but works.
Future improvements:
- Show and match the spelled-out unit name as well
- Consider not showing the amount in each row
- Show conversions, too
src/gr-ingredients-viewer-row.c | 101 +++++++++++++++++++++++++++++++++++++++
1 files changed, 101 insertions(+), 0 deletions(-)
---
diff --git a/src/gr-ingredients-viewer-row.c b/src/gr-ingredients-viewer-row.c
index 4631a1c..6a52c13 100644
--- a/src/gr-ingredients-viewer-row.c
+++ b/src/gr-ingredients-viewer-row.c
@@ -26,6 +26,7 @@
#include "gr-ingredients-viewer-row.h"
#include "gr-ingredients-viewer.h"
#include "gr-ingredient.h"
+#include "gr-unit.h"
struct _GrIngredientsViewerRow
@@ -429,9 +430,97 @@ drag_data_received (GtkWidget *widget,
g_signal_emit (source, signals[MOVE], 0, target);
}
+static GtkTreeModel *
+get_ingredients_model (void)
+{
+ static GtkListStore *store = NULL;
+
+ if (store == NULL) {
+ const char **names;
+ int length;
+ int i;
+
+ store = gtk_list_store_new (1, G_TYPE_STRING);
+
+ names = gr_ingredient_get_names (&length);
+ for (i = 0; i < length; i++) {
+ gtk_list_store_insert_with_values (store, NULL, -1,
+ 0, names[i],
+ -1);
+ }
+ }
+
+ return GTK_TREE_MODEL (g_object_ref (store));
+}
+
+static void
+prepend_amount (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ GValue *value,
+ gint column,
+ gpointer data)
+{
+ GrIngredientsViewerRow *row = data;
+ GtkTreeModelFilter *filter_model = GTK_TREE_MODEL_FILTER (model);
+ GtkTreeModel *child_model;
+ GtkTreeIter child_iter;
+ g_autofree char *unit = NULL;
+ g_autofree char *tmp = NULL;
+ g_autofree char *text = NULL;
+ g_auto(GStrv) strv = NULL;
+
+ text = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (row->unit_entry))));
+ strv = g_strsplit (text, " ", 2);
+
+ child_model = gtk_tree_model_filter_get_model (filter_model);
+ gtk_tree_model_filter_convert_iter_to_child_iter (filter_model, &child_iter, iter);
+
+ gtk_tree_model_get (child_model, &child_iter, column, &unit, -1);
+
+ tmp = g_strdup_printf ("%s %s", strv[0], unit);
+ g_value_set_string (value, tmp);
+}
+
+static GtkTreeModel *
+get_units_model (GrIngredientsViewerRow *row)
+{
+ static GtkListStore *store = NULL;
+ GtkTreeModel *model;
+ GType types[1];
+
+ if (store == NULL) {
+ const char **names;
+ int i;
+
+ store = gtk_list_store_new (1, G_TYPE_STRING);
+
+ names = gr_unit_get_names ();
+ for (i = 0; names[i]; i++) {
+ gtk_list_store_insert_with_values (store, NULL, -1,
+ 0, names[i],
+ -1);
+ }
+ }
+
+ model = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+ types[0] = G_TYPE_STRING;
+ gtk_tree_model_filter_set_modify_func (GTK_TREE_MODEL_FILTER (model),
+ G_N_ELEMENTS (types),
+ types,
+ prepend_amount,
+ row,
+ NULL);
+
+ return model;
+}
+
static void
gr_ingredients_viewer_row_init (GrIngredientsViewerRow *self)
{
+ g_autoptr(GtkEntryCompletion) completion = NULL;
+ g_autoptr(GtkTreeModel) ingredients_model = NULL;
+ g_autoptr(GtkTreeModel) units_model = NULL;
+
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
gtk_widget_init_template (GTK_WIDGET (self));
@@ -441,4 +530,16 @@ gr_ingredients_viewer_row_init (GrIngredientsViewerRow *self)
gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_ALL, entries, 1, GDK_ACTION_MOVE);
g_signal_connect (self, "drag-data-received", G_CALLBACK (drag_data_received), NULL);
+
+ ingredients_model = get_ingredients_model ();
+ completion = gtk_entry_completion_new ();
+ gtk_entry_completion_set_model (completion, ingredients_model);
+ gtk_entry_completion_set_text_column (completion, 0);
+ gtk_entry_set_completion (GTK_ENTRY (self->ingredient_entry), completion);
+
+ units_model = get_units_model (self);
+ completion = gtk_entry_completion_new ();
+ gtk_entry_completion_set_model (completion, units_model);
+ gtk_entry_completion_set_text_column (completion, 0);
+ gtk_entry_set_completion (GTK_ENTRY (self->unit_entry), completion);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]