From 9a1a3b315f05568f6e28f64f685338dc120d5491 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Thu, 25 Aug 2005 06:34:20 +0000 Subject: Redo rotation (again). prepare for 0.4.0 Thu Aug 25 02:32:32 2005 Jonathan Blandford * backend/ev-document-misc.c: (ev_document_misc_get_thumbnail_frame): * backend/ev-document-misc.h: * configure.ac: * pdf/ev-poppler.cc: * shell/Makefile.am: * shell/ev-sidebar-thumbnails.c: (add_range), (ev_sidebar_thumbnails_set_loading_icon), (ev_sidebar_thumbnails_refresh), (ev_sidebar_thumbnails_set_document): * shell/ev-sidebar-thumbnails.h: * shell/ev-view.c: (ev_view_motion_notify_event), (ev_view_set_property), (ev_view_get_property), (ev_view_class_init), (ev_view_set_rotation): * shell/ev-window.c: (ev_window_cmd_edit_rotate_left), (ev_window_cmd_edit_rotate_right), (ev_window_rotation_changed_cb), (ev_window_init): * tiff/tiff-document.c: (tiff_document_thumbnails_get_thumbnail): Redo rotation (again). prepare for 0.4.0 --- (limited to 'shell') diff --git a/shell/Makefile.am b/shell/Makefile.am index 7ec4113..ae01290 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -93,6 +93,9 @@ ev-marshal.c: ev-marshal.list echo '#include "ev-marshal.h"' > ev-marshal.c glib-genmarshal --prefix=ev_marshal ev-marshal.list --body >> ev-marshal.c +DISTCLEANFILES= \ + ev-application-service.h + if DBUS_TOOL_NO_PREFIX ev-application-service.h: $(srcdir)/ev-application-service.xml dbus-binding-tool --mode=glib-server --output=ev-application-service.h $(srcdir)/ev-application-service.xml diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index 362ef48..6ed20a2 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -57,6 +57,8 @@ struct _EvSidebarThumbnailsPrivate { gint n_pages, pages_done; + int rotation; + /* Visible pages */ gint start_page, end_page; }; @@ -230,7 +232,7 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails, if (job == NULL && !thumbnail_set) { /* FIXME: Need rotation */ - job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, 0, THUMBNAIL_WIDTH); + 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), @@ -355,11 +357,47 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails) } } + +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) +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); } @@ -545,8 +583,6 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, EvDocument *document) { EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page); - gint width = THUMBNAIL_WIDTH; - gint height = THUMBNAIL_WIDTH; EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv; @@ -556,16 +592,7 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, priv->document = document; priv->n_pages = ev_page_cache_get_n_pages (priv->page_cache); - /* 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 (); - - 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); ev_sidebar_thumbnails_fill_model (sidebar_thumbnails); @@ -595,6 +622,8 @@ 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); + sidebar_thumbnails->priv->start_page = 0; + sidebar_thumbnails->priv->end_page = 0; adjustment_changed_cb (sidebar_thumbnails); } diff --git a/shell/ev-sidebar-thumbnails.h b/shell/ev-sidebar-thumbnails.h index 6e93a8f..e3d6bb1 100644 --- a/shell/ev-sidebar-thumbnails.h +++ b/shell/ev-sidebar-thumbnails.h @@ -53,7 +53,8 @@ struct _EvSidebarThumbnailsClass { GType ev_sidebar_thumbnails_get_type (void); GtkWidget *ev_sidebar_thumbnails_new (void); -void ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails); +void ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails, + int rotation); G_END_DECLS diff --git a/shell/ev-view.c b/shell/ev-view.c index 1e95459..a59b64a 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -53,6 +53,7 @@ enum { PROP_PRESENTATION, PROP_SIZING_MODE, PROP_ZOOM, + PROP_ROTATION, }; enum { @@ -1465,7 +1466,11 @@ ev_view_motion_notify_event (GtkWidget *widget, if (!view->document) return FALSE; - if (view->pressed_button == 1) { + /* For the Evince 0.4.x release, we limit selection to un-rotated + * documents only. + */ + if (view->pressed_button == 1 && + view->rotation == 0) { view->selection_info.in_selection = TRUE; view->motion_x = event->x + view->scroll_x; view->motion_y = event->y + view->scroll_y; @@ -1515,7 +1520,11 @@ ev_view_motion_notify_event (GtkWidget *widget, return TRUE; } - } else if (view->pressed_button <= 0) { + /* For the Evince 0.4.x release, we limit links to un-rotated documents + * only. + */ + } else if (view->pressed_button <= 0 && + view->rotation == 0) { EvLink *link; link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y); @@ -1856,6 +1865,9 @@ ev_view_set_property (GObject *object, case PROP_ZOOM: ev_view_set_zoom (view, g_value_get_double (value), FALSE); break; + case PROP_ROTATION: + ev_view_set_rotation (view, g_value_get_int (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -1895,6 +1907,9 @@ ev_view_get_property (GObject *object, case PROP_ZOOM: g_value_set_double (value, view->scale); break; + case PROP_ROTATION: + g_value_set_int (value, view->rotation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -2023,6 +2038,15 @@ ev_view_class_init (EvViewClass *class) MAX_SCALE, 1.0, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_ROTATION, + g_param_spec_double ("rotation", + "Rotation", + "Rotation", + 0, + 360, + 0, + G_PARAM_READWRITE)); binding_set = gtk_binding_set_by_class (class); @@ -2432,6 +2456,8 @@ ev_view_set_rotation (EvView *view, int rotation) ev_pixbuf_cache_clear (view->pixbuf_cache); gtk_widget_queue_resize (GTK_WIDGET (view)); } + + g_object_notify (G_OBJECT (view), "rotation"); } int diff --git a/shell/ev-window.c b/shell/ev-window.c index d860d74..0c8139a 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -2060,35 +2060,16 @@ ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, gint response, gpointer data) gtk_widget_destroy (GTK_WIDGET (dialog)); } -/* should these be hooked up to properties?? */ -static void -save_rotation_to_file (EvWindow *window) -{ - int rotation; - - if (window->priv->uri) { - rotation = ev_view_get_rotation (EV_VIEW (window->priv->view)); - ev_metadata_manager_set_int (window->priv->uri, "rotation", - rotation); - } - - -} - static void ev_window_cmd_edit_rotate_left (GtkAction *action, EvWindow *ev_window) { ev_view_rotate_left (EV_VIEW (ev_window->priv->view)); - ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (ev_window->priv->sidebar_thumbs)); - save_rotation_to_file (ev_window); } static void ev_window_cmd_edit_rotate_right (GtkAction *action, EvWindow *ev_window) { ev_view_rotate_right (EV_VIEW (ev_window->priv->view)); - ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (ev_window->priv->sidebar_thumbs)); - save_rotation_to_file (ev_window); } static void @@ -2421,6 +2402,22 @@ ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_w } static void +ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window) +{ + int rotation; + + rotation = ev_view_get_rotation (EV_VIEW (window->priv->view)); + + if (window->priv->uri) { + ev_metadata_manager_set_int (window->priv->uri, "rotation", + rotation); + } + + ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (window->priv->sidebar_thumbs), + rotation); +} + +static void ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { ev_window_update_dual_page_action (ev_window); @@ -3513,6 +3510,10 @@ ev_window_init (EvWindow *ev_window) "notify::continuous", G_CALLBACK (ev_window_continuous_changed_cb), ev_window); + g_signal_connect (ev_window->priv->view, + "notify::rotation", + G_CALLBACK (ev_window_rotation_changed_cb), + ev_window); ev_window->priv->statusbar = ev_statusbar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box), -- cgit v0.9.1