X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-sidebar-thumbnails.c;h=390e14fa61c08e9a347f4816ae2182cadcec676a;hb=2f34c24ee725427e0ad57ee1da30af15ae86ab65;hp=b60aa71970cce7c5a97a247d53ab80bfb193cf72;hpb=80aa207c49dda77a013f0df2a2e2a393062a96b6;p=evince.git diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index b60aa719..390e14fa 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -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 #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;