[gtranslator/font-size] Font size change support




commit 6a743be255b9f6804b243cbbd967736c9d7fae61
Author: Daniel GarcĂ­a Moreno <dani danigm net>
Date:   Tue Sep 8 10:10:34 2020 +0200

    Font size change support
    
    This patch adds three new buttons to the interface to update the font
    size of the source view.
    
    The font-size setted there is stored in a new setting, so that change is
    persistent.
    
    Fix https://gitlab.gnome.org/GNOME/gtranslator/-/issues/120

 data/org.gnome.Gtranslator.gschema.xml.in |  3 +
 src/gtr-settings.c                        | 22 ++++++++
 src/gtr-settings.h                        |  1 +
 src/gtr-tab.c                             | 91 +++++++++++++++++++++++++++++++
 src/gtr-tab.ui                            | 82 ++++++++++++++++++++++++++++
 src/gtr-view.c                            | 24 ++++++++
 src/gtr-view.h                            |  2 +
 7 files changed, 225 insertions(+)
---
diff --git a/data/org.gnome.Gtranslator.gschema.xml.in b/data/org.gnome.Gtranslator.gschema.xml.in
index d054a866..690b5ec0 100644
--- a/data/org.gnome.Gtranslator.gschema.xml.in
+++ b/data/org.gnome.Gtranslator.gschema.xml.in
@@ -86,6 +86,9 @@
         If true, check the spelling of translated messages.
       </description>
     </key>
+    <key name="font-size" type="i">
+      <default>0</default>
+    </key>
   </schema>
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gtranslator.preferences.ui" 
path="/org/gnome/gtranslator/preferences/ui/">
     <key name="panel-switcher-style" enum="org.gnome.gtranslator.SwitcherStyle">
diff --git a/src/gtr-settings.c b/src/gtr-settings.c
index f24fdcec..eae56a7a 100644
--- a/src/gtr-settings.c
+++ b/src/gtr-settings.c
@@ -179,6 +179,25 @@ on_spellcheck_changed (GSettings * settings,
   g_list_free (views);
 }
 
+static void
+on_font_size_changed (GSettings * settings,
+                      const gchar * key, GtrSettings * gs)
+{
+  GList *views, *l;
+  int size;
+
+  size = g_settings_get_int (settings, key);
+
+  views = gtr_application_get_views (GTR_APP, TRUE, TRUE);
+
+  for (l = views; l != NULL; l = g_list_next (l))
+    {
+      gtr_view_set_font_size (GTR_VIEW (l->data), size);
+    }
+
+  g_list_free (views);
+}
+
 static void
 on_scheme_changed (GSettings * settings, const gchar * key, GtrSettings * gs)
 {
@@ -227,6 +246,9 @@ gtr_settings_init (GtrSettings * gs)
   g_signal_connect (priv->ui,
                     "changed::color-scheme",
                     G_CALLBACK (on_scheme_changed), gs);
+  g_signal_connect (priv->editor,
+                    "changed::font-size",
+                    G_CALLBACK (on_font_size_changed), gs);
 }
 
 static void
diff --git a/src/gtr-settings.h b/src/gtr-settings.h
index 343696c1..c0bccee0 100644
--- a/src/gtr-settings.h
+++ b/src/gtr-settings.h
@@ -65,6 +65,7 @@ GSettings               *gtr_settings_new                       (void);
 #define GTR_SETTINGS_VISIBLE_WHITESPACE                        "visible-whitespace"
 #define GTR_SETTINGS_UNMARK_FUZZY_WHEN_CHANGED         "unmark-fuzzy-when-changed"
 #define GTR_SETTINGS_SPELLCHECK                                "spellcheck"
+#define GTR_SETTINGS_FONT_SIZE                         "font-size"
 #define GTR_SETTINGS_PANEL_SWITCHER_STYLE              "panel-switcher-style"
 #define GTR_SETTINGS_COLOR_SCHEME                      "color-scheme"
 #define GTR_SETTINGS_SORT_ORDER                                "sort-order"
diff --git a/src/gtr-tab.c b/src/gtr-tab.c
index 2f864e6b..712cb136 100644
--- a/src/gtr-tab.c
+++ b/src/gtr-tab.c
@@ -119,6 +119,12 @@ typedef struct
   GtkRevealer    *search_revealer;
   GtrSearchBar   *search_bar;
   GtkSearchEntry *search;
