diff --git a/mousepad/mousepad-settings.h b/mousepad/mousepad-settings.h index 4993045..60ba4c4 100644 --- a/mousepad/mousepad-settings.h +++ b/mousepad/mousepad-settings.h @@ -24,6 +24,7 @@ G_BEGIN_DECLS /* Setting names */ #define MOUSEPAD_SETTING_AUTO_INDENT "/preferences/view/auto-indent" #define MOUSEPAD_SETTING_FONT_NAME "/preferences/view/font-name" +#define MOUSEPAD_SETTING_ZOOM_LEVEL "/preferences/view/zoom-level" #define MOUSEPAD_SETTING_USE_DEFAULT_FONT "/preferences/view/use-default-monospace-font" #define MOUSEPAD_SETTING_SHOW_WHITESPACE "/preferences/view/show-whitespace" #define MOUSEPAD_SETTING_SHOW_LINE_ENDINGS "/preferences/view/show-line-endings" diff --git a/mousepad/mousepad-view.c b/mousepad/mousepad-view.c index 802f116..30ddec3 100644 --- a/mousepad/mousepad-view.c +++ b/mousepad/mousepad-view.c @@ -142,6 +142,7 @@ struct _MousepadView /* the font used in the view */ gchar *font_name; PangoFontDescription *font_desc; + gint zoom_level; /* whitespace visualization */ gboolean show_whitespace; @@ -158,6 +159,7 @@ enum { PROP_0, PROP_FONT_NAME, + PROP_ZOOM_LEVEL, PROP_SHOW_WHITESPACE, PROP_SHOW_LINE_ENDINGS, PROP_COLOR_SCHEME, @@ -201,6 +203,17 @@ mousepad_view_class_init (MousepadViewClass *klass) MOUSEPAD_VIEW_DEFAULT_FONT, G_PARAM_READWRITE)); + g_object_class_install_property ( + gobject_class, + PROP_ZOOM_LEVEL, + g_param_spec_int ("zoom-level", + "ZoomLevel", + "The level of zoom to use in the view", + 6, + 72, + 10, + G_PARAM_READWRITE)); + g_object_class_install_property ( gobject_class, PROP_SHOW_WHITESPACE, @@ -307,6 +320,7 @@ mousepad_view_init (MousepadView *view) view->color_scheme = g_strdup ("none"); view->font_name = NULL; view->font_desc = NULL; + view->zoom_level = 0; view->match_braces = FALSE; /* make sure any buffers set on the view get the color scheme applied to them */ @@ -330,6 +344,7 @@ mousepad_view_init (MousepadView *view) BIND_ (AUTO_INDENT, "auto-indent"); BIND_ (FONT_NAME, "font-name"); + BIND_ (ZOOM_LEVEL, "zoom-level"); BIND_ (SHOW_WHITESPACE, "show-whitespace"); BIND_ (SHOW_LINE_ENDINGS, "show-line-endings"); BIND_ (HIGHLIGHT_CURRENT_LINE, "highlight-current-line"); @@ -391,6 +406,9 @@ mousepad_view_set_property (GObject *object, case PROP_FONT_NAME: mousepad_view_set_font_name (view, g_value_get_string (value)); break; + case PROP_ZOOM_LEVEL: + mousepad_view_set_zoom_level (view, g_value_get_int (value)); + break; case PROP_SHOW_WHITESPACE: mousepad_view_set_show_whitespace (view, g_value_get_boolean (value)); break; @@ -427,6 +445,9 @@ mousepad_view_get_property (GObject *object, case PROP_FONT_NAME: g_value_set_string (value, mousepad_view_get_font_name (view)); break; + case PROP_ZOOM_LEVEL: + g_value_set_int (value, mousepad_view_get_zoom_level (view)); + break; case PROP_SHOW_WHITESPACE: g_value_set_boolean (value, mousepad_view_get_show_whitespace (view)); break; @@ -2641,17 +2662,16 @@ mousepad_view_set_font_name (MousepadView *view, { /* Save the normalized representation of the font as a string */ g_free (view->font_name); - view->font_name = pango_font_description_to_string (font_desc); /* save the font description for later updating */ pango_font_description_free (view->font_desc); + view->font_desc = font_desc; + view->font_name = pango_font_description_to_string (font_desc); + view->zoom_level = pango_font_description_get_size(font_desc) / PANGO_SCALE; /* apply either the default or this font depending on settings */ mousepad_view_update_font (view); - - /* Notify interested parties that the property has changed */ - g_object_notify (G_OBJECT (view), "font-name"); } else g_critical ("Invalid font-name given: %s", font_name); @@ -2717,10 +2737,18 @@ mousepad_view_update_font (MousepadView *view) font_desc = pango_font_description_from_string (MOUSEPAD_VIEW_DEFAULT_FONT); mousepad_view_override_font (view, font_desc); - pango_font_description_free (font_desc); + view->font_name = pango_font_description_to_string(font_desc); } else - mousepad_view_override_font (view, view->font_desc); + { + pango_font_description_set_size(view->font_desc, view->zoom_level * PANGO_SCALE); + mousepad_view_override_font (view, view->font_desc); + view->font_name = pango_font_description_to_string(view->font_desc); + } + + /* Notify interested parties that the property has changed */ + g_object_notify (G_OBJECT (view), "font-name"); + g_object_notify (G_OBJECT (view), "zoom-level"); } @@ -2733,6 +2761,41 @@ mousepad_view_get_font_name (MousepadView *view) return view->font_name; } +void mousepad_view_set_zoom_level(MousepadView *view, + gint zoom_level) +{ + g_return_if_fail (MOUSEPAD_IS_VIEW (view)); + + view->zoom_level = zoom_level; + mousepad_view_update_font(view); +} + +gint +mousepad_view_get_zoom_level(MousepadView *view) +{ + g_return_val_if_fail (MOUSEPAD_IS_VIEW (view), -1); + + return view->zoom_level; +} + +gint +mousepad_view_set_default_zoom_level(MousepadView *view) +{ + PangoFontDescription* font_desc; + gint zoom_level; + + g_return_val_if_fail (MOUSEPAD_IS_VIEW (view), -1); + + /* extract default zoom value and set it as view's zoom level */ + font_desc = pango_font_description_from_string(MOUSEPAD_VIEW_DEFAULT_FONT); + zoom_level = pango_font_description_get_size(font_desc) / PANGO_SCALE; + mousepad_view_set_zoom_level(view, zoom_level); + + /* cleanup */ + pango_font_description_free(font_desc); + + return zoom_level; +} void diff --git a/mousepad/mousepad-view.h b/mousepad/mousepad-view.h index 14c5fce..ae7c452 100644 --- a/mousepad/mousepad-view.h +++ b/mousepad/mousepad-view.h @@ -99,6 +99,13 @@ void mousepad_view_set_font_name (MousepadView *view const gchar *mousepad_view_get_font_name (MousepadView *view); +void mousepad_view_set_zoom_level (MousepadView *view, + gint zoom_level); + +gint mousepad_view_get_zoom_level (MousepadView *view); + +gint mousepad_view_set_default_zoom_level (MousepadView *view); + void mousepad_view_set_show_whitespace (MousepadView *view, gboolean show); diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml index 4eef0b3..f555c66 100644 --- a/mousepad/mousepad-window-ui.xml +++ b/mousepad/mousepad-window-ui.xml @@ -94,6 +94,10 @@ + + + + diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c index 9f33844..ff267e0 100644 --- a/mousepad/mousepad-window.c +++ b/mousepad/mousepad-window.c @@ -31,6 +31,7 @@ #include #include +#include #if GTK_CHECK_VERSION(3, 0, 0) #include @@ -325,6 +326,12 @@ static void mousepad_window_action_go_to_position (GtkAction MousepadWindow *window); static void mousepad_window_action_select_font (GtkAction *action, MousepadWindow *window); +static void mousepad_window_action_zoom_in (GtkAction *action, + MousepadWindow *window); +static void mousepad_window_action_zoom_out (GtkAction *action, + MousepadWindow *window); +static void mousepad_window_action_default_zoom (GtkAction *action, + MousepadWindow *window); static void mousepad_window_action_line_numbers (GtkToggleAction *action, MousepadWindow *window); static void mousepad_window_action_menubar (GtkToggleAction *action, @@ -465,6 +472,9 @@ static const GtkActionEntry action_entries[] = { "view-menu", NULL, N_("_View"), NULL, NULL, NULL, }, { "font", GTK_STOCK_SELECT_FONT, N_("Select F_ont..."), NULL, N_("Change the editor font"), G_CALLBACK (mousepad_window_action_select_font), }, + { "zoom-in", GTK_STOCK_ZOOM_IN, N_("Zoom in"), "plus", N_("Increase font size"), G_CALLBACK (mousepad_window_action_zoom_in), }, + { "zoom-out", GTK_STOCK_ZOOM_OUT, N_("Zoom out"), "minus", N_("Decrease font size"), G_CALLBACK (mousepad_window_action_zoom_out), }, + { "default-zoom", GTK_STOCK_ZOOM_100, N_("Default zoom"), "0", N_("Set zoom to default size"), G_CALLBACK (mousepad_window_action_default_zoom), }, { "color-scheme-menu", NULL, N_("_Color Scheme"), NULL, NULL, NULL, }, { "document-menu", NULL, N_("_Document"), NULL, NULL, NULL, }, @@ -5016,6 +5026,61 @@ mousepad_window_action_select_font (GtkAction *action, gtk_widget_destroy (dialog); } +static void +mousepad_window_action_zoom_in (GtkAction *action, + MousepadWindow *window) +{ + g_return_if_fail (MOUSEPAD_IS_WINDOW (window)); + g_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active)); + + gint zoom_level = mousepad_view_get_zoom_level(window->active->textview) + 2; + if (zoom_level > 72) + return; + + /* stop using default font */ + MOUSEPAD_SETTING_SET_BOOLEAN (USE_DEFAULT_FONT, FALSE); + + /* store new setting */ + MOUSEPAD_SETTING_SET_INT(ZOOM_LEVEL, zoom_level); + + /* update view */ + mousepad_view_set_zoom_level(window->active->textview, zoom_level); +} + +static void +mousepad_window_action_zoom_out (GtkAction *action, + MousepadWindow *window) +{ + g_return_if_fail (MOUSEPAD_IS_WINDOW (window)); + g_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active)); + + gint zoom_level = mousepad_view_get_zoom_level(window->active->textview) - 2; + if (zoom_level < 6) + return; + + /* stop using default font */ + MOUSEPAD_SETTING_SET_BOOLEAN (USE_DEFAULT_FONT, FALSE); + + /* store new setting */ + MOUSEPAD_SETTING_SET_INT(ZOOM_LEVEL, zoom_level); + + /* update view */ + mousepad_view_set_zoom_level(window->active->textview, zoom_level); +} + +static void +mousepad_window_action_default_zoom(GtkAction *action, + MousepadWindow *window) +{ + gint zoom_level; + + g_return_if_fail (MOUSEPAD_IS_WINDOW (window)); + g_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active)); + + zoom_level = mousepad_view_set_default_zoom_level(window->active->textview); + + MOUSEPAD_SETTING_SET_INT(ZOOM_LEVEL, zoom_level); +} static void diff --git a/mousepad/org.xfce.mousepad.gschema.xml b/mousepad/org.xfce.mousepad.gschema.xml index 105a14a..142c525 100644 --- a/mousepad/org.xfce.mousepad.gschema.xml +++ b/mousepad/org.xfce.mousepad.gschema.xml @@ -72,6 +72,14 @@ name 'Monospace'). + + + 10 + Zoom level + + The zoom level of the Mousepad text view. + + false Show whitespace