[tepl] SpaceDrawerPrefs: create class



commit 3e1e0a1cd024a3bde09ff65bc4b7fe219a5388ee
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Sep 20 17:01:08 2020 +0200

    SpaceDrawerPrefs: create class

 docs/reference/tepl-docs.xml     |   1 +
 docs/reference/tepl-sections.txt |  17 +++
 po/POTFILES.in                   |   1 +
 tepl/meson.build                 |   2 +
 tepl/tepl-space-drawer-prefs.c   | 309 +++++++++++++++++++++++++++++++++++++++
 tepl/tepl-space-drawer-prefs.h   |  53 +++++++
 tepl/tepl.h                      |   1 +
 7 files changed, 384 insertions(+)
---
diff --git a/docs/reference/tepl-docs.xml b/docs/reference/tepl-docs.xml
index a79c404..63eeb1a 100644
--- a/docs/reference/tepl-docs.xml
+++ b/docs/reference/tepl-docs.xml
@@ -67,6 +67,7 @@
       <xi:include href="xml/info-bar.xml"/>
       <xi:include href="xml/iter.xml"/>
       <xi:include href="xml/panel.xml"/>
+      <xi:include href="xml/space-drawer-prefs.xml"/>
       <xi:include href="xml/statusbar.xml"/>
       <xi:include href="xml/style-scheme-chooser-widget.xml"/>
       <xi:include href="xml/utils.xml"/>
diff --git a/docs/reference/tepl-sections.txt b/docs/reference/tepl-sections.txt
index a17011d..9400709 100644
--- a/docs/reference/tepl-sections.txt
+++ b/docs/reference/tepl-sections.txt
@@ -328,6 +328,23 @@ TeplPanelPrivate
 tepl_panel_get_type
 </SECTION>
 
+<SECTION>
+<FILE>space-drawer-prefs</FILE>
+TeplSpaceDrawerPrefs
+tepl_space_drawer_prefs_new
+tepl_space_drawer_prefs_get_space_drawer
+<SUBSECTION Standard>
+TEPL_IS_SPACE_DRAWER_PREFS
+TEPL_IS_SPACE_DRAWER_PREFS_CLASS
+TEPL_SPACE_DRAWER_PREFS
+TEPL_SPACE_DRAWER_PREFS_CLASS
+TEPL_SPACE_DRAWER_PREFS_GET_CLASS
+TEPL_TYPE_SPACE_DRAWER_PREFS
+TeplSpaceDrawerPrefsClass
+TeplSpaceDrawerPrefsPrivate
+tepl_space_drawer_prefs_get_type
+</SECTION>
+
 <SECTION>
 <FILE>statusbar</FILE>
 TeplStatusbar
diff --git a/po/POTFILES.in b/po/POTFILES.in
index af736ae..e3e549f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -22,6 +22,7 @@ tepl/tepl-metadata-parser.c
 tepl/tepl-notebook.c
 tepl/tepl-panel.c
 tepl/tepl-signal-group.c
+tepl/tepl-space-drawer-prefs.c
 tepl/tepl-statusbar.c
 tepl/tepl-style-scheme-chooser-widget.c
 tepl/tepl-tab.c
