[recipes] Add a notes field to the details page
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [recipes] Add a notes field to the details page
- Date: Tue, 20 Dec 2016 10:02:43 +0000 (UTC)
commit fa7c67186cbc06342cb6e85dec2fdee4adc345b4
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Dec 19 20:57:03 2016 -0500
Add a notes field to the details page
This is where we need and want to edit the notes
for somebody else recipe.
https://bugzilla.gnome.org/show_bug.cgi?id=776265
src/gr-details-page.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++-
src/gr-details-page.ui | 41 ++++++++++++++++++++++++++-
2 files changed, 111 insertions(+), 3 deletions(-)
---
diff --git a/src/gr-details-page.c b/src/gr-details-page.c
index 812b290..af5215c 100644
--- a/src/gr-details-page.c
+++ b/src/gr-details-page.c
@@ -135,6 +135,10 @@ struct _GrDetailsPage
GtkWidget *remaining_time_label;
GtkWidget *chef_label;
GtkWidget *edit_button;
+ GtkWidget *delete_button;
+ GtkWidget *notes_field;
+
+ guint save_timeout;
};
G_DEFINE_TYPE (GrDetailsPage, gr_details_page, GTK_TYPE_BOX)
@@ -483,6 +487,11 @@ details_page_finalize (GObject *object)
g_clear_object (&self->exporter);
g_clear_pointer (&self->cooking, g_hash_table_unref);
+ if (self->save_timeout) {
+ g_source_remove (self->save_timeout);
+ self->save_timeout = 0;
+ }
+
G_OBJECT_CLASS (gr_details_page_parent_class)->finalize (object);
}
@@ -515,6 +524,53 @@ all_headers (GtkListBoxRow *row,
gtk_list_box_row_set_header (row, header);
}
+static gboolean
+save_notes (gpointer data)
+{
+ GrDetailsPage *page = data;
+ GtkTextBuffer *buffer;
+ GtkTextIter start, end;
+ g_autofree char *text = NULL;
+ GrRecipeStore *store;
+ g_autofree char *id = NULL;
+ g_autofree char *notes = NULL;
+ g_autoptr(GError) error = NULL;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (page->notes_field));
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+
+ g_object_get (page->recipe,
+ "id", &id,
+ "notes", ¬es,
+ NULL);
+ if (g_strcmp0 (notes, text) == 0)
+ goto out;
+
+ g_object_set (page->recipe, "notes", text, NULL);
+
+ store = gr_app_get_recipe_store (GR_APP (g_application_get_default ()));
+ if (!gr_recipe_store_update_recipe (store, page->recipe, id, &error)) {
+ g_print ("Error: %s\n", error->message);
+ }
+
+out:
+ page->save_timeout = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+schedule_save (GtkTextBuffer *buffer, GrDetailsPage *page)
+{
+ if (page->save_timeout) {
+ g_source_remove (page->save_timeout);
+ page->save_timeout = 0;
+ }
+
+ page->save_timeout = g_timeout_add (250, save_notes, page);
+}
+
static void
gr_details_page_init (GrDetailsPage *page)
{
@@ -533,6 +589,8 @@ gr_details_page_init (GrDetailsPage *page)
gtk_list_box_set_header_func (GTK_LIST_BOX (page->ingredients_list),
all_headers, NULL, NULL);
+
+ g_signal_connect (gtk_text_view_get_buffer (GTK_TEXT_VIEW (page->notes_field)), "changed",
G_CALLBACK (schedule_save), page);
}
static void
@@ -568,6 +626,8 @@ gr_details_page_class_init (GrDetailsPageClass *klass)
gtk_widget_class_bind_template_child (widget_class, GrDetailsPage, remaining_time_label);
gtk_widget_class_bind_template_child (widget_class, GrDetailsPage, chef_label);
gtk_widget_class_bind_template_child (widget_class, GrDetailsPage, edit_button);
+ gtk_widget_class_bind_template_child (widget_class, GrDetailsPage, delete_button);
+ gtk_widget_class_bind_template_child (widget_class, GrDetailsPage, notes_field);
gtk_widget_class_bind_template_callback (widget_class, edit_recipe);
gtk_widget_class_bind_template_callback (widget_class, delete_recipe);
@@ -673,6 +733,7 @@ gr_details_page_set_recipe (GrDetailsPage *page,
int serves;
const char *ingredients;
const char *instructions;
+ const char *notes;
g_autoptr(GdkPixbuf) pixbuf = NULL;
GrRecipeStore *store;
g_autoptr(GrChef) chef = NULL;
@@ -690,6 +751,7 @@ gr_details_page_set_recipe (GrDetailsPage *page,
cook_time = gr_recipe_get_cook_time (recipe);
ingredients = gr_recipe_get_ingredients (recipe);
instructions = gr_recipe_get_instructions (recipe);
+ notes = gr_recipe_get_notes (recipe);
g_object_get (recipe, "images", &images, NULL);
gr_image_viewer_set_images (GR_IMAGE_VIEWER (page->recipe_image), images);
@@ -730,10 +792,17 @@ gr_details_page_set_recipe (GrDetailsPage *page,
gtk_widget_hide (page->chef_label);
}
- if (gr_recipe_is_readonly (recipe))
+ gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (page->notes_field)),
+ notes, -1);
+
+ if (gr_recipe_is_readonly (recipe)) {
gtk_widget_set_sensitive (page->edit_button, FALSE);
- else
+ gtk_widget_set_sensitive (page->delete_button, FALSE);
+ }
+ else {
gtk_widget_set_sensitive (page->edit_button, TRUE);
+ gtk_widget_set_sensitive (page->delete_button, TRUE);
+ }
}
static void
diff --git a/src/gr-details-page.ui b/src/gr-details-page.ui
index 1af004f..616f377 100644
--- a/src/gr-details-page.ui
+++ b/src/gr-details-page.ui
@@ -309,6 +309,45 @@ followed</property>
<property name="width">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">1</property>
+ <property name="label" translatable="yes">Notes</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">6</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <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">automatic</property>
+ <property name="min-content-height">240</property>
+ <child>
+ <object class="GtkTextView" id="notes_field">
+ <property name="visible">1</property>
+ <property name="wrap-mode">word</property>
+ <property name="top-margin">10</property>
+ <property name="left-margin">10</property>
+ <property name="right-margin">10</property>
+ <property name="bottom-margin">10</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">7</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
</object>
</child>
</object>
@@ -349,7 +388,7 @@ followed</property>
</object>
</child>
<child>
- <object class="GtkButton">
+ <object class="GtkButton" id="delete_button">
<property name="visible">1</property>
<property name="use-underline">1</property>
<property name="label" translatable="yes">_Delete</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]