diff options
Diffstat (limited to 'libview')
| -rw-r--r-- | libview/ev-pixbuf-cache.c | 5 | ||||
| -rw-r--r-- | libview/ev-view-private.h | 2 | ||||
| -rw-r--r-- | libview/ev-view.c | 109 | ||||
| -rw-r--r-- | libview/ev-view.h | 3 |
4 files changed, 111 insertions, 8 deletions
diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 163267f6..d0b102f8 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -430,11 +430,14 @@ ev_pixbuf_cache_get_page_size (EvPixbufCache *pixbuf_cache, gint rotation) { gint width, height; + gint device_scale; + device_scale = get_device_scale (pixbuf_cache); _get_page_size_for_scale_and_rotation (pixbuf_cache->document, page_index, scale, rotation, &width, &height); - return height * cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, width); + return (height * device_scale) * + cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, width * device_scale); } static gint diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h index e9515723..98891965 100644 --- a/libview/ev-view-private.h +++ b/libview/ev-view-private.h @@ -165,6 +165,8 @@ struct _EvView { gint spacing; gboolean loading; + gboolean can_zoom_in; + gboolean can_zoom_out; gboolean continuous; gboolean dual_even_left; gboolean fullscreen; diff --git a/libview/ev-view.c b/libview/ev-view.c index 86c83944..5301079d 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -73,7 +73,9 @@ enum { PROP_HADJUSTMENT, PROP_VADJUSTMENT, PROP_HSCROLL_POLICY, - PROP_VSCROLL_POLICY + PROP_VSCROLL_POLICY, + PROP_CAN_ZOOM_IN, + PROP_CAN_ZOOM_OUT }; static guint signals[N_SIGNALS] = { 0 }; @@ -227,6 +229,8 @@ static double zoom_for_size_automatic (GdkScreen *screen, gdouble doc_height, int target_width, int target_height); +static gboolean ev_view_can_zoom (EvView *view, + gdouble factor); static void ev_view_zoom_for_size (EvView *view, int width, int height); @@ -3817,8 +3821,7 @@ ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event) gdouble delta = event->delta_x + event->delta_y; gdouble factor = pow (delta < 0 ? ZOOM_IN_FACTOR : ZOOM_OUT_FACTOR, fabs (delta)); - if ((factor < 1.0 && ev_view_can_zoom_out (view)) || - (factor >= 1.0 && ev_view_can_zoom_in (view))) + if (ev_view_can_zoom (view, factor)) ev_view_zoom (view, factor); } break; @@ -5988,6 +5991,12 @@ ev_view_get_property (GObject *object, case PROP_IS_LOADING: g_value_set_boolean (value, view->loading); break; + case PROP_CAN_ZOOM_IN: + g_value_set_boolean (value, view->can_zoom_in); + break; + case PROP_CAN_ZOOM_OUT: + g_value_set_boolean (value, view->can_zoom_out); + break; case PROP_HADJUSTMENT: g_value_set_object (value, view->hadjustment); break; @@ -6263,6 +6272,23 @@ ev_view_class_init (EvViewClass *class) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_CAN_ZOOM_IN, + g_param_spec_boolean ("can-zoom-in", + "Can Zoom In", + "Whether the view can be zoomed in further", + TRUE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_CAN_ZOOM_OUT, + g_param_spec_boolean ("can-zoom-out", + "Can Zoom Out", + "Whether the view can be zoomed out further", + TRUE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + /* Scrollable interface */ g_object_class_override_property (object_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment"); @@ -6447,8 +6473,7 @@ zoom_gesture_scale_changed_cb (GtkGestureZoom *gesture, gtk_gesture_get_bounding_box_center (GTK_GESTURE (gesture), &view->zoom_center_x, &view->zoom_center_y); - if ((factor < 1.0 && ev_view_can_zoom_out (view)) || - (factor >= 1.0 && ev_view_can_zoom_in (view))) + if (ev_view_can_zoom (view, factor)) ev_view_zoom (view, factor); } @@ -6871,6 +6896,31 @@ ev_view_sizing_mode_changed_cb (EvDocumentModel *model, } static void +update_can_zoom (EvView *view) +{ + gdouble min_scale; + gdouble max_scale; + gboolean can_zoom_in; + gboolean can_zoom_out; + + min_scale = ev_document_model_get_min_scale (view->model); + max_scale = ev_document_model_get_max_scale (view->model); + + can_zoom_in = view->scale <= max_scale; + can_zoom_out = view->scale > min_scale; + + if (can_zoom_in != view->can_zoom_in) { + view->can_zoom_in = can_zoom_in; + g_object_notify (G_OBJECT (view), "can-zoom-in"); + } + + if (can_zoom_out != view->can_zoom_out) { + view->can_zoom_out = can_zoom_out; + g_object_notify (G_OBJECT (view), "can-zoom-out"); + } +} + +static void ev_view_page_layout_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvView *view) @@ -6903,6 +6953,24 @@ ev_view_scale_changed_cb (EvDocumentModel *model, view->pending_resize = TRUE; if (view->sizing_mode == EV_SIZING_FREE) gtk_widget_queue_resize (GTK_WIDGET (view)); + + update_can_zoom (view); +} + +static void +ev_view_min_scale_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvView *view) +{ + update_can_zoom (view); +} + +static void +ev_view_max_scale_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvView *view) +{ + update_can_zoom (view); } static void @@ -6986,6 +7054,12 @@ ev_view_set_model (EvView *view, g_signal_connect (view->model, "notify::scale", G_CALLBACK (ev_view_scale_changed_cb), view); + g_signal_connect (view->model, "notify::min-scale", + G_CALLBACK (ev_view_min_scale_changed_cb), + view); + g_signal_connect (view->model, "notify::max-scale", + G_CALLBACK (ev_view_max_scale_changed_cb), + view); g_signal_connect (view->model, "notify::continuous", G_CALLBACK (ev_view_continuous_changed_cb), view); @@ -7025,16 +7099,29 @@ ev_view_reload (EvView *view) /*** Zoom and sizing mode ***/ +static gboolean +ev_view_can_zoom (EvView *view, gdouble factor) +{ + if (factor == 1.0) + return TRUE; + + else if (factor < 1.0) { + return ev_view_can_zoom_out (view); + } else { + return ev_view_can_zoom_in (view); + } +} + gboolean ev_view_can_zoom_in (EvView *view) { - return view->scale * ZOOM_IN_FACTOR <= ev_document_model_get_max_scale (view->model); + return view->can_zoom_in; } gboolean ev_view_can_zoom_out (EvView *view) { - return view->scale * ZOOM_OUT_FACTOR >= ev_document_model_get_min_scale (view->model); + return view->can_zoom_out; } void @@ -7508,6 +7595,14 @@ ev_view_find_previous (EvView *view) } void +ev_view_find_set_result (EvView *view, gint page, gint result) +{ + ev_document_model_set_page (view->model, page); + view->find_result = result; + jump_to_find_result (view); +} + +void ev_view_find_search_changed (EvView *view) { /* search string has changed, focus on new search result */ diff --git a/libview/ev-view.h b/libview/ev-view.h index ac16211f..ce455a53 100644 --- a/libview/ev-view.h +++ b/libview/ev-view.h @@ -72,6 +72,9 @@ void ev_view_zoom (EvView *view, /* Find */ void ev_view_find_next (EvView *view); void ev_view_find_previous (EvView *view); +void ev_view_find_set_result (EvView *view, + gint page, + gint result); void ev_view_find_search_changed (EvView *view); void ev_view_find_set_highlight_search (EvView *view, gboolean value); |
