[libgepub/wip/doublepage] Trying to fix the page-next and page-prev



commit 5f27346013669ca2aa8ae30361bd9d17ee652793
Author: Daniel GarcĂ­a Moreno <danigm wadobo com>
Date:   Tue May 23 19:54:15 2017 +0200

    Trying to fix the page-next and page-prev

 libgepub/gepub-double-widget.c |   53 +++++++++++++++++++++++++--------------
 libgepub/gepub-widget.c        |   43 +++++++++++++++++++++++++++++---
 libgepub/gepub-widget.h        |    3 ++
 tests/double-page-epub.py      |    4 +++
 4 files changed, 80 insertions(+), 23 deletions(-)
---
diff --git a/libgepub/gepub-double-widget.c b/libgepub/gepub-double-widget.c
index 5c28c21..d6a7f37 100644
--- a/libgepub/gepub-double-widget.c
+++ b/libgepub/gepub-double-widget.c
@@ -32,8 +32,6 @@ struct _GepubDoubleWidget {
 
     GepubDoc *doc1;
     GepubDoc *doc2;
-
-    gboolean setnext;
 };
 
 struct _GepubDoubleWidgetClass {
@@ -58,27 +56,46 @@ gepub_double_widget_finalize (GObject *object)
 }
 
 static gboolean
-page_next (gpointer data)
+page_next (GtkWidget *w, gboolean ok)
 {
-    GepubWidget *w = GEPUB_WIDGET (data);
-    gepub_widget_page_next (w);
+    gepub_widget_set_pagination_cb (w, NULL);
+
+    if (!ok) {
+        printf ("END\n");
+    } else {
+        gepub_widget_page_next (w);
+    }
+
     return FALSE;
 }
 
 static gboolean
-page_prev (gpointer data)
+page_prev (GtkWidget *w, gboolean ok)
 {
-    GepubWidget *w = GEPUB_WIDGET (data);
-    gepub_widget_page_prev (w);
+    gepub_widget_set_pagination_cb (w, NULL);
+
+    if (!ok) {
+        printf ("begining\n");
+    } else {
+        gepub_widget_page_prev (w);
+    }
+
     return FALSE;
 }
 
 static void
