]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
Replace GTK_WIDGET_REALIZED() with gtk_widget_get_realized()
[evince.git] / shell / ev-sidebar-thumbnails.c
index 4e8c5b2fb9e6a8a5771dbd1f6ca2cdcd132d5316..16fe37661510768acdefe8bc20fd348c8e14e728 100644 (file)
@@ -66,12 +66,13 @@ struct _EvSidebarThumbnailsPrivate {
        GtkListStore *list_store;
        GHashTable *loading_icons;
        EvDocument *document;
-       EvPageCache *page_cache;
+       EvDocumentModel *model;
        EvThumbsSizeCache *size_cache;
 
        gint n_pages, pages_done;
 
        int rotation;
+       gboolean inverted_colors;
 
        /* Visible pages */
        gint start_page, end_page;
@@ -94,8 +95,6 @@ static void         ev_sidebar_thumbnails_clear_model      (EvSidebarThumbnails
 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);
 static void         thumbnail_job_completed_callback       (EvJobThumbnail      *job,
                                                            EvSidebarThumbnails *sidebar_thumbnails);
@@ -118,7 +117,7 @@ static EvThumbsSizeCache *
 ev_thumbnails_size_cache_new (EvDocument *document)
 {
        EvThumbsSizeCache *cache;
-       EvRenderContext *rc;
+       EvRenderContext *rc = NULL;
        gint i, n_pages;
        EvThumbsSize *thumb_size;
 
@@ -511,7 +510,7 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
                return;
        
        if (priv->tree_view) {
-               if (! GTK_WIDGET_REALIZED (priv->tree_view))
+               if (! gtk_widget_get_realized (priv->tree_view))
                        return;
 
                gtk_tree_view_convert_tree_to_bin_window_coords (GTK_TREE_VIEW (priv->tree_view),
@@ -527,7 +526,7 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
                                               1, wy2 -1, &path2,
                                               NULL, NULL, NULL);
        } else if (priv->icon_view) {
-               if (! GTK_WIDGET_REALIZED (priv->icon_view))
+               if (! gtk_widget_get_realized (priv->icon_view))
                        return;
                if (! gtk_icon_view_get_visible_range (GTK_ICON_VIEW (priv->icon_view), &path, &path2))
                        return;
@@ -585,34 +584,6 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
        }
 }
 
-static gboolean
-refresh (EvSidebarThumbnails *sidebar_thumbnails)
-{
-       adjustment_changed_cb (sidebar_thumbnails);
-       return FALSE;
-}
-
-void
-ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
-                              int                  rotation)
-{
-       sidebar_thumbnails->priv->rotation = rotation;
-       if (sidebar_thumbnails->priv->loading_icons)
-               g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
-
-       if (sidebar_thumbnails->priv->document == NULL ||
-           sidebar_thumbnails->priv->n_pages <= 0)
-               return;
-
-       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
-       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
-
-       /* Trigger a redraw */
-       sidebar_thumbnails->priv->start_page = -1;
-       sidebar_thumbnails->priv->end_page = -1;
-       g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
-}
-
 static void
 ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
                                   EvSidebarThumbnails *ev_sidebar_thumbnails)
@@ -630,7 +601,7 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
        page = gtk_tree_path_get_indices (path)[0];
        gtk_tree_path_free (path);
 
-       ev_page_cache_set_current_page_history (priv->page_cache, page);
+       ev_document_model_set_page (priv->model, page);
 }
 
 static void
@@ -655,7 +626,7 @@ ev_sidebar_icon_selection_changed (GtkIconView         *icon_view,
        gtk_tree_path_free (path);
        g_list_free (selected);
 
-       ev_page_cache_set_current_page_history (priv->page_cache, page);
+       ev_document_model_set_page (priv->model, page);
 }
 
 static void
@@ -749,9 +720,8 @@ ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
 }
 
 static void
