[evince] Use properties for can-zoom-in and -out
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] Use properties for can-zoom-in and -out
- Date: Thu, 20 Dec 2012 21:43:29 +0000 (UTC)
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]