]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
Fix for bugs 300233,173184,300094. Problems with page index started at 0
[evince.git] / shell / ev-sidebar-thumbnails.c
index 7bbaa098f2b2c9a983d3be6724613d78a180f22c..e9ff445328b330581fce026620a67748786772cb 100644 (file)
@@ -63,6 +63,19 @@ G_DEFINE_TYPE (EvSidebarThumbnails, ev_sidebar_thumbnails, GTK_TYPE_VBOX);
 #define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \
        (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsPrivate));
 
+static void 
+ev_sidebar_thumbnails_clear_model (EvSidebarThumbnails *sidebar);
+
+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,6 +85,8 @@ 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));
 }
 
@@ -222,7 +237,6 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails,
        GdkPixbuf *loading_icon;
        gint i, n_pages;
        GtkTreeIter iter;
-       gchar *page;
        gint width = THUMBNAIL_WIDTH;
        gint height = THUMBNAIL_WIDTH;
        EvPageCache *page_cache;
@@ -246,21 +260,25 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails,
 
        loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
 
-       gtk_list_store_clear (priv->list_store);
+       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
        for (i = 0; i < n_pages; i++) {
                EvJob *job;
+               gchar *page_label;
+               gchar *page_string;
 
-               /* FIXME: Bah.  This is still -1 for some reason.  Need to track it down.. */
                job = ev_job_thumbnail_new (priv->document, i, THUMBNAIL_WIDTH);
-               page = g_strdup_printf ("<i>%d</i>", i + 1); /* FIXME: replace with string. */
+               page_label = ev_page_cache_get_page_label (page_cache, i);
+               page_string = g_markup_printf_escaped ("<i>%s</i>", page_label);
+
                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 +296,32 @@ 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);
+}
+
+