| /* |
| * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2, or (at your option) |
| * any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
| */ |
| |
| #include <gtk/gtk.h> |
| |
| #include "transitions.h" |
| |
| enum |
| { |
| TRANSITIONS_PAGE_COLUMN, |
| TRANSITIONS_TYPE_COLUMN, |
| TRANSITIONS_ALIGNMENT_COLUMN, |
| TRANSITIONS_DIRECTION_COLUMN, |
| TRANSITIONS_DURATION_COLUMN, |
| TRANSITIONS_ANGLE_COLUMN, |
| TRANSITIONS_SCALE_COLUMN, |
| TRANSITIONS_RECTANGULAR_COLUMN, |
| N_COLUMNS |
| }; |
| |
| typedef struct |
| { |
| PopplerDocument *doc; |
| |
| GtkWidget *treeview; |
| GtkWidget *progress; |
| |
| guint idle_id; |
| } PgdTransitionsDemo; |
| |
| static void pgd_transitions_free(PgdTransitionsDemo *demo) |
| { |
| if (!demo) { |
| return; |
| } |
| |
| if (demo->idle_id > 0) { |
| g_source_remove(demo->idle_id); |
| demo->idle_id = 0; |
| } |
| |
| if (demo->doc) { |
| g_object_unref(demo->doc); |
| demo->doc = NULL; |
| } |
| |
| g_free(demo); |
| } |
| |
| static const gchar *transition_type_to_string(PopplerPageTransitionType type) |
| { |
| switch (type) { |
| case POPPLER_PAGE_TRANSITION_REPLACE: |
| return "Replace"; |
| case POPPLER_PAGE_TRANSITION_SPLIT: |
| return "Split"; |
| case POPPLER_PAGE_TRANSITION_BLINDS: |
| return "Blinds"; |
| case POPPLER_PAGE_TRANSITION_BOX: |
| return "Box"; |
| case POPPLER_PAGE_TRANSITION_WIPE: |
| return "Wipe"; |
| case POPPLER_PAGE_TRANSITION_DISSOLVE: |
| return "Dissolve"; |
| case POPPLER_PAGE_TRANSITION_GLITTER: |
| return "Glitter"; |
| case POPPLER_PAGE_TRANSITION_FLY: |
| return "Fly"; |
| case POPPLER_PAGE_TRANSITION_PUSH: |
| return "Push"; |
| case POPPLER_PAGE_TRANSITION_COVER: |
| return "Cover"; |
| case POPPLER_PAGE_TRANSITION_UNCOVER: |
| return "Uncover"; |
| case POPPLER_PAGE_TRANSITION_FADE: |
| return "Fade"; |
| } |
| |
| return "Unknown"; |
| } |
| |
| static const gchar *transition_alignment_to_string(PopplerPageTransitionAlignment alignment) |
| { |
| return alignment == POPPLER_PAGE_TRANSITION_HORIZONTAL ? "Horizontal" : "Vertical"; |
| } |
| |
| static const gchar *transition_direction_to_string(PopplerPageTransitionDirection direction) |
| { |
| return direction == POPPLER_PAGE_TRANSITION_INWARD ? "Inward" : "Outward"; |
| } |
| |
| static void pgd_transitions_update_progress(PgdTransitionsDemo *demo, gint n_pages, gint scanned) |
| { |
| gchar *str; |
| |
| str = g_strdup_printf("Scanning transitions (%d%%)", MIN(scanned * 100 / n_pages, 100)); |
| gtk_progress_bar_set_text(GTK_PROGRESS_BAR(demo->progress), str); |
| gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(demo->progress), MIN((gdouble)scanned / n_pages, 1.0)); |
| g_free(str); |
| } |
| |
| static gboolean pgd_transitions_fill_model(PgdTransitionsDemo *demo) |
| { |
| GtkTreeModel *model; |
| gint i, n_pages; |
| |
| n_pages = poppler_document_get_n_pages(demo->doc); |
| |
| model = gtk_tree_view_get_model(GTK_TREE_VIEW(demo->treeview)); |
| g_object_ref(model); |
| |
| for (i = 0; i < n_pages; i++) { |
| PopplerPage *page; |
| PopplerPageTransition *transition; |
| |
| pgd_transitions_update_progress(demo, n_pages, i); |
| |
| while (gtk_events_pending()) { |
| gtk_main_iteration(); |
| } |
| |
| page = poppler_document_get_page(demo->doc, i); |
| if (!page) { |
| continue; |
| } |
| |
| transition = poppler_page_get_transition(page); |
| if (transition) { |
| GtkTreeIter iter; |
| gchar *npage; |
| gchar *duration; |
| gchar *angle; |
| gchar *scale; |
| |
| npage = g_strdup_printf("%d", i + 1); |
| duration = g_strdup_printf("%.2f", transition->duration_real); |
| angle = g_strdup_printf("%d", transition->angle); |
| scale = g_strdup_printf("%.2f", transition->scale); |
| |
| gtk_list_store_append(GTK_LIST_STORE(model), &iter); |
| gtk_list_store_set(GTK_LIST_STORE(model), &iter, TRANSITIONS_PAGE_COLUMN, npage, TRANSITIONS_TYPE_COLUMN, transition_type_to_string(transition->type), TRANSITIONS_ALIGNMENT_COLUMN, |
| transition_alignment_to_string(transition->alignment), TRANSITIONS_DIRECTION_COLUMN, transition_direction_to_string(transition->direction), TRANSITIONS_DURATION_COLUMN, duration, TRANSITIONS_ANGLE_COLUMN, |
| angle, TRANSITIONS_SCALE_COLUMN, scale, TRANSITIONS_RECTANGULAR_COLUMN, transition->rectangular ? "Yes" : "No", -1); |
| g_free(npage); |
| g_free(duration); |
| g_free(angle); |
| g_free(scale); |
| |
| poppler_page_transition_free(transition); |
| } |
| |
| g_object_unref(page); |
| } |
| |
| pgd_transitions_update_progress(demo, n_pages, n_pages); |
| g_object_unref(model); |
| |
| return FALSE; |
| } |
| |
| static void pgd_transitions_scan_button_clicked(GtkButton *button, PgdTransitionsDemo *demo) |
| { |
| if (demo->idle_id > 0) { |
| g_source_remove(demo->idle_id); |
| } |
| |
| demo->idle_id = g_idle_add((GSourceFunc)pgd_transitions_fill_model, demo); |
| } |
| |
| static GtkWidget *pgd_transitions_create_list(GtkTreeModel *model) |
| { |
| GtkWidget *treeview; |
| GtkCellRenderer *renderer; |
| |
| treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); |
| gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); |
| gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_NONE); |
| |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 0, "Page", renderer, "text", TRANSITIONS_PAGE_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 1, "Type", renderer, "text", TRANSITIONS_TYPE_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 2, "Alignment", renderer, "text", TRANSITIONS_ALIGNMENT_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 3, "Direction", renderer, "text", TRANSITIONS_DIRECTION_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 4, "Duration", renderer, "text", TRANSITIONS_DURATION_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 5, "Angle", renderer, "text", TRANSITIONS_ANGLE_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 6, "Scale", renderer, "text", TRANSITIONS_SCALE_COLUMN, NULL); |
| renderer = gtk_cell_renderer_text_new(); |
| gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 7, "Rectangular", renderer, "text", TRANSITIONS_RECTANGULAR_COLUMN, NULL); |
| return treeview; |
| } |
| |
| GtkWidget *pgd_transitions_create_widget(PopplerDocument *document) |
| { |
| PgdTransitionsDemo *demo; |
| GtkWidget *vbox; |
| GtkListStore *model; |
| GtkWidget *swindow; |
| GtkWidget *hbox, *button; |
| |
| demo = g_new0(PgdTransitionsDemo, 1); |
| |
| demo->doc = g_object_ref(document); |
| |
| vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); |
| |
| hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); |
| |
| demo->progress = gtk_progress_bar_new(); |
| gtk_progress_bar_set_ellipsize(GTK_PROGRESS_BAR(demo->progress), PANGO_ELLIPSIZE_END); |
| gtk_box_pack_start(GTK_BOX(hbox), demo->progress, TRUE, TRUE, 0); |
| gtk_widget_show(demo->progress); |
| |
| button = gtk_button_new_with_label("Scan"); |
| g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(pgd_transitions_scan_button_clicked), (gpointer)demo); |
| gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
| gtk_widget_show(button); |
| |
| gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 6); |
| gtk_widget_show(hbox); |
| |
| swindow = gtk_scrolled_window_new(NULL, NULL); |
| gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| |
| model = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
| demo->treeview = pgd_transitions_create_list(GTK_TREE_MODEL(model)); |
| g_object_unref(model); |
| |
| gtk_container_add(GTK_CONTAINER(swindow), demo->treeview); |
| gtk_widget_show(demo->treeview); |
| |
| gtk_box_pack_start(GTK_BOX(vbox), swindow, TRUE, TRUE, 0); |
| gtk_widget_show(swindow); |
| |
| g_object_weak_ref(G_OBJECT(swindow), (GWeakNotify)pgd_transitions_free, (gpointer)demo); |
| |
| return vbox; |
| } |