]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-sidebar-thumbnails.c
index b60aa71970cce7c5a97a247d53ab80bfb193cf72..390e14fa61c08e9a347f4816ae2182cadcec676a 100644 (file)
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -32,7 +32,6 @@
 #include <gtk/gtk.h>
 
 #include "ev-document-misc.h"
-#include "ev-document-thumbnails.h"
 #include "ev-job-scheduler.h"
 #include "ev-sidebar-page.h"
 #include "ev-sidebar-thumbnails.h"
@@ -91,14 +90,14 @@ enum {
        PROP_WIDGET,
 };
 
-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 const gchar* ev_sidebar_thumbnails_get_label        (EvSidebarPage       *sidebar_page);
-static void         thumbnail_job_completed_callback       (EvJobThumbnail      *job,
-                                                           EvSidebarThumbnails *sidebar_thumbnails);
-static void         adjustment_changed_cb                  (EvSidebarThumbnails *sidebar_thumbnails);
+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  (EvSidebarPageInterface  *iface);
+static const gchar* ev_sidebar_thumbnails_get_label        (EvSidebarPage           *sidebar_page);
+static void         thumbnail_job_completed_callback       (EvJobThumbnail          *job,
+                                                           EvSidebarThumbnails     *sidebar_thumbnails);
+static void         adjustment_changed_cb                  (EvSidebarThumbnails     *sidebar_thumbnails);
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails, 
                         ev_sidebar_thumbnails, 
@@ -113,72 +112,47 @@ G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails,
 /* Thumbnails dimensions cache */
 #define EV_THUMBNAILS_SIZE_CACHE_KEY "ev-thumbnails-size-cache"
 
+static void
+get_thumbnail_size_for_page (EvDocument *document,
+                            guint       page,
+                            gint       *width,
+                            gint       *height)
+{
+       gdouble scale;
+       gdouble w, h;
+
+       ev_document_get_page_size (document, page, &w, &h);
+       scale = (gdouble)THUMBNAIL_WIDTH / w;
+
+       *width = MAX ((gint)(w * scale + 0.5), 1);
+       *height = MAX ((gint)(h * scale + 0.5), 1);
+}
+
 static EvThumbsSizeCache *
 ev_thumbnails_size_cache_new (EvDocument *document)
 {
        EvThumbsSizeCache *cache;
-       EvRenderContext *rc = NULL;
-       gint i, n_pages;
-       EvThumbsSize *thumb_size;
+       gint               i, n_pages;
+       EvThumbsSize      *thumb_size;
 
        cache = g_new0 (EvThumbsSizeCache, 1);
 
-       n_pages = ev_document_get_n_pages (document);
+       if (ev_document_is_page_size_uniform (document)) {
+               cache->uniform = TRUE;
+               get_thumbnail_size_for_page (document, 0,
+                                            &cache->uniform_width,
+                                            &cache->uniform_height);
+               return cache;
+       }
 
-       /* Assume all pages are the same size until proven otherwise */
-       cache->uniform = TRUE;
+       n_pages = ev_document_get_n_pages (document);
+       cache->sizes = g_new0 (EvThumbsSize, n_pages);
 
        for (i = 0; i < n_pages; i++) {
-               EvPage *page;
-               gdouble page_width, page_height;
-               gint    thumb_width = 0;
-               gint    thumb_height = 0;
-
-               page = ev_document_get_page (document, i);
-
-               ev_document_get_page_size (document, i, &page_width, &page_height);
-
-               if (!rc) {
-                       rc = ev_render_context_new (page, 0, (gdouble)THUMBNAIL_WIDTH / page_width);
-               } else {
-                       ev_render_context_set_page (rc, page);
-                       ev_render_context_set_scale (rc, (gdouble)THUMBNAIL_WIDTH / page_width);
-               }
-
-               ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (document),
-                                                      rc, &thumb_width, &thumb_height);
-
-               if (i == 0) {
-                       cache->uniform_width = thumb_width;
-                       cache->uniform_height = thumb_height;
-               } else if (cache->uniform &&
-                          (cache->uniform_width != thumb_width ||
-                           cache->uniform_height != thumb_height)) {
-                       /* It's a different thumbnail size.  Backfill the array. */
-                       int j;
-
-                       cache->sizes = g_new0 (EvThumbsSize, n_pages);
-
-                       for (j = 0; j < i; j++) {
-                               thumb_size = &(cache->sizes[j]);
-                               thumb_size->width = cache->uniform_width;
-                               thumb_size->height = cache->uniform_height;
-                       }
-                       cache->uniform = FALSE;
-               }
-
-               if (! cache->uniform) {
-                       thumb_size = &(cache->sizes[i]);
-
-                       thumb_size->width = thumb_width;
-                       thumb_size->height = thumb_height;
-               }
-
-               g_object_unref (page);
-       }
-
-       if (rc) {
-               g_object_unref (rc);
+               thumb_size = &(cache->sizes[i]);
+               get_thumbnail_size_for_page (document, i,
+                                            &thumb_size->width,
+                                            &thumb_size->height);
        }
 
        return cache;
