[evince] Move setting limits on zoom into the view
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] Move setting limits on zoom into the view
- Date: Thu, 20 Dec 2012 21:43:24 +0000 (UTC)
commit 27a4b3e59b42b38b10bad2381efb87736b77418f
Author: William Jon McCann <jmccann redhat com>
Date: Wed Dec 19 12:17:06 2012 -0500
Move setting limits on zoom into the view
This allows the policy to be shared by all users of the view
from the library and makes it adapt correctly to changes in the
pixbuf cache.
https://bugzilla.gnome.org/show_bug.cgi?id=690510
libview/ev-document-model.c | 43 ++++++++++++++++++++++++++++++++--
libview/ev-view.c | 51 +++++++++++++++++++++++++++++++++++++++++
shell/ev-window.c | 53 +++++++++++++------------------------------
3 files changed, 107 insertions(+), 40 deletions(-)
---
diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c
index 0e8fbb9..3cef354 100644
--- a/libview/ev-document-model.c
+++ b/libview/ev-document-model.c
@@ -66,7 +66,9 @@ enum {
PROP_CONTINUOUS,
PROP_DUAL_PAGE,
PROP_DUAL_PAGE_ODD_LEFT,
- PROP_FULLSCREEN
+ PROP_FULLSCREEN,
+ PROP_MIN_SCALE,
+ PROP_MAX_SCALE
};
enum
@@ -79,6 +81,9 @@ static guint signals[N_SIGNALS] = { 0 };
G_DEFINE_TYPE (EvDocumentModel, ev_document_model, G_TYPE_OBJECT)
+#define DEFAULT_MIN_SCALE 0.25
+#define DEFAULT_MAX_SCALE 5.0
+
static void
ev_document_model_finalize (GObject *object)
{
@@ -116,6 +121,12 @@ ev_document_model_set_property (GObject *object,
case PROP_SCALE:
ev_document_model_set_scale (model, g_value_get_double (value));
break;
+ case PROP_MIN_SCALE:
+ ev_document_model_set_min_scale (model, g_value_get_double (value));
+ break;
+ case PROP_MAX_SCALE:
+ ev_document_model_set_max_scale (model, g_value_get_double (value));
+ break;
case PROP_SIZING_MODE:
ev_document_model_set_sizing_mode (model, g_value_get_enum (value));
break;
@@ -160,6 +171,12 @@ ev_document_model_get_property (GObject *object,
case PROP_SCALE:
g_value_set_double (value, model->scale);
break;
+ case PROP_MIN_SCALE:
+ g_value_set_double (value, model->min_scale);
+ break;
+ case PROP_MAX_SCALE:
+ g_value_set_double (value, model->max_scale);
+ break;
case PROP_SIZING_MODE:
g_value_set_enum (value, model->sizing_mode);
break;
@@ -231,6 +248,22 @@ ev_document_model_class_init (EvDocumentModelClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
g_object_class_install_property (g_object_class,
+ PROP_SCALE,
+ g_param_spec_double ("min-scale",
+ "Minimum Scale",
+ "Minium scale factor",
+ 0., G_MAXDOUBLE, DEFAULT_MIN_SCALE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (g_object_class,
+ PROP_SCALE,
+ g_param_spec_double ("max-scale",
+ "Maximum Scale",
+ "Maximum scale factor",
+ 0., G_MAXDOUBLE, DEFAULT_MAX_SCALE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (g_object_class,
PROP_SIZING_MODE,
g_param_spec_enum ("sizing-mode",
"Sizing Mode",
@@ -292,8 +325,8 @@ ev_document_model_init (EvDocumentModel *model)
model->sizing_mode = EV_SIZING_FIT_WIDTH;
model->continuous = TRUE;
model->inverted_colors = FALSE;
- model->min_scale = 0.;
- model->max_scale = G_MAXDOUBLE;
+ model->min_scale = DEFAULT_MIN_SCALE;
+ model->max_scale = DEFAULT_MAX_SCALE;
}
EvDocumentModel *
@@ -427,6 +460,8 @@ ev_document_model_set_max_scale (EvDocumentModel *model,
if (model->scale > max_scale)
ev_document_model_set_scale (model, max_scale);
+
+ g_object_notify (G_OBJECT (model), "max-scale");
}
gdouble
@@ -450,6 +485,8 @@ ev_document_model_set_min_scale (EvDocumentModel *model,
if (model->scale < min_scale)
ev_document_model_set_scale (model, min_scale);
+
+ g_object_notify (G_OBJECT (model), "min-scale");
}
gdouble
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 15927e1..e6ad564 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -94,6 +94,7 @@ typedef struct {
EvRectangle doc_rect;
} EvViewChild;
+#define MIN_SCALE 0.2
#define ZOOM_IN_FACTOR 1.2
#define ZOOM_OUT_FACTOR (1.0/ZOOM_IN_FACTOR)
@@ -4697,6 +4698,50 @@ ev_view_forall (GtkContainer *container,
}
static void
+view_update_scale_limits (EvView *view)
+{
+ gdouble min_width, min_height;
+ gdouble width, height;
+ gdouble max_scale;
+ gdouble dpi;
+ gint rotation;
+ GdkScreen *screen;
+
+ if (!view->model)
+ return;
+
+ rotation = ev_document_model_get_rotation (view->model);
+ screen = gtk_widget_get_screen (GTK_WIDGET (view));
+ dpi = ev_document_misc_get_screen_dpi (screen) / 72.0;
+
+ ev_document_get_min_page_size (view->document, &min_width, &min_height);
+ width = (rotation == 0 || rotation == 180) ? min_width : min_height;
+ height = (rotation == 0 || rotation == 180) ? min_height : min_width;
+ max_scale = sqrt (view->pixbuf_cache_size / (width * dpi * 4 * height * dpi));
+
+ ev_document_model_set_min_scale (view->model, MIN_SCALE * dpi);
+ ev_document_model_set_max_scale (view->model, max_scale * dpi);
+}
+
+static void
+ev_view_screen_changed (GtkWidget *widget,
+ GdkScreen *old_screen)
+{
+ EvView *view = EV_VIEW (widget);
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (widget);
+ if (screen == old_screen)
+ return;
+
+ view_update_scale_limits (view);
+
+ if (GTK_WIDGET_CLASS (ev_view_parent_class)->screen_changed) {
+ GTK_WIDGET_CLASS (ev_view_parent_class)->screen_changed (widget, old_screen);
+ }
+}
+
+static void
ev_view_class_init (EvViewClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
@@ -4729,6 +4774,7 @@ ev_view_class_init (EvViewClass *class)
widget_class->drag_motion = ev_view_drag_motion;
widget_class->popup_menu = ev_view_popup_menu;
widget_class->query_tooltip = ev_view_query_tooltip;
+ widget_class->screen_changed = ev_view_screen_changed;
container_class->remove = ev_view_remove;
container_class->forall = ev_view_forall;
@@ -5056,6 +5102,8 @@ ev_view_set_page_cache_size (EvView *view,
view->pixbuf_cache_size = cache_size;
if (view->pixbuf_cache)
ev_pixbuf_cache_set_max_size (view->pixbuf_cache, cache_size);
+
+ view_update_scale_limits (view);
}
void
@@ -5183,6 +5231,8 @@ ev_view_document_changed_cb (EvDocumentModel *model,
view->pending_scroll = SCROLL_TO_KEEP_POSITION;
gtk_widget_queue_resize (GTK_WIDGET (view));
}
+
+ view_update_scale_limits (view);
}
}
@@ -5203,6 +5253,7 @@ ev_view_rotation_changed_cb (EvDocumentModel *model,
}
ev_view_remove_all (view);
+ view_update_scale_limits (view);
if (rotation != 0)
clear_selection (view);
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 1683b2c..8fcc5c9 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -271,9 +271,6 @@ struct _EvWindowPrivate {
#define EV_TOOLBARS_FILENAME "evince-toolbar.xml"
-#define MIN_SCALE 0.05409
-#define PAGE_CACHE_SIZE 52428800 /* 50MB */
-
#define MAX_RECENT_ITEM_LEN (40)
#define TOOLBAR_RESOURCE_PATH "/org/gnome/evince/shell/ui/toolbar.xml"
@@ -362,7 +359,6 @@ static void ev_window_load_file_remote (EvWindow *ev_wi
static void ev_window_media_player_key_pressed (EvWindow *window,
const gchar *key,
gpointer user_data);
-static void ev_window_update_max_min_scale (EvWindow *window);
#ifdef ENABLE_DBUS
static void ev_window_emit_closed (EvWindow *window);
static void ev_window_emit_doc_loaded (EvWindow *window);
@@ -1566,8 +1562,6 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
g_object_unref (ev_window->priv->document);
ev_window->priv->document = g_object_ref (document);
- ev_window_update_max_min_scale (ev_window);
-
ev_window_set_message_area (ev_window, NULL);
if (ev_document_get_n_pages (document) <= 0) {
@@ -4332,34 +4326,6 @@ ev_window_setup_gtk_settings (EvWindow *window)
}
static void
-ev_window_update_max_min_scale (EvWindow *window)
-{
- gdouble dpi;
- GtkAction *action;
- gdouble min_width, min_height;
- gdouble width, height;
- gdouble max_scale;
- gint rotation = ev_document_model_get_rotation (window->priv->model);
-
- if (!window->priv->document)
- return;
-
- dpi = get_screen_dpi (window) / 72.0;
-
- ev_document_get_min_page_size (window->priv->document, &min_width, &min_height);
- width = (rotation == 0 || rotation == 180) ? min_width : min_height;
- height = (rotation == 0 || rotation == 180) ? min_height : min_width;
- max_scale = sqrt (PAGE_CACHE_SIZE / (width * dpi * 4 * height * dpi));
-
- action = gtk_action_group_get_action (window->priv->action_group,
- ZOOM_CONTROL_ACTION);
- ephy_zoom_action_set_max_zoom_level (EPHY_ZOOM_ACTION (action), max_scale);
-
- ev_document_model_set_min_scale (window->priv->model, MIN_SCALE * dpi);
- ev_document_model_set_max_scale (window->priv->model, max_scale * dpi);
-}
-
-static void
ev_window_screen_changed (GtkWidget *widget,
GdkScreen *old_screen)
{
@@ -4371,7 +4337,6 @@ ev_window_screen_changed (GtkWidget *widget,
return;
ev_window_setup_gtk_settings (window);
- ev_window_update_max_min_scale (window);
if (GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed) {
GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed (widget, old_screen);
@@ -4874,6 +4839,18 @@ ev_window_zoom_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWindow *
}
static void
+ev_window_max_zoom_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWindow *window)
+{
+ GtkAction *action;
+ gdouble max_scale;
+
+ max_scale = ev_document_model_get_max_scale (model);
+ action = gtk_action_group_get_action (window->priv->action_group,
+ ZOOM_CONTROL_ACTION);
+ ephy_zoom_action_set_max_zoom_level (EPHY_ZOOM_ACTION (action), max_scale);
+}
+
+static void
ev_window_update_continuous_action (EvWindow *window)
{
GtkAction *action;
@@ -4910,7 +4887,6 @@ ev_window_rotation_changed_cb (EvDocumentModel *model,
ev_metadata_set_int (window->priv->metadata, "rotation",
rotation);
- ev_window_update_max_min_scale (window);
ev_window_refresh_window_thumbnail (window);
}
@@ -7478,7 +7454,6 @@ ev_window_init (EvWindow *ev_window)
gtk_widget_show (ev_window->priv->view_box);
ev_window->priv->view = ev_view_new ();
- ev_view_set_page_cache_size (EV_VIEW (ev_window->priv->view), PAGE_CACHE_SIZE);
ev_view_set_model (EV_VIEW (ev_window->priv->view), ev_window->priv->model);
ev_window->priv->password_view = ev_password_view_new (GTK_WINDOW (ev_window));
@@ -7548,6 +7523,10 @@ ev_window_init (EvWindow *ev_window)
G_CALLBACK (ev_window_zoom_changed_cb),
ev_window);
g_signal_connect (ev_window->priv->model,
+ "notify::max-scale",
+ G_CALLBACK (ev_window_max_zoom_changed_cb),
+ ev_window);
+ g_signal_connect (ev_window->priv->model,
"notify::sizing-mode",
G_CALLBACK (ev_window_sizing_mode_changed_cb),
ev_window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]