[recipes] Use a cooking view for previewing instructions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [recipes] Use a cooking view for previewing instructions
- Date: Sat, 4 Feb 2017 05:10:47 +0000 (UTC)
commit adbad3448b3692a44aa86a831565848249831e05
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Feb 3 10:27:12 2017 +0100
Use a cooking view for previewing instructions
src/gr-edit-page.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/gr-edit-page.ui | 65 +++++++++++++++++++++++++++++++++-
2 files changed, 159 insertions(+), 2 deletions(-)
---
diff --git a/src/gr-edit-page.c b/src/gr-edit-page.c
index 145c832..f480e2c 100644
--- a/src/gr-edit-page.c
+++ b/src/gr-edit-page.c
@@ -45,6 +45,7 @@
#include "gr-number.h"
#include "gr-unit.h"
#include "gr-chef-dialog.h"
+#include "gr-cooking-view.h"
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
@@ -93,6 +94,7 @@ struct _GrEditPage
GtkWidget *new_ingredient_add_button;
GtkWidget *author_label;
GtkWidget *ingredients_box;
+ GtkWidget *cooking_view;
GtkWidget *ing_list;
GtkWidget *ing_search_button;
@@ -106,11 +108,16 @@ struct _GrEditPage
GtkWidget *recipe_popover;
GtkWidget *recipe_list;
GtkWidget *recipe_filter_entry;
+ GtkWidget *add_step_button;
GtkWidget *link_image_button;
+ GtkWidget *timer_button;
+ GtkWidget *prev_step_button;
+ GtkWidget *next_step_button;
GtkWidget *image_popover;
GtkWidget *image_flowbox;
GtkWidget *timer_popover;
GtkWidget *timer_spin;
+ GtkWidget *preview_stack;
GrRecipeSearch *search;
@@ -1213,6 +1220,79 @@ popover_keypress_handler (GtkWidget *widget,
return GDK_EVENT_PROPAGATE;
}
+static char *get_instructions (GtkTextView *text_view);
+
+static void
+update_steppers (GrEditPage *page)
+{
+ int step;
+ int n_steps;
+
+ step = gr_cooking_view_get_step (GR_COOKING_VIEW (page->cooking_view));
+ n_steps = gr_cooking_view_get_n_steps (GR_COOKING_VIEW (page->cooking_view));
+
+ gtk_widget_set_sensitive (page->prev_step_button, step - 1 >= 0);
+ gtk_widget_set_sensitive (page->next_step_button, step + 1 <= n_steps - 1);
+}
+
+static void
+preview_visible_changed (GrEditPage *page)
+{
+ const char *visible;
+
+ visible = gtk_stack_get_visible_child_name (GTK_STACK (page->preview_stack));
+
+ if (strcmp (visible, "edit") == 0) {
+ gtk_widget_set_sensitive (page->add_step_button, TRUE);
+ gtk_widget_set_sensitive (page->link_image_button, TRUE);
+ gtk_widget_set_sensitive (page->timer_button, TRUE);
+ gtk_widget_set_visible (page->prev_step_button, FALSE);
+ gtk_widget_set_visible (page->next_step_button, FALSE);
+ }
+ else {
+ g_autoptr(GArray) images = NULL;
+ g_autofree char *instructions = NULL;
+
+ gtk_widget_set_sensitive (page->add_step_button, FALSE);
+ gtk_widget_set_sensitive (page->link_image_button, FALSE);
+ gtk_widget_set_sensitive (page->timer_button, FALSE);
+ gtk_widget_set_visible (page->prev_step_button, TRUE);
+ gtk_widget_set_visible (page->next_step_button, TRUE);
+
+ g_object_get (page->images, "images", &images, NULL);
+ instructions = get_instructions (GTK_TEXT_VIEW (page->instructions_field));
+
+ gr_cooking_view_set_images (GR_COOKING_VIEW (page->cooking_view), images);
+ gr_cooking_view_set_instructions (GR_COOKING_VIEW (page->cooking_view), instructions);
+
+ update_steppers (page);
+ }
+}
+
+static void
+prev_step (GrEditPage *page)
+{
+ int step;
+
+ step = gr_cooking_view_get_step (GR_COOKING_VIEW (page->cooking_view)) - 1;
+ if (step >= 0)
+ gr_cooking_view_set_step (GR_COOKING_VIEW (page->cooking_view), step);
+
+ update_steppers (page);
+}
+
+static void
+next_step (GrEditPage *page)
+{
+ int step;
+
+ step = gr_cooking_view_get_step (GR_COOKING_VIEW (page->cooking_view)) + 1;
+ if (step < gr_cooking_view_get_n_steps (GR_COOKING_VIEW (page->cooking_view)))
+ gr_cooking_view_set_step (GR_COOKING_VIEW (page->cooking_view), step);
+
+ update_steppers (page);
+}
+
static void
gr_edit_page_class_init (GrEditPageClass *klass)
{
@@ -1264,11 +1344,17 @@ gr_edit_page_class_init (GrEditPageClass *klass)
gtk_widget_class_bind_template_child (widget_class, GrEditPage, amount_search_button);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, amount_search_button_label);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, amount_search_revealer);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, add_step_button);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, link_image_button);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, timer_button);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, prev_step_button);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, next_step_button);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, image_popover);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, image_flowbox);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, timer_popover);
gtk_widget_class_bind_template_child (widget_class, GrEditPage, timer_spin);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, preview_stack);
+ gtk_widget_class_bind_template_child (widget_class, GrEditPage, cooking_view);
gtk_widget_class_bind_template_callback (widget_class, dismiss_error);
gtk_widget_class_bind_template_callback (widget_class, add_image);
@@ -1302,6 +1388,9 @@ gr_edit_page_class_init (GrEditPageClass *klass)
gtk_widget_class_bind_template_callback (widget_class, time_spin_input);
gtk_widget_class_bind_template_callback (widget_class, time_spin_output);
gtk_widget_class_bind_template_callback (widget_class, time_spin_activate);
+ gtk_widget_class_bind_template_callback (widget_class, preview_visible_changed);
+ gtk_widget_class_bind_template_callback (widget_class, prev_step);
+ gtk_widget_class_bind_template_callback (widget_class, next_step);
}
GtkWidget *
@@ -1790,6 +1879,7 @@ gr_edit_page_edit (GrEditPage *page,
gtk_spin_button_set_value (GTK_SPIN_BUTTON (page->serves_spin), serves);
set_text_view_text (GTK_TEXT_VIEW (page->description_field), description);
set_instructions (GTK_TEXT_VIEW (page->instructions_field), instructions);
+ gtk_stack_set_visible_child_name (GTK_STACK (page->preview_stack), "edit");
populate_ingredients (page, ingredients);
@@ -2030,12 +2120,17 @@ get_instructions (GtkTextView *text_view)
{
GtkTextBuffer *buffer;
GtkTextIter start, end;
+#if 0
GString *s;
g_autofree char *last_text = NULL;
s = g_string_new ("");
+#endif
buffer = gtk_text_view_get_buffer (text_view);
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+#if 0
gtk_text_buffer_get_start_iter (buffer, &start);
end = start;
while (gtk_text_iter_forward_to_tag_toggle (&end, NULL)) {
@@ -2078,6 +2173,7 @@ get_instructions (GtkTextView *text_view)
g_string_append (s, last_text);
return g_string_free (s, FALSE);
+#endif
}
gboolean
diff --git a/src/gr-edit-page.ui b/src/gr-edit-page.ui
index 96973aa..eb5eb2b 100644
--- a/src/gr-edit-page.ui
+++ b/src/gr-edit-page.ui
@@ -532,7 +532,7 @@
<child>
<object class="GtkLabel">
<property name="visible">1</property>
- <property name="label" translatable="yes">Description (optional)</property>
+ <property name="label" translatable="yes">Description</property>
<property name="xalign">0</property>
<style>
<class name="heading"/>
@@ -583,7 +583,7 @@
<child>
<object class="GtkFlowBox">
<property name="visible">1</property>
- <property name="margin-top">40</property>
+ <property name="margin-top">20</property>
<property name="selection-mode">none</property>
<property name="min-children-per-line">3</property>
<property name="max-children-per-line">3</property>
@@ -662,6 +662,16 @@
</child>
</object>
</child>
+ <child>
+ <object class="GtkStackSwitcher">
+ <property name="visible">1</property>
+ <property name="halign">end</property>
+ <property name="stack">preview_stack</property>
+ </object>
+ <packing>
+ <property name="expand">1</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left-attach">0</property>
@@ -670,6 +680,10 @@
</packing>
</child>
<child>
+ <object class="GtkStack" id="preview_stack">
+ <property name="visible">1</property>
+ <signal name="notify::visible-child-name" handler="preview_visible_changed"
swapped="yes"/>
+ <child>
<object class="GtkScrolledWindow">
<property name="visible">1</property>
<property name="shadow-type">in</property>
@@ -684,6 +698,19 @@
<property name="bottom-margin">10</property>
</object>
</child>
+ </object>
+ <packing>
+ <property name="name">edit</property>
+ <property name="title" translatable="yes">Edit</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GrCookingView" id="cooking_view"/>
+ <packing>
+ <property name="name">preview</property>
+ <property name="title" translatable="yes">Preview</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left-attach">0</property>
@@ -722,6 +749,40 @@
<signal name="clicked" handler="add_timer"/>
</object>
</child>
+ <child>
+ <object class="GtkButton" id="prev_step_button">
+ <property name="halign">start</property>
+ <signal name="clicked" handler="prev_step" swapped="yes"/>
+ <style>
+ <class name="image-button"/>
+ <class name="circular"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">1</property>
+ <property name="icon-name">pan-start-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="next_step_button">
+ <property name="halign">start</property>
+ <signal name="clicked" handler="next_step" swapped="yes"/>
+ <style>
+ <class name="image-button"/>
+ <class name="circular"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">1</property>
+ <property name="icon-name">pan-end-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
</object>
<packing>
<property name="left-attach">0</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]