-page_changed_cb (EvPageCache         *page_cache,
-                int                  page,
-                EvSidebarThumbnails *sidebar)
+ev_sidebar_thumbnails_set_current_page (EvSidebarThumbnails *sidebar,
+                                       gint                 page)
 {
        GtkTreeView *tree_view;
        GtkTreePath *path;
@@ -780,6 +750,68 @@ page_changed_cb (EvPageCache         *page_cache,
        gtk_tree_path_free (path);
 }
 
+static void
+page_changed_cb (EvSidebarThumbnails *sidebar,
+                gint                 old_page,
+                gint                 new_page)
+{
+       ev_sidebar_thumbnails_set_current_page (sidebar, new_page);
+}
+
+static gboolean
+refresh (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       adjustment_changed_cb (sidebar_thumbnails);
+       return FALSE;
+}
+
+static void
+ev_sidebar_thumbnails_reload (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       EvDocumentModel *model;
+
+       if (sidebar_thumbnails->priv->loading_icons)
+               g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
+
+       if (sidebar_thumbnails->priv->document == NULL ||
+           sidebar_thumbnails->priv->n_pages <= 0)
+               return;
+
+       model = sidebar_thumbnails->priv->model;
+
+       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
+
+       /* Trigger a redraw */
+       sidebar_thumbnails->priv->start_page = -1;
+       sidebar_thumbnails->priv->end_page = -1;
+       ev_sidebar_thumbnails_set_current_page (sidebar_thumbnails,
+                                               ev_document_model_get_page (model));
+       g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
+}
+
+static void
+ev_sidebar_thumbnails_rotation_changed_cb (EvDocumentModel     *model,
+                                          GParamSpec          *pspec,
+                                          EvSidebarThumbnails *sidebar_thumbnails)
+{
+       gint rotation = ev_document_model_get_rotation (model);
+
+       sidebar_thumbnails->priv->rotation = rotation;
+       ev_sidebar_thumbnails_reload (sidebar_thumbnails);
+}
+
+static void
+ev_sidebar_thumbnails_inverted_colors_changed_cb (EvDocumentModel     *model,
+                                                 GParamSpec          *pspec,
+                                                 EvSidebarThumbnails *sidebar_thumbnails)
+{
+       gboolean inverted_colors = ev_document_model_get_inverted_colors (model);
+
+       sidebar_thumbnails->priv->inverted_colors = inverted_colors;
+       ev_sidebar_thumbnails_reload (sidebar_thumbnails);
+}
+
 static void
 thumbnail_job_completed_callback (EvJobThumbnail      *job,
                                  EvSidebarThumbnails *sidebar_thumbnails)
@@ -788,6 +820,8 @@ thumbnail_job_completed_callback (EvJobThumbnail      *job,
        GtkTreeIter *iter;
 
        iter = (GtkTreeIter *) g_object_get_data (G_OBJECT (job), "tree_iter");
+       if (priv->inverted_colors)
+               ev_document_misc_invert_pixbuf (job->thumbnail);
        gtk_list_store_set (priv->list_store,
                            iter,
                            COLUMN_PIXBUF, job->thumbnail,
@@ -797,24 +831,24 @@ thumbnail_job_completed_callback (EvJobThumbnail      *job,
 }
 
 static void
-ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
-                                   EvDocument    *document)
+ev_sidebar_thumbnails_document_changed_cb (EvDocumentModel     *model,
+                                          GParamSpec          *pspec,
+                                          EvSidebarThumbnails *sidebar_thumbnails)
 {
-       EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
-
+       EvDocument *document = ev_document_model_get_document (model);
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
 
-       priv->page_cache = ev_page_cache_get (document);
-
        if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
            ev_document_get_n_pages (document) <= 0 ||
-           !ev_page_cache_check_dimensions (priv->page_cache)) {
+           !ev_document_check_dimensions (document)) {
                return;
        }
 
        priv->size_cache = ev_thumbnails_size_cache_get (document);
        priv->document = document;
        priv->n_pages = ev_document_get_n_pages (document);
+       priv->rotation = ev_document_model_get_rotation (model);
+       priv->inverted_colors = ev_document_model_get_inverted_colors (model);
        priv->loading_icons = g_hash_table_new_full (g_str_hash,
                                                     g_str_equal,
                                                     (GDestroyNotify)g_free,
@@ -849,15 +883,38 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
        }
 
        /* Connect to the signal and trigger a fake callback */
-       g_signal_connect (priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), sidebar_thumbnails);
+       g_signal_connect_swapped (priv->model, "page-changed",
+                                 G_CALLBACK (page_changed_cb),
+                                 sidebar_thumbnails);
+       g_signal_connect (priv->model, "notify::rotation",
+                         G_CALLBACK (ev_sidebar_thumbnails_rotation_changed_cb),
+                         sidebar_thumbnails);
+       g_signal_connect (priv->model, "notify::inverted-colors",
+                         G_CALLBACK (ev_sidebar_thumbnails_inverted_colors_changed_cb),
+                         sidebar_thumbnails);
        sidebar_thumbnails->priv->start_page = -1;
        sidebar_thumbnails->priv->end_page = -1;
-       page_changed_cb (priv->page_cache,
-                        ev_page_cache_get_current_page (priv->page_cache),
-                        sidebar_thumbnails);
+       ev_sidebar_thumbnails_set_current_page (sidebar_thumbnails,
+                                               ev_document_model_get_page (model));
        adjustment_changed_cb (sidebar_thumbnails);
 }
 
+static void
+ev_sidebar_thumbnails_set_model (EvSidebarPage   *sidebar_page,
+                                EvDocumentModel *model)
+{
+       EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+
+       if (priv->model == model)
+               return;
+
+       priv->model = model;
+       g_signal_connect (model, "notify::document",
+                         G_CALLBACK (ev_sidebar_thumbnails_document_changed_cb),
+                         sidebar_page);
+}
+
 static gboolean
 ev_sidebar_thumbnails_clear_job (GtkTreeModel *model,                                             
                                 GtkTreePath *path,
@@ -903,7 +960,6 @@ 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->set_model = ev_sidebar_thumbnails_set_model;
        iface->get_label = ev_sidebar_thumbnails_get_label;
 }
-