X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-sidebar-thumbnails.c;h=7945874b28cb1c761d66b2cc6f784f66836e244d;hb=2de7c9f04ca0fb4e471c7e0be6a9b332d7df2cd1;hp=c548e297fbc6b77fe9631076562830246e7d375e;hpb=1c0d19bd22598eca159c3febdcdaf4168891cb8f;p=evince.git diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index c548e297..7945874b 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -28,7 +28,9 @@ #include #include +#include +#include "ev-sidebar-page.h" #include "ev-sidebar-thumbnails.h" #include "ev-document-thumbnails.h" #include "ev-document-misc.h" @@ -58,11 +60,35 @@ enum { NUM_COLUMNS }; -G_DEFINE_TYPE (EvSidebarThumbnails, ev_sidebar_thumbnails, GTK_TYPE_VBOX); +static void ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails *sidebar); +static gboolean ev_sidebar_thumbnails_support_document (EvSidebarPage *sidebar_page, + EvDocument *document); +static void ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface); +static void ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, + EvDocument *document); +static const gchar* ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page); + +G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails, + ev_sidebar_thumbnails, + GTK_TYPE_VBOX, + 0, + G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE, + ev_sidebar_thumbnails_page_iface_init)) #define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \ (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsPrivate)); + +static void +ev_sidebar_thumbnails_dispose (GObject *object) +{ + EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (object); + + ev_sidebar_thumbnails_clear_model (sidebar_thumbnails); + + G_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->dispose (object); +} + static void ev_sidebar_thumbnails_class_init (EvSidebarThumbnailsClass *ev_sidebar_thumbnails_class) { @@ -72,9 +98,21 @@ 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); + g_object_class->dispose = ev_sidebar_thumbnails_dispose; + g_type_class_add_private (g_object_class, sizeof (EvSidebarThumbnailsPrivate)); } +GtkWidget * +ev_sidebar_thumbnails_new (void) +{ + GtkWidget *ev_sidebar_thumbnails; + + ev_sidebar_thumbnails = g_object_new (EV_TYPE_SIDEBAR_THUMBNAILS, NULL); + + return ev_sidebar_thumbnails; +} + static void adjustment_changed_cb (GtkAdjustment *adjustment, EvSidebarThumbnails *ev_sidebar_thumbnails) @@ -118,7 +156,7 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection, path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->list_store), &iter); - page = gtk_tree_path_get_indices (path)[0] + 1; + page = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); page_cache = ev_document_get_page_cache (priv->document); @@ -171,16 +209,6 @@ ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails) gtk_widget_show_all (swindow); } -GtkWidget * -ev_sidebar_thumbnails_new (void) -{ - GtkWidget *ev_sidebar_thumbnails; - - ev_sidebar_thumbnails = g_object_new (EV_TYPE_SIDEBAR_THUMBNAILS, NULL); - - return ev_sidebar_thumbnails; -} - static void page_changed_cb (EvPageCache *page_cache, int page, @@ -189,7 +217,7 @@ page_changed_cb (EvPageCache *page_cache, GtkTreePath *path; GtkTreeSelection *selection; - path = gtk_tree_path_new_from_indices (page - 1, -1); + path = gtk_tree_path_new_from_indices (page, -1); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar->priv->tree_view)); @@ -215,14 +243,14 @@ thumbnail_job_completed_callback (EvJobThumbnail *job, -1); } -void -ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, +static void +ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, EvDocument *document) { + EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page); GdkPixbuf *loading_icon; gint i, n_pages; GtkTreeIter iter; - gchar *page; gint width = THUMBNAIL_WIDTH; gint height = THUMBNAIL_WIDTH; EvPageCache *page_cache; @@ -239,28 +267,32 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, /* We get the dimensions of the first doc so that we can make a blank * icon. */ - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (priv->document), - 1, THUMBNAIL_WIDTH, &width, &height); - g_mutex_unlock (EV_DOC_MUTEX); + 0, THUMBNAIL_WIDTH, &width, &height); + ev_document_doc_mutex_unlock (); loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL); - gtk_list_store_clear (priv->list_store); - for (i = 1; i <= n_pages; i++) { + ev_sidebar_thumbnails_clear_model (sidebar_thumbnails); + for (i = 0; i < n_pages; i++) { EvJob *job; + gchar *page_label; + gchar *page_string; + + job = ev_job_thumbnail_new (priv->document, i, THUMBNAIL_WIDTH); + page_label = ev_page_cache_get_page_label (page_cache, i); + page_string = g_markup_printf_escaped ("%s", page_label); - /* FIXME: Bah. This is still -1 for some reason. Need to track it down.. */ - job = ev_job_thumbnail_new (priv->document, i - 1, THUMBNAIL_WIDTH); - 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, + COLUMN_PAGE_STRING, page_string, COLUMN_PIXBUF, loading_icon, COLUMN_THUMBNAIL_SET, FALSE, COLUMN_JOB, job, -1); - g_free (page); + g_free (page_label); + g_free (page_string); ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); g_object_set_data_full (G_OBJECT (job), "tree_iter", gtk_tree_iter_copy (&iter), @@ -278,3 +310,53 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails, } +static gboolean +ev_sidebar_thumbnails_clear_job (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + EvJob *job; + + gtk_tree_model_get (model, iter, COLUMN_JOB, &job, -1); + + if (job != NULL) { + ev_job_queue_remove_job (job); + g_signal_handlers_disconnect_by_func (job, thumbnail_job_completed_callback, data); + g_object_unref (job); + } + + return FALSE; +} + +static void +ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails *sidebar_thumbnails) +{ + EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv; + + gtk_tree_model_foreach (GTK_TREE_MODEL (priv->list_store), ev_sidebar_thumbnails_clear_job, sidebar_thumbnails); + gtk_list_store_clear (priv->list_store); +} + +static gboolean +ev_sidebar_thumbnails_support_document (EvSidebarPage *sidebar_page, + EvDocument *document) +{ + return (EV_IS_DOCUMENT_THUMBNAILS (document) && + (ev_document_get_n_pages (document) > 1)); +} + +static const gchar* +ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page) +{ + return _("Thumbnails"); +} + +static void +ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface) +{ + iface->support_document = ev_sidebar_thumbnails_support_document; + iface->set_document = ev_sidebar_thumbnails_set_document; + iface->get_label = ev_sidebar_thumbnails_get_label; +} +