]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
Fix window size persistance
[evince.git] / shell / ev-sidebar-thumbnails.c
index d86d392aaf20430d04a0361c0cf214fbeb8fdc97..6ed20a21753a020769684b7b6f654577ea50f6e0 100644 (file)
@@ -53,9 +53,12 @@ struct _EvSidebarThumbnailsPrivate {
        GtkListStore *list_store;
        GdkPixbuf *loading_icon;
        EvDocument *document;
+       EvPageCache *page_cache;
 
        gint n_pages, pages_done;
 
+       int rotation;
+
        /* Visible pages */
        gint start_page, end_page;
 };
@@ -100,17 +103,24 @@ ev_sidebar_thumbnails_dispose (GObject *object)
        EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (object);
        
        ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
-       g_object_unref (sidebar_thumbnails->priv->loading_icon);
-       g_object_unref (sidebar_thumbnails->priv->list_store);
-
+       if (sidebar_thumbnails->priv->loading_icon) {
+               g_object_unref (sidebar_thumbnails->priv->loading_icon);
+               sidebar_thumbnails->priv->loading_icon = NULL;
+       }
+       
+       if (sidebar_thumbnails->priv->list_store) {
+               g_object_unref (sidebar_thumbnails->priv->list_store);
+               sidebar_thumbnails->priv->list_store = NULL;
+       }
+       
        G_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->dispose (object);
 }
 
 static void
 ev_sidebar_thumbnails_get_property (GObject    *object,
-                                        guint       prop_id,
-                                        GValue     *value,
-                                        GParamSpec *pspec)
+                                   guint       prop_id,
+                                   GValue     *value,
+                                   GParamSpec *pspec)
 {
        EvSidebarThumbnails *sidebar = EV_SIDEBAR_THUMBNAILS (object);
 
@@ -162,13 +172,11 @@ clear_range (EvSidebarThumbnails *sidebar_thumbnails,
             gint                 start_page,
             gint                 end_page)
 {
-       EvSidebarThumbnailsPrivate *priv;
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GtkTreePath *path;
        GtkTreeIter iter;
        gboolean result;
 
-       priv = sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (sidebar_thumbnails);
-
        g_assert (start_page <= end_page);
 
        path = gtk_tree_path_new_from_indices (start_page, -1);
@@ -202,14 +210,12 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
           gint                 start_page,
           gint                 end_page)
 {
-       EvSidebarThumbnailsPrivate *priv;
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GtkTreePath *path;
        GtkTreeIter iter;
        gboolean result;
        gint page = start_page;
 
-       priv = sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (sidebar_thumbnails);
-
        g_assert (start_page <= end_page);
 
        path = gtk_tree_path_new_from_indices (start_page, -1);
@@ -225,7 +231,8 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
                                    -1);
 
                if (job == NULL && !thumbnail_set) {
-                       job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, THUMBNAIL_WIDTH);
+                       /* FIXME: Need rotation */
+                       job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, priv->rotation, THUMBNAIL_WIDTH);
                        ev_job_queue_add_job (EV_JOB (job), EV_JOB_PRIORITY_HIGH);
                        g_object_set_data_full (G_OBJECT (job), "tree_iter",
                                                gtk_tree_iter_copy (&iter),
@@ -251,11 +258,9 @@ update_visible_range (EvSidebarThumbnails *sidebar_thumbnails,
                      gint                 start_page,
                      gint                 end_page)
 {
-       EvSidebarThumbnailsPrivate *priv;
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        int old_start_page, old_end_page;
 
-       priv = sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (sidebar_thumbnails);
-
        old_start_page = priv->start_page;
        old_end_page = priv->end_page;
 
@@ -279,14 +284,12 @@ update_visible_range (EvSidebarThumbnails *sidebar_thumbnails,
 static void
 adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
 {
-       EvSidebarThumbnailsPrivate *priv;
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GtkTreePath *path = NULL;
        GtkTreePath *path2 = NULL;
        gint wy1;
        gint wy2;
 
-       priv = sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (sidebar_thumbnails);
-
        if (priv->tree_view) {
                if (! GTK_WIDGET_REALIZED (priv->tree_view))
                        return;
@@ -307,7 +310,8 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
 #ifdef HAVE_GTK_ICON_VIEW_GET_VISIBLE_RANGE
                if (! GTK_WIDGET_REALIZED (priv->icon_view))
                        return;
-               gtk_icon_view_get_visible_range (GTK_ICON_VIEW (priv->icon_view), &path, &path2);
+               if (! gtk_icon_view_get_visible_range (GTK_ICON_VIEW (priv->icon_view), &path, &path2))
+                       return;
 #else
                g_assert_not_reached ();
 #endif
@@ -328,18 +332,84 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
        gtk_tree_path_free (path2);
 }
 
+static void
+ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+       GtkTreeIter iter;
+       int i;
+
+       for (i = 0; i < sidebar_thumbnails->priv->n_pages; i++) {
+               gchar *page_label;
+               gchar *page_string;
+
+               page_label = ev_page_cache_get_page_label (priv->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_string,
+                                   COLUMN_PIXBUF, priv->loading_icon,
+                                   COLUMN_THUMBNAIL_SET, FALSE,
+                                   -1);
+               g_free (page_label);
+               g_free (page_string);
+       }
+}
+
+
+static void
+ev_sidebar_thumbnails_set_loading_icon (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       gint width = THUMBNAIL_WIDTH;
+       gint height = THUMBNAIL_WIDTH;
+
+       if (sidebar_thumbnails->priv->loading_icon)
+               g_object_unref (sidebar_thumbnails->priv->loading_icon);
+
+       if (sidebar_thumbnails->priv->document) {
+               /* We get the dimensions of the first doc so that we can make a blank
+                * icon.  */
+               ev_document_doc_mutex_lock ();
+               ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (sidebar_thumbnails->priv->document),
+                                                      0, THUMBNAIL_WIDTH, &width, &height);
+               ev_document_doc_mutex_unlock ();
+               sidebar_thumbnails->priv->loading_icon =
+                       ev_document_misc_get_thumbnail_frame (width, height, sidebar_thumbnails->priv->rotation, NULL);
+       } else {
+               sidebar_thumbnails->priv->loading_icon = NULL;
+       }
+
+}
+void
+ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
+
+                              int                  rotation)
+{
+       sidebar_thumbnails->priv->rotation = rotation;
+       ev_sidebar_thumbnails_set_loading_icon (sidebar_thumbnails);
+
+       if (sidebar_thumbnails->priv->document == NULL)
+               return;
+
+       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
+
+       /* Trigger a redraw */
+       sidebar_thumbnails->priv->start_page = 0;
+       sidebar_thumbnails->priv->end_page = 0;
+       adjustment_changed_cb (sidebar_thumbnails);
+}
+
 static void
 ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
                                   EvSidebarThumbnails *ev_sidebar_thumbnails)
 {
-       EvSidebarThumbnailsPrivate *priv;
-       EvPageCache *page_cache;
+       EvSidebarThumbnailsPrivate *priv = ev_sidebar_thumbnails->priv;
        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;
 
@@ -348,22 +418,18 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
        page = gtk_tree_path_get_indices (path)[0];
        gtk_tree_path_free (path);
 
-       page_cache = ev_page_cache_get (priv->document);
-       ev_page_cache_set_current_page (page_cache, page);
+       ev_page_cache_set_current_page (priv->page_cache, page);
 }
 
 static void
 ev_sidebar_icon_selection_changed (GtkIconView         *icon_view,
                                   EvSidebarThumbnails *ev_sidebar_thumbnails)
 {
-       EvSidebarThumbnailsPrivate *priv;
-       EvPageCache *page_cache;
+       EvSidebarThumbnailsPrivate *priv = ev_sidebar_thumbnails->priv;
        GtkTreePath *path;
        GList *selected;
        int page;
 
-       priv = ev_sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (ev_sidebar_thumbnails);
-
        selected = gtk_icon_view_get_selected_items (icon_view);
        if (selected == NULL)
                return;
@@ -377,8 +443,7 @@ ev_sidebar_icon_selection_changed (GtkIconView         *icon_view,
        gtk_tree_path_free (path);
        g_list_free (selected);
 
-       page_cache = ev_page_cache_get (priv->document);
-       ev_page_cache_set_current_page (page_cache, page);
+       ev_page_cache_set_current_page (priv->page_cache, page);
 }
 
 static void
@@ -431,11 +496,8 @@ static gboolean
 ev_sidebar_thumbnails_use_icon_view (EvSidebarThumbnails *sidebar_thumbnails)
 {
 #ifdef HAVE_GTK_ICON_VIEW_GET_VISIBLE_RANGE
-       EvPageCache *page_cache;
-
-       page_cache = ev_page_cache_get (sidebar_thumbnails->priv->document);
-
-       if (ev_page_cache_get_n_pages (page_cache) > MAX_ICON_VIEW_PAGE_COUNT)
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+       if (ev_page_cache_get_n_pages (priv->page_cache) > MAX_ICON_VIEW_PAGE_COUNT)
                return FALSE;
        return TRUE;
 #else
@@ -521,51 +583,19 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
                                    EvDocument          *document)
 {
        EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
-       gint i, n_pages;
-       GtkTreeIter iter;
-       gint width = THUMBNAIL_WIDTH;
-       gint height = THUMBNAIL_WIDTH;
-       EvPageCache *page_cache;
 
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
 
        g_return_if_fail (EV_IS_DOCUMENT_THUMBNAILS (document));
 
-       page_cache = ev_page_cache_get (document);
-       n_pages = ev_page_cache_get_n_pages (page_cache);
-
+       priv->page_cache = ev_page_cache_get (document);
        priv->document = document;
-       priv->n_pages = n_pages;
-
-       /* We get the dimensions of the first doc so that we can make a blank
-        * icon.  */
-       ev_document_doc_mutex_lock ();
-       ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (priv->document),
-                                              0, THUMBNAIL_WIDTH, &width, &height);
-       ev_document_doc_mutex_unlock ();
+       priv->n_pages = ev_page_cache_get_n_pages (priv->page_cache);
 
-       if (priv->loading_icon)
-               g_object_unref (priv->loading_icon);
-       priv->loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
+       ev_sidebar_thumbnails_set_loading_icon (sidebar_thumbnails);
 
        ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
-       for (i = 0; i < n_pages; i++) {
-               gchar *page_label;
-               gchar *page_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_string,
-                                   COLUMN_PIXBUF, priv->loading_icon,
-                                   COLUMN_THUMBNAIL_SET, FALSE,
-                                   -1);
-               g_free (page_label);
-               g_free (page_string);
-       }
-
+       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
 
        /* Create the view widget, and remove the old one, if needed */
        if (ev_sidebar_thumbnails_use_icon_view (sidebar_thumbnails)) {
@@ -591,7 +621,9 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage   *sidebar_page,
        }
 
        /* Connect to the signal and trigger a fake callback */
-       g_signal_connect (page_cache, "page-changed", G_CALLBACK (page_changed_cb), sidebar_thumbnails);
+       g_signal_connect (priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), sidebar_thumbnails);
+       sidebar_thumbnails->priv->start_page = 0;
+       sidebar_thumbnails->priv->end_page = 0;
        adjustment_changed_cb (sidebar_thumbnails);
 }