@@ -299,11 +273,9 @@ static void
 ev_sidebar_thumbnails_class_init (EvSidebarThumbnailsClass *ev_sidebar_thumbnails_class)
 {
        GObjectClass *g_object_class;
-       GtkObjectClass *gtk_object_class;
        GtkWidgetClass *widget_class;
 
        g_object_class = G_OBJECT_CLASS (ev_sidebar_thumbnails_class);
-       gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_thumbnails_class);
        widget_class = GTK_WIDGET_CLASS (ev_sidebar_thumbnails_class);
 
        g_object_class->dispose = ev_sidebar_thumbnails_dispose;
@@ -332,15 +304,18 @@ ev_sidebar_thumbnails_get_loading_icon (EvSidebarThumbnails *sidebar_thumbnails,
                                        gint                 width,
                                        gint                 height)
 {
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GdkPixbuf *icon;
        gchar     *key;
 
        key = g_strdup_printf ("%dx%d", width, height);
-       icon = g_hash_table_lookup (sidebar_thumbnails->priv->loading_icons, key);
+       icon = g_hash_table_lookup (priv->loading_icons, key);
        if (!icon) {
-               icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
-               g_hash_table_insert (sidebar_thumbnails->priv->loading_icons,
-                                    key, icon);
+               gboolean inverted_colors;
+
+               inverted_colors = ev_document_model_get_inverted_colors (priv->model);
+               icon = ev_document_misc_get_loading_thumbnail (width, height, inverted_colors);
+               g_hash_table_insert (priv->loading_icons, key, icon);
        } else {
                g_free (key);
        }
@@ -750,7 +725,7 @@ ev_sidebar_thumbnails_set_current_page (EvSidebarThumbnails *sidebar,
                        (sidebar->priv->icon_view,
                         G_CALLBACK (ev_sidebar_icon_selection_changed), sidebar);
 
-               gtk_icon_view_set_cursor (GTK_ICON_VIEW (sidebar->priv->icon_view), path, NULL, FALSE);
+               gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (sidebar->priv->icon_view), path, FALSE, 0.0, 0.0);
        }
 
        gtk_tree_path_free (path);
@@ -844,8 +819,7 @@ ev_sidebar_thumbnails_document_changed_cb (EvDocumentModel     *model,
        EvDocument *document = ev_document_model_get_document (model);
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
 
-       if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
-           ev_document_get_n_pages (document) <= 0 ||
+       if (ev_document_get_n_pages (document) <= 0 ||
            !ev_document_check_dimensions (document)) {
                return;
        }
@@ -953,7 +927,7 @@ static gboolean
 ev_sidebar_thumbnails_support_document (EvSidebarPage   *sidebar_page,
                                        EvDocument *document)
 {
-       return (EV_IS_DOCUMENT_THUMBNAILS (document));
+       return TRUE;
 }
 
 static const gchar*
@@ -963,7 +937,7 @@ ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page)
 }
 
 static void
-ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface)
+ev_sidebar_thumbnails_page_iface_init (EvSidebarPageInterface *iface)
 {
        iface->support_document = ev_sidebar_thumbnails_support_document;
        iface->set_model = ev_sidebar_thumbnails_set_model;