]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Add a get_orientation api. Improve set_orientation.
[evince.git] / shell / ev-view.c
index ff05be2118d98fda27ff3ebeb8ed2b44c275eba4..c366b04c4f18dce855d60558b15e55ba42ad31e8 100644 (file)
@@ -1322,6 +1322,9 @@ ev_view_motion_notify_event (GtkWidget      *widget,
 {
        EvView *view = EV_VIEW (widget);
 
 {
        EvView *view = EV_VIEW (widget);
 
+       if (!view->document)
+               return FALSE;
+
        if (view->pressed_button == 1) {
                GdkRectangle selection;
 
        if (view->pressed_button == 1) {
                GdkRectangle selection;
 
@@ -1371,7 +1374,7 @@ ev_view_motion_notify_event (GtkWidget      *widget,
 
                        return TRUE;
                }
 
                        return TRUE;
                }
-       } else if (view->pressed_button <= 0 && view->document) {
+       } else if (view->pressed_button <= 0) {
                EvLink *link;
 
                link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y);
                EvLink *link;
 
                link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y);
@@ -1899,6 +1902,28 @@ ev_view_new (void)
        return view;
 }
 
        return view;
 }
 
+static void
+setup_caches (EvView *view)
+{
+       view->page_cache = ev_page_cache_get (view->document);
+       g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
+       view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
+       g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+}
+
+static void
+clear_caches (EvView *view)
+{
+       if (view->pixbuf_cache) {
+               g_object_unref (view->pixbuf_cache);
+               view->pixbuf_cache = NULL;
+       }
+
+       if (view->document) {
+               ev_page_cache_clear (view->document);
+       }
+}
+
 void
 ev_view_set_document (EvView     *view,
                      EvDocument *document)
 void
 ev_view_set_document (EvView     *view,
                      EvDocument *document)
@@ -1915,10 +1940,7 @@ ev_view_set_document (EvView     *view,
 
                 }
 
 
                 }
 
-               if (view->pixbuf_cache) {
-                       g_object_unref (view->pixbuf_cache);
-                       view->pixbuf_cache = NULL;
-               }
+               clear_caches (view);
 
                view->document = document;
                view->find_page = 0;
 
                view->document = document;
                view->find_page = 0;
@@ -1932,10 +1954,8 @@ ev_view_set_document (EvView     *view,
                                                  G_CALLBACK (find_changed_cb),
                                                  view);
                        }
                                                  G_CALLBACK (find_changed_cb),
                                                  view);
                        }
-                       view->page_cache = ev_page_cache_get (view->document);
-                       g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
-                       view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
-                       g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+
+                       setup_caches (view);
                 }
 
                gtk_widget_queue_resize (GTK_WIDGET (view));
                 }
 
                gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -2125,6 +2145,54 @@ ev_view_zoom_out (EvView *view)
        ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
 }
 
        ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
 }
 
+static void
+ev_view_set_orientation (EvView         *view,
+                        EvOrientation   orientation)
+{
+       ev_document_set_orientation (view->document, orientation);
+
+       clear_caches (view);
+       setup_caches (view);
+
+       gtk_widget_queue_resize (GTK_WIDGET (view));
+}
+
+void
+ev_view_rotate_right (EvView *view)
+{
+       EvOrientation orientation, new_orientation;
+
+       orientation = ev_document_get_orientation (view->document);
+       if (orientation == EV_ORIENTATION_PORTRAIT) {
+               new_orientation = EV_ORIENTATION_LANDSCAPE;
+       } else if (orientation == EV_ORIENTATION_LANDSCAPE) {
+               new_orientation = EV_ORIENTATION_UPSIDEDOWN;
+       } else if (orientation == EV_ORIENTATION_UPSIDEDOWN) {
+               new_orientation = EV_ORIENTATION_SEASCAPE;
+       } else {
+               new_orientation = EV_ORIENTATION_PORTRAIT;
+       }
+       ev_view_set_orientation (view, new_orientation);
+}
+
+void
+ev_view_rotate_left (EvView *view)
+{
+       EvOrientation orientation, new_orientation;
+
+       orientation = ev_document_get_orientation (view->document);
+       if (orientation == EV_ORIENTATION_PORTRAIT) {
+               new_orientation = EV_ORIENTATION_SEASCAPE;
+       } else if (orientation == EV_ORIENTATION_SEASCAPE) {
+               new_orientation = EV_ORIENTATION_UPSIDEDOWN;
+       } else if (orientation == EV_ORIENTATION_UPSIDEDOWN) {
+               new_orientation = EV_ORIENTATION_LANDSCAPE;
+       } else {
+               new_orientation = EV_ORIENTATION_PORTRAIT;
+       }
+       ev_view_set_orientation (view, new_orientation);
+}
+
 static double
 zoom_for_size_fit_width (int doc_width,
                         int doc_height,
 static double
 zoom_for_size_fit_width (int doc_width,
                         int doc_height,