[tepl] SpaceDrawerPrefs: create class
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] SpaceDrawerPrefs: create class
- Date: Thu, 24 Sep 2020 06:15:05 +0000 (UTC)
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]