X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=shell%2Fev-sidebar-thumbnails.c;h=b602bb26ae7dfa2beaabd47d1504b89a0fe96e47;hb=b006971d2c876b5ae62e2ed917496d370e90333c;hp=a546993bf31760c4f87fa05278de43d7cae01489;hpb=77b060fe8cd1bb84db8b596e032fffb91f9d906c;p=evince.git diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index a546993b..b602bb26 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -1,7 +1,7 @@ /* this file is part of evince, a gnome document viewer * * Copyright (C) 2004 Red Hat, Inc. - * Copyright (C) 2004 Anders Carlsson + * Copyright (C) 2004, 2005 Anders Carlsson * * Authors: * Jonathan Blandford @@ -32,9 +32,11 @@ #include "ev-sidebar-thumbnails.h" #include "ev-document-thumbnails.h" #include "ev-document-misc.h" +#include "ev-window.h" #include "ev-utils.h" -#define THUMBNAIL_WIDTH 75 +#define THUMBNAIL_WIDTH 100 + /* Amount of time we devote to each iteration of the idle, in microseconds */ #define IDLE_WORK_LENGTH 5000 @@ -56,8 +58,6 @@ enum { NUM_COLUMNS }; -static GtkVBoxClass *parent_class; - G_DEFINE_TYPE (EvSidebarThumbnails, ev_sidebar_thumbnails, GTK_TYPE_VBOX); #define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \ @@ -75,7 +75,7 @@ ev_sidebar_thumbnails_destroy (GtkObject *object) priv->idle_id = 0; } - GTK_OBJECT_CLASS (parent_class)->destroy (object); + GTK_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->destroy (object); } static void @@ -87,8 +87,6 @@ ev_sidebar_thumbnails_class_init (EvSidebarThumbnailsClass *ev_sidebar_thumbnail g_object_class = G_OBJECT_CLASS (ev_sidebar_thumbnails_class); gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_thumbnails_class); - parent_class = g_type_class_peek_parent (ev_sidebar_thumbnails_class); - gtk_object_class->destroy = ev_sidebar_thumbnails_destroy; g_type_class_add_private (g_object_class, sizeof (EvSidebarThumbnailsPrivate)); @@ -128,18 +126,51 @@ adjustment_changed_cb (GtkAdjustment *adjustment, } } +static void +ev_sidebar_tree_selection_changed (GtkTreeSelection *selection, + EvSidebarThumbnails *ev_sidebar_thumbnails) +{ + EvSidebarThumbnailsPrivate *priv; + GtkWidget *window; + GtkTreePath *path; + GtkTreeIter iter; + int page; + + priv = ev_sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (ev_sidebar_thumbnails); + + if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) + return; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->list_store), + &iter); + + page = gtk_tree_path_get_indices (path)[0] + 1; + + gtk_tree_path_free (path); + + window = gtk_widget_get_ancestor (GTK_WIDGET (ev_sidebar_thumbnails), + EV_TYPE_WINDOW); + if (window && ev_document_get_page (priv->document) != page) { + ev_window_open_page (EV_WINDOW (window), page); + } +} + static void ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails) { GtkWidget *swindow; EvSidebarThumbnailsPrivate *priv; GtkCellRenderer *renderer; + GtkTreeSelection *selection; priv = ev_sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (ev_sidebar_thumbnails); - + priv->list_store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN); priv->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (priv->list_store)); - + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view)); + g_signal_connect (selection, "changed", + G_CALLBACK (ev_sidebar_tree_selection_changed), ev_sidebar_thumbnails); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree_view), FALSE); renderer = g_object_new (GTK_TYPE_CELL_RENDERER_PIXBUF, "xpad", 2, @@ -192,12 +223,14 @@ do_one_iteration (EvSidebarThumbnails *ev_sidebar_thumbnails) COLUMN_THUMBNAIL_SET, &thumbnail_set, -1); if (!thumbnail_set) { - pixbuf = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (priv->document), - priv->current_page, THUMBNAIL_WIDTH); + pixbuf = ev_document_thumbnails_get_thumbnail + (EV_DOCUMENT_THUMBNAILS (priv->document), + priv->current_page, THUMBNAIL_WIDTH, TRUE); gtk_list_store_set (priv->list_store, &(priv->current_page_iter), COLUMN_PIXBUF, pixbuf, + COLUMN_THUMBNAIL_SET, TRUE, -1); g_object_unref (pixbuf); @@ -275,6 +308,30 @@ populate_thumbnails_idle (gpointer data) return TRUE; } +void +ev_sidebar_thumbnails_select_page (EvSidebarThumbnails *sidebar, + int page) +{ + GtkTreePath *path; + GtkTreeSelection *selection; + + /* if the EvSidebar's document can't provide thumbnails */ + if (sidebar->priv->document == NULL) + return; + + path = gtk_tree_path_new_from_indices (page - 1, -1); + selection = gtk_tree_view_get_selection + (GTK_TREE_VIEW (sidebar->priv->tree_view)); + + if (path) { + gtk_tree_selection_select_path (selection, path); + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (sidebar->priv->tree_view), + path, NULL, FALSE, 0.0, 0.0); + gtk_tree_path_free (path); + } +} + + void ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, EvDocument *document) @@ -302,11 +359,13 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, /* We get the dimensions of the first doc so that we can make a blank * icon. */ ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (priv->document), - 0, THUMBNAIL_WIDTH, &width, &height); + 1, THUMBNAIL_WIDTH, &width, &height); loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL); - for (i = 0; i < n_pages; i++) { - page = g_strdup_printf ("%d", i + 1); + gtk_list_store_clear (priv->list_store); + + for (i = 1; i <= n_pages; i++) { + page = g_strdup_printf ("%d", i); gtk_list_store_append (priv->list_store, &iter); gtk_list_store_set (priv->list_store, &iter, COLUMN_PAGE_STRING, page, @@ -316,6 +375,7 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, g_free (page); } + g_object_unref (loading_icon); gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->list_store), &(priv->current_page_iter)); priv->current_page = 0;