[libgepub] Text margin control in the widget



commit eb872c4a6ef82531d1a4bfb863fd1edbc8c35a9a
Author: Daniel GarcĂ­a Moreno <danigm wadobo com>
Date:   Sun May 21 10:43:55 2017 +0200

    Text margin control in the widget
    
    With this new methods we can control the book left and right margins:
    
    gepub_widget_set_margin and gepub_widget_get_margin
    
    I've also added a fixed top and bottom margin of 20px, and I've set the
    default margin to 20px;

 libgepub/gepub-widget.c |   67 +++++++++++++++++++++++++++++++++++++---------
 libgepub/gepub-widget.h |    4 +++
 tests/test-gepub.c      |   18 ++++++++++++
 3 files changed, 76 insertions(+), 13 deletions(-)
---
diff --git a/libgepub/gepub-widget.c b/libgepub/gepub-widget.c
index d87770d..1db1863 100644
--- a/libgepub/gepub-widget.c
+++ b/libgepub/gepub-widget.c
@@ -32,6 +32,7 @@ struct _GepubWidget {
     gint chapter_pos; // position in the chapter, a percentage based on chapter_length
     gint length;
     gint init_chapter_pos;
+    gint margin;
 };
 
 struct _GepubWidgetClass {
@@ -113,7 +114,6 @@ pagination_initialize_finished (GObject      *object,
         if (widget->chapter_pos) {
             adjust_chapter_pos (widget);
         }
-
     } else {
         g_warning ("Error running javascript: unexpected return value");
     }
@@ -164,20 +164,32 @@ reload_length_cb (GtkWidget *widget,
         NULL, get_length_finished, (gpointer)widget);
 
     if (gwidget->paginate) {
+        gint m = GEPUB_WIDGET (widget)->margin;
+        gchar *script;
+
+        script = g_strdup_printf (
+            "document.body.style.overflow = 'hidden';"
+            "document.body.style.margin = '20px 0px 20px 0px';"
+            "document.body.style.padding = '0px';"
+            "document.body.style.columnWidth = window.innerWidth+'px';"
+            "document.body.style.height = (window.innerHeight - 40) +'px';"
+            "document.body.style.columnGap = '0px';"
+
+            "if (!document.querySelector('#gepubwrap'))"
+            "document.body.innerHTML = '<div id=\"gepubwrap\">' + document.body.innerHTML + '</div>';"
+
+            "document.querySelector('#gepubwrap').style.marginLeft = '%dpx';"
+            "document.querySelector('#gepubwrap').style.marginRight = '%dpx';"
+
+            "document.body.scrollWidth"
+            ,
+            m, m);
+
         webkit_web_view_run_javascript (web_view,
-                // TODO: Adjusts to show a little margin at least
-                "document.querySelector('body').setAttribute('style', '"
-                    "overflow: hidden;"
-                    "column-gap: 0px;"
-                    "margin-left: 0px;"
-                    "margin-right: 0px;"
-                    "padding-left: 0px;"
-                    "padding-right: 0px;"
-                    "');"
-                "document.querySelector('body').style.columnWidth = window.innerWidth+'px';"
-                "document.querySelector('body').style.height = window.innerHeight+'px';"
-                "document.querySelector('body').scrollWidth",
+                script,
                 NULL, pagination_initialize_finished, (gpointer)widget);
+
+        g_free (script);
     }
 }
 
@@ -301,6 +313,7 @@ gepub_widget_init (GepubWidget *widget)
     widget->chapter_pos = 0;
     widget->length = 0;
     widget->init_chapter_pos = 0;
+    widget->margin = 20;
 }
 
 static void
@@ -619,3 +632,31 @@ gepub_widget_set_pos (GepubWidget *widget,
 
     g_object_notify_by_pspec (G_OBJECT (widget), properties[PROP_CHAPTER_POS]);
 }