+
+  /* Text zoom */
+  GtkWidget *zoom_in;
+  GtkWidget *zoom_original;
+  GtkWidget *zoom_out;
+
 } GtrTabPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtrTab, gtr_tab, GTK_TYPE_BOX)
@@ -144,6 +150,35 @@ static guint signals[LAST_SIGNAL];
 
 static gboolean gtr_tab_autosave (GtrTab * tab);
 
+static int DEFAULT_FONT_SIZE = 18;
+
+static void
+update_default_font_size () {
+  gchar **font_parts = NULL;
+  int i = 0;
+  g_autofree char *font = NULL;
+  g_autoptr(GSettings) settings = NULL;
+  g_autoptr(GSettingsSchema) schema = NULL;
+  GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
+
+  DEFAULT_FONT_SIZE = 12;
+
+  schema = g_settings_schema_source_lookup (source, "org.gnome.desktop.interface", TRUE);
+  if (!schema || !g_settings_schema_has_key (schema, "font-name"))
+    return;
+
+  settings = g_settings_new ("org.gnome.desktop.interface");
+  font = g_settings_get_string (settings, "font-name");
+  font_parts = g_strsplit (font, " ", -1);
+
+  while (font_parts[i])
+    i++;
+
+  DEFAULT_FONT_SIZE = atoi (font_parts[i ? i - 1 : 0]);
+
+  g_strfreev (font_parts);
+}
+
 //---------------------------Search Bar Revealer------------------//
 
 void
@@ -226,6 +261,50 @@ gtr_page_notify_child_revealed (GtrTab *tab,
 
 //----------------------------------------------------------------//
 
+static gboolean
+zoom_in (GtkWidget *widget, GtrTab *tab)
+{
+  GtrTabPrivate *priv;
+  int size;
+
+  priv = gtr_tab_get_instance_private (tab);
+
+  size = g_settings_get_int (priv->editor_settings, GTR_SETTINGS_FONT_SIZE);
+  size = size == 0 ? DEFAULT_FONT_SIZE : size;
+
+  if (size <= 32)
+    g_settings_set_int (priv->editor_settings, GTR_SETTINGS_FONT_SIZE, size + 1);
+
+  return TRUE;
+}
+
+static gboolean
+zoom_original (GtkWidget *widget, GtrTab *tab)
+{
+  GtrTabPrivate *priv;
+
+  priv = gtr_tab_get_instance_private (tab);
+  g_settings_set_int (priv->editor_settings, GTR_SETTINGS_FONT_SIZE, 0);
+
+  return TRUE;
+}
+
+static gboolean
+zoom_out (GtkWidget *widget, GtrTab *tab)
+{
+  GtrTabPrivate *priv;
+  int size;
+
+  priv = gtr_tab_get_instance_private (tab);
+
+  size = g_settings_get_int (priv->editor_settings, GTR_SETTINGS_FONT_SIZE);
+  size = size == 0 ? DEFAULT_FONT_SIZE : size;
+
+  if (size >= 4)
+    g_settings_set_int (priv->editor_settings, GTR_SETTINGS_FONT_SIZE, size - 1);
+
+  return TRUE;
+}
 
 static gboolean
 show_hide_revealer (GtkWidget *widget, GdkEvent *ev, GtrTab *tab)
@@ -774,6 +853,15 @@ gtr_tab_init (GtrTab * tab)
 
   g_signal_connect (priv->progress_eventbox, "button-press-event",
                     G_CALLBACK (show_hide_revealer), tab);
+
+  update_default_font_size();
+
+  g_signal_connect (priv->zoom_in, "clicked",
+                    G_CALLBACK (zoom_in), tab);
+  g_signal_connect (priv->zoom_original, "clicked",
+                    G_CALLBACK (zoom_original), tab);
+  g_signal_connect (priv->zoom_out, "clicked",
+                    G_CALLBACK (zoom_out), tab);
 }
 
 static void
@@ -959,6 +1047,9 @@ gtr_tab_class_init (GtrTabClass * klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtrTab, overlay);
   gtk_widget_class_bind_template_child_private (widget_class, GtrTab, search_bar);
   gtk_widget_class_bind_template_child_private (widget_class, GtrTab, search_revealer);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrTab, zoom_in);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrTab, zoom_original);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrTab, zoom_out);
   gtk_widget_class_bind_template_callback (widget_class, gtr_page_notify_child_revealed);
   gtk_widget_class_bind_template_callback (widget_class, gtr_page_stop_search);
 
