#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"
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,
/* 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;
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;
(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);
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;
}
ev_sidebar_thumbnails_support_document (EvSidebarPage *sidebar_page,
EvDocument *document)
{
- return (EV_IS_DOCUMENT_THUMBNAILS (document));
+ return TRUE;
}
static const gchar*
}
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;