From 7f21f2854ad69786568558db9c5d87ba17aa921c Mon Sep 17 00:00:00 2001 From: bl0ckeduser Date: Sat, 8 Feb 2014 22:18:47 -0500 Subject: Implement window expand functionality (#53) --- cut-n-paste/zoom-control/ephy-zoom.c | 6 ++-- cut-n-paste/zoom-control/ephy-zoom.h | 4 ++- data/atril-ui.xml | 1 + shell/ev-window.c | 62 ++++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/cut-n-paste/zoom-control/ephy-zoom.c b/cut-n-paste/zoom-control/ephy-zoom.c index 83bb8291..bc456ecc 100644 --- a/cut-n-paste/zoom-control/ephy-zoom.c +++ b/cut-n-paste/zoom-control/ephy-zoom.c @@ -35,11 +35,13 @@ ephy_zoom_get_zoom_level_index (float level) return 0; } else if (level == EPHY_ZOOM_FIT_WIDTH) { return 1; + } else if (level == EPHY_ZOOM_EXPAND_WINDOW_TO_FIT) { + return 2; } - previous = zoom_levels[3].level; + previous = zoom_levels[4].level; - for (i = 4; i < n_zoom_levels; i++) + for (i = 5; i < n_zoom_levels; i++) { current = zoom_levels[i].level; mean = sqrt (previous * current); diff --git a/cut-n-paste/zoom-control/ephy-zoom.h b/cut-n-paste/zoom-control/ephy-zoom.h index 642e5ba9..1dcb4598 100644 --- a/cut-n-paste/zoom-control/ephy-zoom.h +++ b/cut-n-paste/zoom-control/ephy-zoom.h @@ -34,7 +34,8 @@ G_BEGIN_DECLS #define EPHY_ZOOM_BEST_FIT (-3.0) #define EPHY_ZOOM_FIT_WIDTH (-4.0) -#define EPHY_ZOOM_SEPARATOR (-5.0) +#define EPHY_ZOOM_EXPAND_WINDOW_TO_FIT (-5.0) +#define EPHY_ZOOM_SEPARATOR (-6.0) static const struct @@ -47,6 +48,7 @@ zoom_levels[] = { { N_("Best Fit"), EPHY_ZOOM_BEST_FIT }, { N_("Fit Page Width"), EPHY_ZOOM_FIT_WIDTH }, + { N_("Expand Window To Fit"), EPHY_ZOOM_EXPAND_WINDOW_TO_FIT }, { NULL, EPHY_ZOOM_SEPARATOR }, { N_("50%"), 0.5 }, { N_("70%"), 0.7071067811 }, diff --git a/data/atril-ui.xml b/data/atril-ui.xml index f8e750db..c35d1015 100644 --- a/data/atril-ui.xml +++ b/data/atril-ui.xml @@ -47,6 +47,7 @@ + diff --git a/shell/ev-window.c b/shell/ev-window.c index 1f989f85..703f5a3c 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -326,6 +326,8 @@ static void ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window); static void ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window); +static void ev_window_cmd_view_expand_window (GtkAction *action, + EvWindow *ev_window); static void view_handle_link_cb (EvView *view, EvLink *link, EvWindow *window); @@ -346,6 +348,10 @@ static void ev_window_emit_closed (EvWindow *window); static void ev_window_emit_doc_loaded (EvWindow *window); #endif +static void zoom_control_changed_cb (EphyZoomAction *action, + float zoom, + EvWindow *ev_window); + static guint ev_window_n_copies = 0; G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -447,6 +453,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) ev_window_set_action_sensitive (ev_window, "ViewReload", has_pages); ev_window_set_action_sensitive (ev_window, "ViewAutoscroll", has_pages); ev_window_set_action_sensitive (ev_window, "ViewInvertedColors", has_pages); + ev_window_set_action_sensitive (ev_window, "ViewExpandWindow", has_pages); /* Toolbar-specific actions: */ ev_window_set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages); @@ -4297,6 +4304,14 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) ev_window_reload_document (ev_window, NULL); } +static void +ev_window_cmd_view_expand_window (GtkAction *action, EvWindow *ev_window) +{ + g_return_if_fail (EV_IS_WINDOW (ev_window)); + + zoom_control_changed_cb (NULL, EPHY_ZOOM_EXPAND_WINDOW_TO_FIT, ev_window); +} + static void ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window) { @@ -5027,6 +5042,50 @@ zoom_control_changed_cb (EphyZoomAction *action, EvWindow *ev_window) { EvSizingMode mode; + GtkWindow *window; + gdouble doc_width, doc_height, scale; + gint old_width, old_height; + gint new_width, new_height; + + if (zoom == EPHY_ZOOM_EXPAND_WINDOW_TO_FIT) { + window = GTK_WINDOW (ev_window); + + ev_document_get_max_page_size (ev_window->priv->document, &doc_width, &doc_height); + scale = ev_document_model_get_scale (ev_window->priv->model); + + new_width = (gint)(doc_width * scale); + new_height = (gint)(doc_height * scale); + + /* + * If the sidebar, menu bar, or tool bars are open, + * we must account for their sizes in calculating + * the new expanded window size. + */ + if (ev_window->priv->chrome & EV_CHROME_SIDEBAR) + new_width += ev_window->priv->sidebar_thumbs->allocation.width; + + if (ev_window->priv->chrome & EV_CHROME_TOOLBAR) + new_height += GTK_WIDGET(ev_window->priv->toolbar)->allocation.height; + + if (ev_window->priv->chrome & EV_CHROME_MENUBAR) + new_height += GTK_WIDGET(ev_window->priv->menubar)->allocation.height; + + /* + * Add a little slack + */ + new_width += 50; + new_height += 50; + + /* + * Only resize if the old window isn't already + * big enough. + */ + gtk_window_get_size(window, &old_width, &old_height); + if (!(old_width >= new_width && old_height >= new_height)) + gtk_window_resize (window, new_width, new_height); + + return; + } if (zoom == EPHY_ZOOM_BEST_FIT) { mode = EV_SIZING_BEST_FIT; @@ -5450,6 +5509,9 @@ static const GtkActionEntry entries[] = { { "ViewReload", GTK_STOCK_REFRESH, N_("_Reload"), "R", N_("Reload the document"), G_CALLBACK (ev_window_cmd_view_reload) }, + { "ViewExpandWindow", GTK_STOCK_ZOOM_FIT, N_("_Expand Window to Fit"), "e", + N_("Expand Window to Fit"), + G_CALLBACK (ev_window_cmd_view_expand_window) }, { "ViewAutoscroll", GTK_STOCK_MEDIA_PLAY, N_("Auto_scroll"), NULL, NULL, G_CALLBACK (ev_window_cmd_view_autoscroll) }, -- cgit v1.2.1