diff --git a/src/gtr-tab.ui b/src/gtr-tab.ui
index 49a144c9..910c984e 100644
--- a/src/gtr-tab.ui
+++ b/src/gtr-tab.ui
@@ -110,6 +110,88 @@
                                           </style>
                                        </object>
                                     </child>
+
+                                    <child>
+                                      <object class="GtkButtonBox">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="layout_style">start</property>
+                                        <property name="halign">end</property>
+                                        <style>
+                                         <class name="linked"/>
+                                         <class name="horizontal"/>
+                                        </style>
+                                        <child>
+                                          <object class="GtkButton" id="zoom_in">
+                                            <property name="tooltip_text" translatable="yes">Increase font 
size</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="icon_name">zoom-in-symbolic</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">0</property>
+                                            <property name="non_homogeneous">True</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="zoom_original">
+                                            <property name="tooltip_text" translatable="yes">Set default 
font size</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="icon_name">zoom-original-symbolic</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">1</property>
+                                            <property name="non_homogeneous">True</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkButton" id="zoom_out">
+                                            <property name="tooltip_text" translatable="yes">Decrease font 
size</property>
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="receives_default">True</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="icon_name">zoom-out-symbolic</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">2</property>
+                                            <property name="non_homogeneous">True</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">4</property>
+                                      </packing>
+                                    </child>
+
                                  </object>
                                  <packing>
                                     <property name="expand">False</property>
diff --git a/src/gtr-view.c b/src/gtr-view.c
index 2c53cfb5..55d4815f 100644
--- a/src/gtr-view.c
+++ b/src/gtr-view.c
@@ -91,6 +91,7 @@ typedef struct
   gchar *search_text;
 
   GspellChecker *spell;
+  GtkCssProvider *provider;
 } GtrViewPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtrView, gtr_view, GTK_SOURCE_TYPE_VIEW)
@@ -108,6 +109,11 @@ gtr_view_init (GtrView * view)
 
   priv = gtr_view_get_instance_private (view);
 
+  priv->provider = gtk_css_provider_new ();
+  gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (view)),
+                                  GTK_STYLE_PROVIDER (priv->provider),
+                                  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
   priv->spell = NULL;
   priv->editor_settings = g_settings_new ("org.gnome.gtranslator.preferences.editor");
   priv->ui_settings = g_settings_new ("org.gnome.gtranslator.preferences.ui");
@@ -144,6 +150,9 @@ gtr_view_init (GtrView * view)
                                       g_settings_get_boolean (priv->editor_settings,
                                                               GTR_SETTINGS_VISIBLE_WHITESPACE));
 
+  gtr_view_set_font_size (view, g_settings_get_int (priv->editor_settings,
+                                                    GTR_SETTINGS_FONT_SIZE));
+
   /* Set scheme color according to preferences */
   gtr_view_reload_scheme_color (view);
   gtk_text_view_set_monospace (GTK_TEXT_VIEW (view), TRUE);
@@ -160,6 +169,7 @@ gtr_view_dispose (GObject * object)
   g_clear_object (&priv->editor_settings);
   g_clear_object (&priv->ui_settings);
   g_clear_object (&priv->spell);
+  g_object_unref (&priv->provider);
 
   G_OBJECT_CLASS (gtr_view_parent_class)->dispose (object);
 }
@@ -898,3 +908,17 @@ gtr_view_reload_scheme_color (GtrView * view)
 
   gtk_source_buffer_set_style_scheme (buf, scheme);
 }
+
+void
+gtr_view_set_font_size (GtrView *view, int size)
+{
+  g_autofree char *css = NULL;
+  GtrViewPrivate *priv = gtr_view_get_instance_private (view);
+
+  if (size == 0)
+    css = g_strdup ("textview { }");
+  else
+    css = g_strdup_printf ("textview { font-size: %dpt; }", size);
+
+  gtk_css_provider_load_from_data (priv->provider, css, -1, NULL);
+}
diff --git a/src/gtr-view.h b/src/gtr-view.h
index 87ee0e3d..6c8d56e7 100644
--- a/src/gtr-view.h
+++ b/src/gtr-view.h
@@ -115,6 +115,8 @@ gtr_view_get_type (void)
      void gtr_view_set_language (GtrView *view,
                                  const gchar *lang);
 
+     void gtr_view_set_font_size (GtrView *view, int size);
+
 
 /* Search macros */
 #define GTR_SEARCH_IS_DONT_SET_FLAGS(sflags) ((sflags & GTR_SEARCH_DONT_SET_FLAGS) != 0)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]