diff options
author | Germán Poo-Caamaño <gpoo@gnome.org> | 2013-09-20 23:27:20 -0700 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2013-10-04 12:50:18 +0200 |
commit | 76d6e2d385e2cbad7f44bc8aee05147efd3970a4 (patch) | |
tree | 8c71057e0f8e5514a2413f9447f02809bca941bd /glib | |
parent | a6b1fc1a2ca83b3e4c52bcaa95b99d0289354f4b (diff) |
glib-demo: Rearrange layout for annotations in demo
Add render area to visualize the annotations per page.
https://bugs.freedesktop.org/show_bug.cgi?id=69978
Diffstat (limited to 'glib')
-rw-r--r-- | glib/demo/annots.c | 130 |
1 files changed, 118 insertions, 12 deletions
diff --git a/glib/demo/annots.c b/glib/demo/annots.c index 389aa477..3ef2f699 100644 --- a/glib/demo/annots.c +++ b/glib/demo/annots.c @@ -42,12 +42,17 @@ typedef struct { GtkWidget *tree_view; GtkListStore *model; + GtkWidget *darea; GtkWidget *annot_view; GtkWidget *timer_label; gint num_page; + + cairo_surface_t *surface; } PgdAnnotsDemo; +static void pgd_annots_viewer_queue_redraw (PgdAnnotsDemo *demo); + static void pgd_annots_free (PgdAnnotsDemo *demo) { @@ -299,6 +304,8 @@ pgd_annots_remove_annot (GtkWidget *button, poppler_page_remove_annot (demo->page, annot); g_object_unref (annot); gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + + pgd_annots_viewer_queue_redraw (demo); } } @@ -561,8 +568,7 @@ pgd_annot_view_set_annot (PgdAnnotsDemo *demo, } static void -pgd_annots_get_annots (GtkWidget *button, - PgdAnnotsDemo *demo) +pgd_annots_get_annots (PgdAnnotsDemo *demo) { GList *mapping, *l; gint n_fields; @@ -646,6 +652,8 @@ pgd_annots_page_selector_value_changed (GtkSpinButton *spinbutton, PgdAnnotsDemo *demo) { demo->num_page = (gint) gtk_spin_button_get_value (spinbutton) - 1; + pgd_annots_viewer_queue_redraw (demo); + pgd_annots_get_annots (demo); } static void @@ -698,6 +706,8 @@ pgd_annots_flags_toggled (GtkCellRendererToggle *renderer, pgd_annot_view_set_annot (demo, annot); gtk_tree_path_free (path); + + pgd_annots_viewer_queue_redraw (demo); } static void @@ -829,14 +839,91 @@ pgd_annots_add_annot (GtkWidget *button, g_object_unref (page); gtk_widget_destroy (dialog); + + pgd_annots_viewer_queue_redraw (demo); + pgd_annots_get_annots (demo); +} + +/* Render area */ +static cairo_surface_t * +pgd_annots_render_page (PgdAnnotsDemo *demo) +{ + cairo_t *cr; + PopplerPage *page; + gdouble width, height; + cairo_surface_t *surface = NULL; + + page = poppler_document_get_page (demo->doc, demo->num_page); + if (!page) + return NULL; + + poppler_page_get_size (page, &width, &height); + gtk_widget_set_size_request (demo->darea, width, height); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + width, height); + cr = cairo_create (surface); + + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + poppler_page_render (page, cr); + cairo_restore (cr); + + cairo_destroy (cr); + g_object_unref (page); + + return surface; +} + +static gboolean +pgd_annots_view_drawing_area_draw (GtkWidget *area, + cairo_t *cr, + PgdAnnotsDemo *demo) +{ + if (demo->num_page == -1) + return FALSE; + + if (!demo->surface) { + demo->surface = pgd_annots_render_page (demo); + if (!demo->surface) + return FALSE; + } + + cairo_set_source_surface (cr, demo->surface, 0, 0); + cairo_paint (cr); + + return TRUE; +} + +static gboolean +pgd_annots_viewer_redraw (PgdAnnotsDemo *demo) +{ + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + + gtk_widget_queue_draw (demo->darea); + + return FALSE; +} + +static void +pgd_annots_viewer_queue_redraw (PgdAnnotsDemo *demo) +{ + g_idle_add ((GSourceFunc)pgd_annots_viewer_redraw, demo); } +/* Main UI */ GtkWidget * pgd_annots_create_widget (PopplerDocument *document) { PgdAnnotsDemo *demo; GtkWidget *label; - GtkWidget *vbox; + GtkWidget *vbox, *vbox2; GtkWidget *hbox, *page_selector; GtkWidget *button; GtkWidget *hpaned; @@ -853,6 +940,7 @@ pgd_annots_create_widget (PopplerDocument *document) n_pages = poppler_document_get_n_pages (document); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); @@ -873,13 +961,6 @@ pgd_annots_create_widget (PopplerDocument *document) gtk_widget_show (label); g_free (str); - button = gtk_button_new_with_label ("Get Annots"); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (pgd_annots_get_annots), - (gpointer) demo); - gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); - gtk_widget_show (button); - button = gtk_button_new_with_label ("Add Annot"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (pgd_annots_add_annot), @@ -988,15 +1069,37 @@ pgd_annots_create_widget (PopplerDocument *document) G_CALLBACK (pgd_annots_selection_changed), (gpointer) demo); + /* Annotation's list */ gtk_container_add (GTK_CONTAINER (swindow), treeview); gtk_widget_show (treeview); - gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0); gtk_widget_show (swindow); - gtk_paned_add2 (GTK_PANED (hpaned), demo->annot_view); + /* Annotation Properties */ + gtk_box_pack_start (GTK_BOX (vbox2), demo->annot_view, FALSE, FALSE, 6); gtk_widget_show (demo->annot_view); + gtk_paned_add1 (GTK_PANED (hpaned), vbox2); + gtk_widget_show (vbox2); + + /* Demo Area (Render) */ + demo->darea = gtk_drawing_area_new (); + g_signal_connect (demo->darea, "draw", + G_CALLBACK (pgd_annots_view_drawing_area_draw), + demo); + + swindow = gtk_scrolled_window_new (NULL, NULL); +#if GTK_CHECK_VERSION(3, 7, 8) + gtk_container_add(GTK_CONTAINER(swindow), demo->darea); +#else + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), demo->darea); +#endif + gtk_widget_show (demo->darea); + + gtk_paned_add2 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + gtk_paned_set_position (GTK_PANED (hpaned), 300); gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); @@ -1006,5 +1109,8 @@ pgd_annots_create_widget (PopplerDocument *document) (GWeakNotify)pgd_annots_free, demo); + pgd_annots_viewer_queue_redraw (demo); + pgd_annots_get_annots (demo); + return vbox; } |