]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
Rework API a bit. Add a border flag and change sizing logic (now the size
[evince.git] / shell / ev-sidebar-thumbnails.c
index e54eb97e06729ea071ec0177b83100f1ee0ffe09..b602bb26ae7dfa2beaabd47d1504b89a0fe96e47 100644 (file)
@@ -1,7 +1,7 @@
 /* this file is part of evince, a gnome document viewer
  *
  *  Copyright (C) 2004 Red Hat, Inc.
 /* this file is part of evince, a gnome document viewer
  *
  *  Copyright (C) 2004 Red Hat, Inc.
- *  Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
+ *  Copyright (C) 2004, 2005 Anders Carlsson <andersca@gnome.org>
  *
  *  Authors:
  *    Jonathan Blandford <jrb@alum.mit.edu>
  *
  *  Authors:
  *    Jonathan Blandford <jrb@alum.mit.edu>
 #include "ev-sidebar-thumbnails.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-misc.h"
 #include "ev-sidebar-thumbnails.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-misc.h"
+#include "ev-window.h"
 #include "ev-utils.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
 
 /* 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
 };
 
        NUM_COLUMNS
 };
 
-static GtkVBoxClass *parent_class;
-
 G_DEFINE_TYPE (EvSidebarThumbnails, ev_sidebar_thumbnails, GTK_TYPE_VBOX);
 
 #define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \
 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;
        }
 
                priv->idle_id = 0;
        }
 
-       GTK_OBJECT_CLASS (parent_class)->destroy (object);
+       GTK_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->destroy (object);
 }
 
 static void
 }
 
 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);
 
        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));
        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;
 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 = 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));
        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,
        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) {
                            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,
 
                gtk_list_store_set (priv->list_store,
                                    &(priv->current_page_iter),
                                    COLUMN_PIXBUF, pixbuf,
+                                   COLUMN_THUMBNAIL_SET, TRUE,
                                    -1);
 
                g_object_unref (pixbuf);
                                    -1);
 
                g_object_unref (pixbuf);
@@ -275,6 +308,30 @@ populate_thumbnails_idle (gpointer data)
        return TRUE;
 }
 
        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)
 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),
        /* 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);
 
        loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
 
-       for (i = 0; i < n_pages; i++) {
-               page = g_strdup_printf ("<i>%d</i>", i + 1);
+       gtk_list_store_clear (priv->list_store);
+
+       for (i = 1; i <= n_pages; i++) {
+               page = g_strdup_printf ("<i>%d</i>", i);
                gtk_list_store_append (priv->list_store, &iter);
                gtk_list_store_set (priv->list_store, &iter,
                                    COLUMN_PAGE_STRING, page,
                gtk_list_store_append (priv->list_store, &iter);
                gtk_list_store_set (priv->list_store, &iter,
                                    COLUMN_PAGE_STRING, page,