diff options
author | Dan Nicholson <dbn.lists@gmail.com> | 2012-03-14 16:40:10 -0700 |
---|---|---|
committer | Dan Nicholson <dbn.lists@gmail.com> | 2012-03-14 16:40:10 -0700 |
commit | 9119ae9f4c28d34a5af094520dfa78dc19a42500 (patch) | |
tree | b8f4d2ee59286693c7c27ca26ae06c8ce33bdb77 /src | |
parent | c8bc352f60b5766d5143bb250542ca0d53d71c89 (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.c | 72 |
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, |