[evince] Use properties for can-zoom-in and -out



commit bbfbf913c71e435e51444c24e524d362a972cb2e
Author: William Jon McCann <jmccann redhat com>
Date:   Wed Dec 19 13:21:58 2012 -0500

    Use properties for can-zoom-in and -out
    
    This simplifies the logic required to enable zoom actions for
    consumers of the view.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=690510

 libview/ev-view-private.h |    2 +
 libview/ev-view.c         |   95 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 78 insertions(+), 19 deletions(-)
---
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index e7ac522..ca48ad9 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -160,6 +160,8 @@ struct _EvView {
 	gint spacing;
 
 	gboolean loading;
+	gboolean can_zoom_in;
+	gboolean can_zoom_out;
 	gboolean continuous;
 	gboolean dual_page;
 	gboolean dual_even_left;
diff --git a/libview/ev-view.c b/libview/ev-view.c
index e6ad564..d5e7256 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -72,7 +72,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];
@@ -243,8 +245,6 @@ static double	zoom_for_size_best_fit 			     (gdouble doc_width,
 							      gdouble doc_height,
 							      int     target_width,
 							      int     target_height);
-static gboolean ev_view_can_zoom                             (EvView *view,
-                                                              gdouble factor);
 static void     ev_view_zoom                                 (EvView *view,
                                                               gdouble factor);
 static void     ev_view_zoom_for_size                        (EvView *view,
@@ -4554,6 +4554,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;
@@ -4789,6 +4795,22 @@ ev_view_class_init (EvViewClass *class)
 							       FALSE,
 							       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");
@@ -5285,6 +5307,31 @@ ev_view_sizing_mode_changed_cb (EvDocumentModel *model,
 		gtk_widget_queue_resize (GTK_WIDGET (view));
 }
 
+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 * ZOOM_IN_FACTOR) <= max_scale;
+	can_zoom_out = (view->scale * ZOOM_OUT_FACTOR) > 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");
+	}
+}
+
 #define EPSILON 0.0000001
 static void
 ev_view_scale_changed_cb (EvDocumentModel *model,
@@ -5301,6 +5348,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
@@ -5395,6 +5460,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);
@@ -5432,31 +5503,17 @@ ev_view_reload (EvView *view)
 }
 
 /*** Zoom and sizing mode ***/
-static gboolean
-ev_view_can_zoom (EvView *view, gdouble factor)
-{
-	gdouble scale = view->scale * factor;
-
-	if (factor == 1.0)
-		return TRUE;
-
-	else if (factor < 1.0)
-		return ev_document_model_get_min_scale (view->model) <= scale;
-
-	else
-		return scale <= ev_document_model_get_max_scale (view->model);
-}
 
 gboolean
 ev_view_can_zoom_in (EvView *view)
 {
-	return ev_view_can_zoom (view, ZOOM_IN_FACTOR);
+	return view->can_zoom_in;
 }
 
 gboolean
 ev_view_can_zoom_out (EvView *view)
 {
-	return ev_view_can_zoom (view, ZOOM_OUT_FACTOR);
+	return view->can_zoom_out;
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]