+on_finish_load (GtkWidget *widget,
+                gpointer data)
+{
+    gint page = (int)data;
+    printf ("finish loaded %d\n");
+}
+
+static void
 gepub_double_widget_init (GepubDoubleWidget *widget)
 {
     widget->page1 = GEPUB_WIDGET (gepub_widget_new ());
     widget->page2 = GEPUB_WIDGET (gepub_widget_new ());
-    widget->setnext = FALSE;
 
     widget->doc1 = NULL;
     widget->doc2 = NULL;
@@ -130,12 +147,10 @@ gepub_double_widget_open (GepubDoubleWidget *widget,
     gepub_widget_set_doc (widget->page1, widget->doc1);
     gepub_widget_set_doc (widget->page2, widget->doc2);
 
-    widget->setnext = TRUE;
     gepub_widget_set_pagination (widget->page1, TRUE);
     gepub_widget_set_pagination (widget->page2, TRUE);
 
-    // TODO: don't use timeout, call this on ready
-    g_timeout_add(250, page_next, widget->page2);
+    g_timeout_add(300, page_next, widget->page2);
 }
 
 /**
@@ -185,7 +200,6 @@ void
 gepub_double_widget_set_chapter (GepubDoubleWidget *widget,
                                  gint               index)
 {
-    widget->setnext = TRUE;
     gepub_widget_set_chapter (widget->page1, index);
     gepub_widget_set_chapter (widget->page2, index);
 }
@@ -199,11 +213,12 @@ gepub_double_widget_set_chapter (GepubDoubleWidget *widget,
 gboolean
 gepub_double_widget_page_next (GepubDoubleWidget *widget)
 {
+    gepub_widget_set_pagination_cb (widget->page1, G_CALLBACK (page_next));
+    gepub_widget_set_pagination_cb (widget->page2, G_CALLBACK (page_next));
+
     gepub_widget_page_next (widget->page1);
-    // TODO: don't use timeout, call this on ready
-    g_timeout_add(250, page_next, widget->page1);
     gepub_widget_page_next (widget->page2);
-    g_timeout_add(250, page_next, widget->page2);
+
     return TRUE;
 }
 
@@ -216,11 +231,11 @@ gepub_double_widget_page_next (GepubDoubleWidget *widget)
 gboolean
 gepub_double_widget_page_prev (GepubDoubleWidget *widget)
 {
+    gepub_widget_set_pagination_cb (widget->page1, G_CALLBACK (page_prev));
+    gepub_widget_set_pagination_cb (widget->page2, G_CALLBACK (page_prev));
+
     gepub_widget_page_prev (widget->page1);
-    // TODO: don't use timeout, call this on ready
-    g_timeout_add(250, page_prev, widget->page1);
     gepub_widget_page_prev (widget->page2);
-    g_timeout_add(250, page_prev, widget->page2);
     return TRUE;
 }
 
diff --git a/libgepub/gepub-widget.c b/libgepub/gepub-widget.c
index e9419f0..1ff9f7d 100644
--- a/libgepub/gepub-widget.c
+++ b/libgepub/gepub-widget.c
@@ -36,6 +36,8 @@ struct _GepubWidget {
     gint margin; // lateral margin in px
     gint font_size; // font size in pt
     gfloat line_height;
+
+    gulong pagination_cb_handler;
 };
 
 struct _GepubWidgetClass {
@@ -122,7 +124,7 @@ pagination_initialize_finished (GObject      *object,
     }
     webkit_javascript_result_unref (js_result);
 
-    g_signal_emit_by_name (widget, "pagination-finished");
+    g_signal_emit_by_name (widget, "pagination-finished", TRUE);
 }
 
 static void
@@ -335,6 +337,7 @@ gepub_widget_init (GepubWidget *widget)
     widget->margin = 20;
     widget->font_size = 0;
     widget->line_height = 0;
+    widget->pagination_cb_handler = 0;
 
     // locale to avoid '1,2' in line_height string composition
     setlocale(LC_NUMERIC, "C");
@@ -402,11 +405,12 @@ gepub_widget_class_init (GepubWidgetClass *klass)
 
     g_object_class_install_properties (object_class, NUM_PROPS, properties);
 
+    GType signal_params[1] = {G_TYPE_BOOLEAN};
     g_signal_newv ("pagination-finished",
                    G_TYPE_FROM_CLASS (object_class),
                    G_SIGNAL_RUN_LAST,
                    NULL, NULL, NULL, NULL, G_TYPE_NONE,
-                   0, NULL);
+                   1, signal_params);
 }
 
 /**
@@ -602,15 +606,21 @@ gepub_widget_chapter_prev (GepubWidget *widget)
 gboolean
 gepub_widget_page_next (GepubWidget *widget)
 {
+    gboolean ret = TRUE;
+
     g_return_val_if_fail (GEPUB_IS_DOC (widget->doc), FALSE);
     widget->chapter_pos = widget->chapter_pos + widget->length;
 
     if (widget->chapter_pos > (widget->chapter_length - widget->length)) {
         widget->chapter_pos = (widget->chapter_length - widget->length);
-        return gepub_doc_go_next (widget->doc);
+        ret = gepub_doc_go_next (widget->doc);
+        if (!ret)
+            g_signal_emit_by_name (widget, "pagination-finished", FALSE);
+        return ret;
     }
 
     scroll_to_chapter_pos (widget);
+    g_signal_emit_by_name (widget, "pagination-finished", TRUE);
 
     g_object_notify_by_pspec (G_OBJECT (widget), properties[PROP_CHAPTER_POS]);
     return TRUE;
@@ -625,15 +635,21 @@ gepub_widget_page_next (GepubWidget *widget)
 gboolean
 gepub_widget_page_prev (GepubWidget *widget)
 {
+    gboolean ret = TRUE;
+
     g_return_val_if_fail (GEPUB_IS_DOC (widget->doc), FALSE);
     widget->chapter_pos = widget->chapter_pos - widget->length;
 
     if (widget->chapter_pos < 0) {
         widget->init_chapter_pos = 100;
-        return gepub_doc_go_prev (widget->doc);
+        ret = gepub_doc_go_prev (widget->doc);
+        if (!ret)
+            g_signal_emit_by_name (widget, "pagination-finished", FALSE);
+        return ret;
     }
 
     scroll_to_chapter_pos (widget);
+    g_signal_emit_by_name (widget, "pagination-finished", TRUE);
 
     g_object_notify_by_pspec (G_OBJECT (widget), properties[PROP_CHAPTER_POS]);
     return TRUE;
@@ -758,3 +774,22 @@ gepub_widget_set_lineheight (GepubWidget *widget,
     widget->line_height = size;
     reload_length_cb (GTK_WIDGET (widget), NULL, NULL);
 }
+
+/**
+ * gepub_widget_set_pagination_cb:
+ * @widget: a #GepubWidget
+ * @callback: a GCallback function to call after pagination
+ */
+void
+gepub_widget_set_pagination_cb (GepubWidget *widget,
+                                GCallback    callback)
+{
+    if (widget->pagination_cb_handler) {
+        g_signal_handler_disconnect (widget, widget->pagination_cb_handler);
+        widget->pagination_cb_handler = 0;
+    }
+
+    if (callback) {
+        widget->pagination_cb_handler = g_signal_connect (widget, "pagination-finished", callback, NULL);
+    }
+}
diff --git a/libgepub/gepub-widget.h b/libgepub/gepub-widget.h
index c07ba25..483893e 100644
--- a/libgepub/gepub-widget.h
+++ b/libgepub/gepub-widget.h
@@ -75,6 +75,9 @@ gfloat            gepub_widget_get_lineheight                  (GepubWidget *wid
 void              gepub_widget_set_lineheight                  (GepubWidget *widget,
                                                                 gfloat       size);
 
+void              gepub_widget_set_pagination_cb               (GepubWidget *widget,
+                                                                GCallback callback);
+
 G_END_DECLS
 
 #endif /* __GEPUB_WIDGET_H__ */
diff --git a/tests/double-page-epub.py b/tests/double-page-epub.py
index f32bb61..3242e98 100755
--- a/tests/double-page-epub.py
+++ b/tests/double-page-epub.py
@@ -28,8 +28,11 @@ class MyWindow(Gtk.Window):
         self.p.connect('clicked', self.prevcb)
         self.n.connect('clicked', self.nextcb)
 
+        self.text = Gtk.Label("%")
+
         box2.add(self.p)
         box2.add(self.n)
+        box2.add(self.text)
 
         self.box.add(box2)
         self.box.pack_start(self.w, True, True, 0)
@@ -41,6 +44,7 @@ class MyWindow(Gtk.Window):
 
     def nextcb(self, btn):
         self.w.page_next()
+        self.text.set_text("%5.2f%% / %s / %s" % (self.w.get_pos(), self.w.get_chapter() +  1, 
self.w.get_n_chapters()))
 
 
 if len(sys.argv) != 2:


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