[libgepub/wip/doublepage] Trying to fix the page-next and page-prev
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgepub/wip/doublepage] Trying to fix the page-next and page-prev
- Date: Tue, 23 May 2017 17:55:33 +0000 (UTC)
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]