+
+
+/**
+ * gepub_widget_set_margin:
+ * @widget: a #GepubWidget
+ * @margin: the margin in pixels
+ *
+ * Sets the widget left and right margin
+ */
+void
+gepub_widget_set_margin (GepubWidget *widget,
+                         gint         margin)
+{
+    widget->margin = margin;
+    reload_length_cb (GTK_WIDGET (widget), NULL, NULL);
+}
+
+/**
+ * gepub_widget_get_margin:
+ * @widget: a #GepubWidget
+ *
+ * Gets the widget left and right margin
+ */
+gint
+gepub_widget_get_margin (GepubWidget *widget)
+{
+    return widget->margin;
+}
diff --git a/libgepub/gepub-widget.h b/libgepub/gepub-widget.h
index 67ed53a..3b1792f 100644
--- a/libgepub/gepub-widget.h
+++ b/libgepub/gepub-widget.h
@@ -62,6 +62,10 @@ void              gepub_widget_set_pos                         (GepubWidget *wid
 gboolean          gepub_widget_page_next                       (GepubWidget *widget);
 gboolean          gepub_widget_page_prev                       (GepubWidget *widget);
 
+gint              gepub_widget_get_margin                      (GepubWidget *widget);
+void              gepub_widget_set_margin                      (GepubWidget *widget,
+                                                                gint         margin);
+
 G_END_DECLS
 
 #endif /* __GEPUB_WIDGET_H__ */
diff --git a/tests/test-gepub.c b/tests/test-gepub.c
index 8f6864b..6c7a025 100644
--- a/tests/test-gepub.c
+++ b/tests/test-gepub.c
@@ -91,6 +91,10 @@ button_pressed (GtkButton *button, GepubWidget *widget)
         gepub_widget_page_prev (widget);
     } else if (!strcmp (gtk_button_get_label (button), "page >")) {
         gepub_widget_page_next (widget);
+    } else if (!strcmp (gtk_button_get_label (button), "margin +")) {
+        gepub_widget_set_margin (widget, gepub_widget_get_margin (widget) + 20);
+    } else if (!strcmp (gtk_button_get_label (button), "margin -")) {
+        gepub_widget_set_margin (widget, gepub_widget_get_margin (widget) - 20);
     }
     update_text (doc);
     //print_replaced_text (doc);
@@ -259,12 +263,16 @@ main (int argc, char **argv)
 
     GtkWidget *vbox;
     GtkWidget *hbox;
+    GtkWidget *hbox2;
     GtkWidget *b_next;
     GtkWidget *b_prev;
 
     GtkWidget *p_next;
     GtkWidget *p_prev;
 
+    GtkWidget *margin1;
+    GtkWidget *margin2;
+
     GtkWidget *paginate;
 
     GtkTextBuffer *buffer;
@@ -307,6 +315,7 @@ main (int argc, char **argv)
 
     vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
+    hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
     b_prev = gtk_button_new_with_label ("< chapter");
     g_signal_connect (b_prev, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
     b_next = gtk_button_new_with_label ("chapter >");
@@ -317,6 +326,11 @@ main (int argc, char **argv)
     p_next = gtk_button_new_with_label ("page >");
     g_signal_connect (p_next, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
 
+    margin1 = gtk_button_new_with_label ("margin +");
+    g_signal_connect (margin1, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+    margin2 = gtk_button_new_with_label ("margin -");
+    g_signal_connect (margin2, "clicked", (GCallback)button_pressed, GEPUB_WIDGET (widget));
+
     PAGE_LABEL = gtk_label_new ("0");
 
     g_signal_connect_swapped (widget, "notify",
@@ -334,7 +348,11 @@ main (int argc, char **argv)
     gtk_container_add (GTK_CONTAINER (hbox), PAGE_LABEL);
     gtk_container_add (GTK_CONTAINER (hbox), paginate);
 
+    gtk_container_add (GTK_CONTAINER (hbox2), margin1);
+    gtk_container_add (GTK_CONTAINER (hbox2), margin2);
+
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
+    gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 5);
     gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 5);
 
     textview = gtk_text_view_new ();


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