diff --git a/tepl/meson.build b/tepl/meson.build
index 93ca1c5..0075478 100644
--- a/tepl/meson.build
+++ b/tepl/meson.build
@@ -21,6 +21,7 @@ tepl_public_headers = [
   'tepl-metadata-manager.h',
   'tepl-notebook.h',
   'tepl-panel.h',
+  'tepl-space-drawer-prefs.h',
   'tepl-statusbar.h',
   'tepl-style-scheme-chooser-widget.h',
   'tepl-tab.h',
@@ -53,6 +54,7 @@ tepl_public_c_files = [
   'tepl-metadata-manager.c',
   'tepl-notebook.c',
   'tepl-panel.c',
+  'tepl-space-drawer-prefs.c',
   'tepl-statusbar.c',
   'tepl-style-scheme-chooser-widget.c',
   'tepl-tab.c',
diff --git a/tepl/tepl-space-drawer-prefs.c b/tepl/tepl-space-drawer-prefs.c
new file mode 100644
index 0000000..70a8f33
--- /dev/null
+++ b/tepl/tepl-space-drawer-prefs.c
@@ -0,0 +1,309 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#include "config.h"
+#include "tepl-space-drawer-prefs.h"
+#include <glib/gi18n-lib.h>
+
+/**
+ * SECTION:space-drawer-prefs
+ * @Short_description: Preferences widget for #GtkSourceSpaceDrawer
+ * @Title: TeplSpaceDrawerPrefs
+ *
+ * #TeplSpaceDrawerPrefs is a #GtkWidget for configuring the preferences about
+ * white space drawing with #GtkSourceSpaceDrawer.
+ *
+ * The configuration is stored in the #GtkSourceSpaceDrawer:matrix property of
+ * the associated #GtkSourceSpaceDrawer object.
+ */
+
+struct _TeplSpaceDrawerPrefsPrivate
+{
+       /* Owned */
+       GtkSourceSpaceDrawer *space_drawer;
+
+       GtkCheckButton *check_button_leading_tabs;
+       GtkCheckButton *check_button_leading_spaces;
+       GtkCheckButton *check_button_inside_text_tabs;
+       GtkCheckButton *check_button_inside_text_spaces;
+       GtkCheckButton *check_button_trailing_tabs;
+       GtkCheckButton *check_button_trailing_spaces;
+       GtkCheckButton *check_button_newlines;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (TeplSpaceDrawerPrefs, tepl_space_drawer_prefs, GTK_TYPE_GRID)
+
+static void matrix_notify_cb (GtkSourceSpaceDrawer *space_drawer,
+                             GParamSpec           *pspec,
+                             TeplSpaceDrawerPrefs *prefs);
+
+static void
+tepl_space_drawer_prefs_dispose (GObject *object)
+{
+       TeplSpaceDrawerPrefs *prefs = TEPL_SPACE_DRAWER_PREFS (object);
+
+       g_clear_object (&prefs->priv->space_drawer);
+
+       G_OBJECT_CLASS (tepl_space_drawer_prefs_parent_class)->dispose (object);
+}
+
+static void
+tepl_space_drawer_prefs_class_init (TeplSpaceDrawerPrefsClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->dispose = tepl_space_drawer_prefs_dispose;
+}
+
+static void
+set_matrix_state_according_to_check_buttons (TeplSpaceDrawerPrefs *prefs)
+{
+       GtkSourceSpaceTypeFlags space_types;
+
+       g_signal_handlers_block_by_func (prefs->priv->space_drawer, matrix_notify_cb, prefs);
+
+       space_types = GTK_SOURCE_SPACE_TYPE_NBSP;
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_leading_tabs)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_TAB;
+       }
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_leading_spaces)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_SPACE;
+       }
+       gtk_source_space_drawer_set_types_for_locations (prefs->priv->space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_LEADING,
+                                                        space_types);
+
+       space_types = GTK_SOURCE_SPACE_TYPE_NBSP;
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_inside_text_tabs)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_TAB;
+       }
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_inside_text_spaces)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_SPACE;
+       }
+       gtk_source_space_drawer_set_types_for_locations (prefs->priv->space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_INSIDE_TEXT,
+                                                        space_types);
+
+       space_types = GTK_SOURCE_SPACE_TYPE_NBSP;
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_trailing_tabs)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_TAB;
+       }
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_trailing_spaces)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_SPACE;
+       }
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (prefs->priv->check_button_newlines)))
+       {
+               space_types |= GTK_SOURCE_SPACE_TYPE_NEWLINE;
+       }
+       gtk_source_space_drawer_set_types_for_locations (prefs->priv->space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_TRAILING,
+                                                        space_types);
+
+       g_signal_handlers_unblock_by_func (prefs->priv->space_drawer, matrix_notify_cb, prefs);
+}
+
+static void
+check_button_toggled_cb (GtkCheckButton       *check_button,
+                        TeplSpaceDrawerPrefs *prefs)
+{
+       set_matrix_state_according_to_check_buttons (prefs);
+}
+
+static void
+set_check_button_state (TeplSpaceDrawerPrefs *prefs,
+                       GtkCheckButton       *check_button,
+                       gboolean              is_active)
+{
+       g_signal_handlers_block_by_func (check_button, check_button_toggled_cb, prefs);
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), is_active);
+       g_signal_handlers_unblock_by_func (check_button, check_button_toggled_cb, prefs);
+}
+
+static void
+set_check_buttons_state_according_to_matrix (TeplSpaceDrawerPrefs *prefs)
+{
+       GtkSourceSpaceTypeFlags space_types;
+
+       space_types = gtk_source_space_drawer_get_types_for_locations (prefs->priv->space_drawer,
+                                                                      GTK_SOURCE_SPACE_LOCATION_LEADING);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_leading_tabs,
+                               space_types & GTK_SOURCE_SPACE_TYPE_TAB);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_leading_spaces,
+                               space_types & GTK_SOURCE_SPACE_TYPE_SPACE);
+
+       space_types = gtk_source_space_drawer_get_types_for_locations (prefs->priv->space_drawer,
+                                                                      GTK_SOURCE_SPACE_LOCATION_INSIDE_TEXT);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_inside_text_tabs,
+                               space_types & GTK_SOURCE_SPACE_TYPE_TAB);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_inside_text_spaces,
+                               space_types & GTK_SOURCE_SPACE_TYPE_SPACE);
+
+       space_types = gtk_source_space_drawer_get_types_for_locations (prefs->priv->space_drawer,
+                                                                      GTK_SOURCE_SPACE_LOCATION_TRAILING);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_trailing_tabs,
+                               space_types & GTK_SOURCE_SPACE_TYPE_TAB);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_trailing_spaces,
+                               space_types & GTK_SOURCE_SPACE_TYPE_SPACE);
+       set_check_button_state (prefs,
+                               prefs->priv->check_button_newlines,
+                               space_types & GTK_SOURCE_SPACE_TYPE_NEWLINE);
+}
+
+static GtkCheckButton *
+create_check_button (TeplSpaceDrawerPrefs *prefs,
+                    const gchar          *label)
+{
+       GtkCheckButton *check_button;
+
+       check_button = GTK_CHECK_BUTTON (gtk_check_button_new_with_label (label));
+       gtk_widget_set_margin_start (GTK_WIDGET (check_button), 6);
+
+       g_signal_connect (check_button,
+                         "toggled",
+                         G_CALLBACK (check_button_toggled_cb),
+                         prefs);
+
+       return check_button;
+}
+
+static void
+init_check_buttons (TeplSpaceDrawerPrefs *prefs)
+{
+       prefs->priv->check_button_leading_tabs = create_check_button (prefs, _("Draw tabs"));
+       prefs->priv->check_button_leading_spaces = create_check_button (prefs, _("Draw spaces"));
+       prefs->priv->check_button_inside_text_tabs = create_check_button (prefs, _("Draw tabs"));
+       prefs->priv->check_button_inside_text_spaces = create_check_button (prefs, _("Draw spaces"));
+       prefs->priv->check_button_trailing_tabs = create_check_button (prefs, _("Draw tabs"));
+       prefs->priv->check_button_trailing_spaces = create_check_button (prefs, _("Draw spaces"));
+       prefs->priv->check_button_newlines = create_check_button (prefs, _("Draw new lines"));
+
+       set_check_buttons_state_according_to_matrix (prefs);
+}
+
+static GtkWidget *
+create_subtitle_label (const gchar *str)
+{
+       gchar *str_escaped;
+       gchar *str_in_bold;
+       GtkWidget *label;
+
+       str_escaped = g_markup_escape_text (str, -1);
+       str_in_bold = g_strdup_printf ("<b>%s</b>", str_escaped);
+
+       label = gtk_label_new (str_in_bold);
+       gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+       gtk_widget_set_halign (label, GTK_ALIGN_START);
+
+       g_free (str_escaped);
+       g_free (str_in_bold);
+
+       return label;
+}
+
+static void
+add_check_buttons (TeplSpaceDrawerPrefs *prefs)
+{
+       GtkContainer *vgrid;
+
+       init_check_buttons (prefs);
+
+       vgrid = GTK_CONTAINER (gtk_grid_new ());
+       gtk_orientable_set_orientation (GTK_ORIENTABLE (vgrid), GTK_ORIENTATION_VERTICAL);
+       gtk_grid_set_row_spacing (GTK_GRID (vgrid), 6);
+
+       gtk_container_add (vgrid, create_subtitle_label (_("Leading Spaces")));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_leading_tabs));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_leading_spaces));
+
+       gtk_container_add (vgrid, create_subtitle_label (_("Spaces Inside Text")));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_inside_text_tabs));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_inside_text_spaces));
+
+       gtk_container_add (vgrid, create_subtitle_label (_("Trailing Spaces")));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_trailing_tabs));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_trailing_spaces));
+       gtk_container_add (vgrid, GTK_WIDGET (prefs->priv->check_button_newlines));
+
+       gtk_widget_show_all (GTK_WIDGET (vgrid));
+       gtk_container_add (GTK_CONTAINER (prefs), GTK_WIDGET (vgrid));
+}
+
+static void
+matrix_notify_cb (GtkSourceSpaceDrawer *space_drawer,
+                 GParamSpec           *pspec,
+                 TeplSpaceDrawerPrefs *prefs)
+{
+       set_check_buttons_state_according_to_matrix (prefs);
+}
+
+static void
+tepl_space_drawer_prefs_init (TeplSpaceDrawerPrefs *prefs)
+{
+       prefs->priv = tepl_space_drawer_prefs_get_instance_private (prefs);
+
+       gtk_orientable_set_orientation (GTK_ORIENTABLE (prefs), GTK_ORIENTATION_HORIZONTAL);
+       gtk_grid_set_column_spacing (GTK_GRID (prefs), 12);
+
+       g_object_set (prefs,
+                     "margin", 6,
+                     NULL);
+
+       prefs->priv->space_drawer = gtk_source_space_drawer_new ();
+       gtk_source_space_drawer_set_enable_matrix (prefs->priv->space_drawer, TRUE);
+       gtk_source_space_drawer_set_types_for_locations (prefs->priv->space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_ALL,
+                                                        GTK_SOURCE_SPACE_TYPE_ALL &
+                                                        ~GTK_SOURCE_SPACE_TYPE_NEWLINE);
+
+       add_check_buttons (prefs);
+
+       g_signal_connect_object (prefs->priv->space_drawer,
+                                "notify::matrix",
+                                G_CALLBACK (matrix_notify_cb),
+                                prefs,
+                                0);
+}
+
+/**
+ * tepl_space_drawer_prefs_new:
+ *
+ * Returns: (transfer floating): a new #TeplSpaceDrawerPrefs.
+ * Since: 5.2
+ */
+TeplSpaceDrawerPrefs *
+tepl_space_drawer_prefs_new (void)
+{
+       return g_object_new (TEPL_TYPE_SPACE_DRAWER_PREFS, NULL);
+}
+
+/**
+ * tepl_space_drawer_prefs_get_space_drawer:
+ * @prefs: a #TeplSpaceDrawerPrefs.
+ *
+ * Gets the #GtkSourceSpaceDrawer associated with @prefs. The returned object is
+ * guaranteed to be the same for the lifetime of @prefs. Each
+ * #TeplSpaceDrawerPrefs object has a different #GtkSourceSpaceDrawer.
+ *
+ * Returns: (transfer none): the #GtkSourceSpaceDrawer associated with @prefs.
+ * Since: 5.2
+ */
+GtkSourceSpaceDrawer *
+tepl_space_drawer_prefs_get_space_drawer (TeplSpaceDrawerPrefs *prefs)
+{
+       g_return_val_if_fail (TEPL_IS_SPACE_DRAWER_PREFS (prefs), NULL);
+
+       return prefs->priv->space_drawer;
+}
diff --git a/tepl/tepl-space-drawer-prefs.h b/tepl/tepl-space-drawer-prefs.h
new file mode 100644
index 0000000..5fcd309
--- /dev/null
+++ b/tepl/tepl-space-drawer-prefs.h
@@ -0,0 +1,53 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#ifndef TEPL_SPACE_DRAWER_PREFS_H
+#define TEPL_SPACE_DRAWER_PREFS_H
+
+#if !defined (TEPL_H_INSIDE) && !defined (TEPL_COMPILATION)
+#error "Only <tepl/tepl.h> can be included directly."
+#endif
+
+#include <gtksourceview/gtksource.h>
+#include <tepl/tepl-macros.h>
+
+G_BEGIN_DECLS
+
+#define TEPL_TYPE_SPACE_DRAWER_PREFS             (tepl_space_drawer_prefs_get_type ())
+#define TEPL_SPACE_DRAWER_PREFS(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
TEPL_TYPE_SPACE_DRAWER_PREFS, TeplSpaceDrawerPrefs))
+#define TEPL_SPACE_DRAWER_PREFS_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
TEPL_TYPE_SPACE_DRAWER_PREFS, TeplSpaceDrawerPrefsClass))
+#define TEPL_IS_SPACE_DRAWER_PREFS(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
TEPL_TYPE_SPACE_DRAWER_PREFS))
+#define TEPL_IS_SPACE_DRAWER_PREFS_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
TEPL_TYPE_SPACE_DRAWER_PREFS))
+#define TEPL_SPACE_DRAWER_PREFS_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
TEPL_TYPE_SPACE_DRAWER_PREFS, TeplSpaceDrawerPrefsClass))
+
+typedef struct _TeplSpaceDrawerPrefs         TeplSpaceDrawerPrefs;
+typedef struct _TeplSpaceDrawerPrefsClass    TeplSpaceDrawerPrefsClass;
+typedef struct _TeplSpaceDrawerPrefsPrivate  TeplSpaceDrawerPrefsPrivate;
+
+struct _TeplSpaceDrawerPrefs
+{
+       GtkGrid parent;
+
+       TeplSpaceDrawerPrefsPrivate *priv;
+};
+
+struct _TeplSpaceDrawerPrefsClass
+{
+       GtkGridClass parent_class;
+
+       gpointer padding[12];
+};
+
+_TEPL_EXTERN
+GType                  tepl_space_drawer_prefs_get_type                (void);
+
+_TEPL_EXTERN
+TeplSpaceDrawerPrefs * tepl_space_drawer_prefs_new                     (void);
+
+_TEPL_EXTERN
+GtkSourceSpaceDrawer * tepl_space_drawer_prefs_get_space_drawer        (TeplSpaceDrawerPrefs *prefs);
+
+G_END_DECLS
+
+#endif /* TEPL_SPACE_DRAWER_PREFS_H */
diff --git a/tepl/tepl.h b/tepl/tepl.h
index 6bfe55c..6c3e3fd 100644
--- a/tepl/tepl.h
+++ b/tepl/tepl.h
@@ -32,6 +32,7 @@
 #include <tepl/tepl-metadata-manager.h>
 #include <tepl/tepl-notebook.h>
 #include <tepl/tepl-panel.h>
+#include <tepl/tepl-space-drawer-prefs.h>
 #include <tepl/tepl-statusbar.h>
 #include <tepl/tepl-style-scheme-chooser-widget.h>
 #include <tepl/tepl-tab.h>


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