summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Nicholson <dbn.lists@gmail.com>2012-03-14 16:40:10 -0700
committerDan Nicholson <dbn.lists@gmail.com>2012-03-14 16:40:10 -0700
commit9119ae9f4c28d34a5af094520dfa78dc19a42500 (patch)
treeb8f4d2ee59286693c7c27ca26ae06c8ce33bdb77 /src
parentc8bc352f60b5766d5143bb250542ca0d53d71c89 (diff)
viewer: Add toggle buttons for setting the sizing mode
Set the sizing mode to Best Fit or Page Width just like evince. This needs a little dance to shut off the signal handlers when the mode gets set initially or otherwise outside of the buttons themselves.
Diffstat (limited to 'src')
-rw-r--r--src/evbp-viewer.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/evbp-viewer.c b/src/evbp-viewer.c
index 6434127..be7ae93 100644
--- a/src/evbp-viewer.c
+++ b/src/evbp-viewer.c
@@ -49,6 +49,22 @@ evbp_viewer_dispose(GObject *object)
}
static void
+evbp_viewer_zoom_best_fit(GtkToggleAction *action, EvbpViewer *viewer)
+{
+ ev_document_model_set_sizing_mode(viewer->model,
+ gtk_toggle_action_get_active(action) ?
+ EV_SIZING_BEST_FIT : EV_SIZING_FREE);
+}
+
+static void
+evbp_viewer_zoom_page_width(GtkToggleAction *action, EvbpViewer *viewer)
+{
+ ev_document_model_set_sizing_mode(viewer->model,
+ gtk_toggle_action_get_active(action) ?
+ EV_SIZING_FIT_WIDTH : EV_SIZING_FREE);
+}
+
+static void
evbp_viewer_previous_page(GtkAction *action, EvbpViewer *viewer)
{
ev_view_previous_page(EV_VIEW(viewer->view));
@@ -61,6 +77,40 @@ evbp_viewer_next_page(GtkAction *action, EvbpViewer *viewer)
}
static void
+sizing_mode_handler(GObject *gobject, GParamSpec *pspec, gpointer user_data)
+{
+ EvDocumentModel *model = EV_DOCUMENT_MODEL(gobject);
+ EvbpViewer *viewer = EVBP_VIEWER(user_data);
+ EvSizingMode mode;
+ GtkAction *action;
+
+ /* set toggle states based on model */
+ mode = ev_document_model_get_sizing_mode(model);
+
+ action = gtk_action_group_get_action(viewer->action_group,
+ "ViewBestFit");
+ g_signal_handlers_block_by_func(action,
+ G_CALLBACK(evbp_viewer_zoom_best_fit),
+ viewer);
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),
+ mode == EV_SIZING_BEST_FIT);
+ g_signal_handlers_unblock_by_func(action,
+ G_CALLBACK(evbp_viewer_zoom_best_fit),
+ viewer);
+
+ action = gtk_action_group_get_action(viewer->action_group,
+ "ViewPageWidth");
+ g_signal_handlers_block_by_func(action,
+ G_CALLBACK(evbp_viewer_zoom_page_width),
+ viewer);
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),
+ mode == EV_SIZING_FIT_WIDTH);
+ g_signal_handlers_unblock_by_func(action,
+ G_CALLBACK(evbp_viewer_zoom_page_width),
+ viewer);
+}
+
+static void
evbp_viewer_class_init(EvbpViewerClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS(class);
@@ -79,11 +129,25 @@ static const GtkActionEntry action_entries[] = {
G_CALLBACK(evbp_viewer_next_page) }
};
+static const GtkToggleActionEntry toggle_action_entries[] = {
+ { "ViewBestFit", EV_STOCK_ZOOM_PAGE,
+ "_Best Fit", NULL,
+ "Make the document fill the window",
+ G_CALLBACK(evbp_viewer_zoom_best_fit), FALSE },
+ { "ViewPageWidth", EV_STOCK_ZOOM_WIDTH,
+ "Fit Page _Width", NULL,
+ "Make the document fill the window width",
+ G_CALLBACK(evbp_viewer_zoom_page_width), FALSE }
+};
+
static const gchar ui_string[] =
"<ui>\n"
" <toolbar name=\"ViewerToolbar\">\n"
" <toolitem name=\"GoPreviousPage\" action=\"GoPreviousPage\"/>\n"
" <toolitem name=\"GoNextPage\" action=\"GoNextPage\"/>\n"
+ " <separator/>\n"
+ " <toolitem name=\"ViewBestFit\" action=\"ViewBestFit\"/>\n"
+ " <toolitem name=\"ViewPageWidth\" action=\"ViewPageWidth\"/>\n"
" </toolbar>\n"
"</ui>\n";
@@ -99,6 +163,10 @@ evbp_viewer_init(EvbpViewer *viewer)
viewer->action_group = gtk_action_group_new("ViewerActions");
gtk_action_group_add_actions(viewer->action_group, action_entries,
G_N_ELEMENTS(action_entries), viewer);
+ gtk_action_group_add_toggle_actions(viewer->action_group,
+ toggle_action_entries,
+ G_N_ELEMENTS(toggle_action_entries),
+ viewer);
gtk_action_group_set_sensitive(viewer->action_group, FALSE);
viewer->ui_manager = gtk_ui_manager_new();
@@ -116,6 +184,10 @@ evbp_viewer_init(EvbpViewer *viewer)
gtk_widget_show(toolbar);
viewer->model = ev_document_model_new();
+ sizing_mode_handler(G_OBJECT(viewer->model), NULL, viewer);
+ g_signal_connect(viewer->model, "notify::sizing-mode",
+ G_CALLBACK(sizing_mode_handler), viewer);
+
viewer->scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(viewer->scroll),
GTK_POLICY_AUTOMATIC,