[gtksourceview/wip/space-drawing: 1/2] SpaceDrawer: add "enable-matrix" property



commit bd6b1e4d6d57eba5e3c30102768baf976719a6a0
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Sep 30 19:25:22 2016 +0200

    SpaceDrawer: add "enable-matrix" property
    
    It's useful to keep the matrix state and just disable space drawing.
    
    It'll also be useful in the drawspaces gedit plugin, since it has a
    "show-white-space" bool gsetting.
    
    It'll also permit to set a better default value for the matrix property.

 docs/reference/gtksourceview-3.0-sections.txt |    2 +
 gtksourceview/gtksourcespacedrawer.c          |   77 ++++++++++++++++++++++++-
 gtksourceview/gtksourcespacedrawer.h          |    7 ++
 gtksourceview/gtksourceview.c                 |   10 ++--
 tests/test-space-drawing.c                    |   44 +++-----------
 tests/test-widget.c                           |   38 ++++--------
 6 files changed, 111 insertions(+), 67 deletions(-)
---
diff --git a/docs/reference/gtksourceview-3.0-sections.txt b/docs/reference/gtksourceview-3.0-sections.txt
index 4aed8a4..312c793 100644
--- a/docs/reference/gtksourceview-3.0-sections.txt
+++ b/docs/reference/gtksourceview-3.0-sections.txt
@@ -750,6 +750,8 @@ gtk_source_space_drawer_set_types_for_locations
 gtk_source_space_drawer_get_types_for_locations
 gtk_source_space_drawer_set_matrix
 gtk_source_space_drawer_get_matrix
+gtk_source_space_drawer_set_enable_matrix
+gtk_source_space_drawer_get_enable_matrix
 <SUBSECTION Standard>
 GTK_SOURCE_IS_SPACE_DRAWER
 GTK_SOURCE_IS_SPACE_DRAWER_CLASS
diff --git a/gtksourceview/gtksourcespacedrawer.c b/gtksourceview/gtksourcespacedrawer.c
index 0debe5e..a5bed28 100644
--- a/gtksourceview/gtksourcespacedrawer.c
+++ b/gtksourceview/gtksourcespacedrawer.c
@@ -79,11 +79,13 @@ struct _GtkSourceSpaceDrawerPrivate
 {
        GtkSourceSpaceTypeFlags *matrix;
        GdkRGBA *color;
+       guint enable_matrix : 1;
 };
 
 enum
 {
        PROP_0,
+       PROP_ENABLE_MATRIX,
        PROP_MATRIX,
        N_PROPERTIES
 };
@@ -218,6 +220,10 @@ gtk_source_space_drawer_get_property (GObject    *object,
 
        switch (prop_id)
        {
+               case PROP_ENABLE_MATRIX:
+                       g_value_set_boolean (value, gtk_source_space_drawer_get_enable_matrix (drawer));
+                       break;
+
                case PROP_MATRIX:
                        g_value_set_variant (value, gtk_source_space_drawer_get_matrix (drawer));
                        break;
@@ -238,6 +244,10 @@ gtk_source_space_drawer_set_property (GObject      *object,
 
        switch (prop_id)
        {
+               case PROP_ENABLE_MATRIX:
+                       gtk_source_space_drawer_set_enable_matrix (drawer, g_value_get_boolean (value));
+                       break;
+
                case PROP_MATRIX:
                        gtk_source_space_drawer_set_matrix (drawer, g_value_get_variant (value));
                        break;
@@ -273,6 +283,22 @@ gtk_source_space_drawer_class_init (GtkSourceSpaceDrawerClass *klass)
        object_class->finalize = gtk_source_space_drawer_finalize;
 
        /**
+        * GtkSourceSpaceDrawer:enable-matrix:
+        *
+        * Whether the #GtkSourceSpaceDrawer:matrix property is enabled.
+        *
+        * Since: 3.24
+        */
+       properties[PROP_ENABLE_MATRIX] =
+               g_param_spec_boolean ("enable-matrix",
+                                     "Enable Matrix",
+                                     "",
+                                     FALSE,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT |
+                                     G_PARAM_STATIC_STRINGS);
+
+       /**
         * GtkSourceSpaceDrawer:matrix:
         *
         * The :matrix property is a #GVariant property to specify where and
@@ -359,6 +385,11 @@ _gtk_source_space_drawer_get_flags (GtkSourceSpaceDrawer *drawer)
 
        g_return_val_if_fail (GTK_SOURCE_IS_SPACE_DRAWER (drawer), 0);
 
+       if (!drawer->priv->enable_matrix)
+       {
+               return 0;
+       }
+
        locations = get_nonzero_locations_for_draw_spaces_flags (drawer);
        common_types = gtk_source_space_drawer_get_types_for_locations (drawer, locations);
 
@@ -464,6 +495,8 @@ _gtk_source_space_drawer_set_flags (GtkSourceSpaceDrawer     *drawer,
        locations = get_locations_from_draw_spaces_flags (flags);
        types = get_space_types_from_draw_spaces_flags (flags);
        gtk_source_space_drawer_set_types_for_locations (drawer, locations, types);
+
+       gtk_source_space_drawer_set_enable_matrix (drawer, TRUE);
 }
 
 /**
@@ -664,6 +697,45 @@ gtk_source_space_drawer_set_matrix (GtkSourceSpaceDrawer *drawer,
        }
 }
 
+/**
+ * gtk_source_space_drawer_get_enable_matrix:
+ * @drawer: a #GtkSourceSpaceDrawer.
+ *
+ * Returns: whether the #GtkSourceSpaceDrawer:matrix property is enabled.
+ * Since: 3.24
+ */
+gboolean
+gtk_source_space_drawer_get_enable_matrix (GtkSourceSpaceDrawer *drawer)
+{
+       g_return_val_if_fail (GTK_SOURCE_IS_SPACE_DRAWER (drawer), FALSE);
+
+       return drawer->priv->enable_matrix;
+}
+
+/**
+ * gtk_source_space_drawer_set_enable_matrix:
+ * @drawer: a #GtkSourceSpaceDrawer.
+ * @enable_matrix: the new value.
+ *
+ * Sets whether the #GtkSourceSpaceDrawer:matrix property is enabled.
+ *
+ * Since: 3.24
+ */
+void
+gtk_source_space_drawer_set_enable_matrix (GtkSourceSpaceDrawer *drawer,
+                                          gboolean              enable_matrix)
+{
+       g_return_if_fail (GTK_SOURCE_IS_SPACE_DRAWER (drawer));
+
+       enable_matrix = enable_matrix != FALSE;
+
+       if (drawer->priv->enable_matrix != enable_matrix)
+       {
+               drawer->priv->enable_matrix = enable_matrix;
+               g_object_notify_by_pspec (G_OBJECT (drawer), properties[PROP_ENABLE_MATRIX]);
+       }
+}
+
 void
 _gtk_source_space_drawer_update_color (GtkSourceSpaceDrawer *drawer,
                                       GtkSourceView        *view)
@@ -1084,7 +1156,8 @@ space_needs_drawing (GtkSourceSpaceDrawer *drawer,
        }
 
        /* Check the matrix */
-       return space_needs_drawing_according_to_matrix (drawer, iter, leading_end, trailing_start);
+       return (drawer->priv->enable_matrix &&
+               space_needs_drawing_according_to_matrix (drawer, iter, leading_end, trailing_start));
 }
 
 static void
@@ -1184,7 +1257,7 @@ _gtk_source_space_drawer_draw (GtkSourceSpaceDrawer *drawer,
        text_view = GTK_TEXT_VIEW (view);
        buffer = gtk_text_view_get_buffer (text_view);
 
-       if (is_zero_matrix (drawer) &&
+       if ((!drawer->priv->enable_matrix || is_zero_matrix (drawer)) &&
            !buffer_has_draw_spaces_tag (buffer))
        {
                return;
diff --git a/gtksourceview/gtksourcespacedrawer.h b/gtksourceview/gtksourcespacedrawer.h
index b6f2e75..3454901 100644
--- a/gtksourceview/gtksourcespacedrawer.h
+++ b/gtksourceview/gtksourcespacedrawer.h
@@ -129,6 +129,13 @@ GTK_SOURCE_AVAILABLE_IN_3_24
 void                   gtk_source_space_drawer_set_matrix              (GtkSourceSpaceDrawer *drawer,
                                                                         GVariant             *matrix);
 
+GTK_SOURCE_AVAILABLE_IN_3_24
+gboolean               gtk_source_space_drawer_get_enable_matrix       (GtkSourceSpaceDrawer *drawer);
+
+GTK_SOURCE_AVAILABLE_IN_3_24
+void                   gtk_source_space_drawer_set_enable_matrix       (GtkSourceSpaceDrawer *drawer,
+                                                                        gboolean              enable_matrix);
+
 G_END_DECLS
 
 #endif /* GTK_SOURCE_SPACE_DRAWER_H */
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index a422e2c..8e46312 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -1270,9 +1270,9 @@ gtk_source_view_get_property (GObject    *object,
 }
 
 static void
-space_drawer_notify_matrix_cb (GtkSourceSpaceDrawer *space_drawer,
-                              GParamSpec           *pspec,
-                              GtkSourceView        *view)
+space_drawer_notify_cb (GtkSourceSpaceDrawer *space_drawer,
+                       GParamSpec           *pspec,
+                       GtkSourceView        *view)
 {
        gtk_widget_queue_draw (GTK_WIDGET (view));
        g_object_notify (G_OBJECT (view), "draw-spaces");
@@ -1309,8 +1309,8 @@ gtk_source_view_init (GtkSourceView *view)
 
        view->priv->space_drawer = gtk_source_space_drawer_new ();
        g_signal_connect_object (view->priv->space_drawer,
-                                "notify::matrix",
-                                G_CALLBACK (space_drawer_notify_matrix_cb),
+                                "notify",
+                                G_CALLBACK (space_drawer_notify_cb),
                                 view,
                                 0);
 
diff --git a/tests/test-space-drawing.c b/tests/test-space-drawing.c
index 57ccbf6..b7be77d 100644
--- a/tests/test-space-drawing.c
+++ b/tests/test-space-drawing.c
@@ -52,34 +52,6 @@ fill_buffer (GtkTextBuffer *buffer,
 }
 
 static void
-enable_matrix (GtkSourceSpaceDrawer *space_drawer)
-{
-       gtk_source_space_drawer_set_types_for_locations (space_drawer,
-                                                        GTK_SOURCE_SPACE_LOCATION_ALL,
-                                                        GTK_SOURCE_SPACE_TYPE_NBSP);
-
-       gtk_source_space_drawer_set_types_for_locations (space_drawer,
-                                                        GTK_SOURCE_SPACE_LOCATION_TRAILING,
-                                                        GTK_SOURCE_SPACE_TYPE_ALL & 
~GTK_SOURCE_SPACE_TYPE_NEWLINE);
-}
-
-static void
-matrix_checkbutton_toggled_cb (GtkToggleButton      *matrix_checkbutton,
-                              GtkSourceSpaceDrawer *space_drawer)
-{
-       if (gtk_toggle_button_get_active (matrix_checkbutton))
-       {
-               enable_matrix (space_drawer);
-       }
-       else
-       {
-               gtk_source_space_drawer_set_types_for_locations (space_drawer,
-                                                                GTK_SOURCE_SPACE_LOCATION_ALL,
-                                                                GTK_SOURCE_SPACE_TYPE_NONE);
-       }
-}
-
-static void
 create_window (void)
 {
        GtkWidget *window;
@@ -120,7 +92,12 @@ create_window (void)
        fill_buffer (GTK_TEXT_BUFFER (buffer), tag);
 
        space_drawer = gtk_source_view_get_space_drawer (view);
-       enable_matrix (space_drawer);
+       gtk_source_space_drawer_set_types_for_locations (space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_ALL,
+                                                        GTK_SOURCE_SPACE_TYPE_NBSP);
+       gtk_source_space_drawer_set_types_for_locations (space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_TRAILING,
+                                                        GTK_SOURCE_SPACE_TYPE_ALL & 
~GTK_SOURCE_SPACE_TYPE_NEWLINE);
 
        panel_grid = gtk_grid_new ();
        gtk_orientable_set_orientation (GTK_ORIENTABLE (panel_grid), GTK_ORIENTATION_VERTICAL);
@@ -131,13 +108,12 @@ create_window (void)
                      "margin", 6,
                      NULL);
 
-       matrix_checkbutton = gtk_check_button_new_with_label ("GtkSourceSpaceDrawer matrix");
+       matrix_checkbutton = gtk_check_button_new_with_label ("GtkSourceSpaceDrawer enable-matrix");
        gtk_container_add (GTK_CONTAINER (panel_grid), matrix_checkbutton);
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (matrix_checkbutton), TRUE);
-       g_signal_connect (matrix_checkbutton,
-                         "toggled",
-                         G_CALLBACK (matrix_checkbutton_toggled_cb),
-                         space_drawer);
+       g_object_bind_property (matrix_checkbutton, "active",
+                               space_drawer, "enable-matrix",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
        tag_set_checkbutton = gtk_check_button_new_with_label ("GtkSourceTag draw-spaces-set");
        gtk_container_add (GTK_CONTAINER (panel_grid), tag_set_checkbutton);
diff --git a/tests/test-widget.c b/tests/test-widget.c
index d1c6056..8af7e2f 100644
--- a/tests/test-widget.c
+++ b/tests/test-widget.c
@@ -993,30 +993,10 @@ show_top_border_window_toggled_cb (GtkToggleButton *checkbutton,
 }
 
 static void
-draw_spaces_toggled_cb (GtkToggleButton *checkbutton,
-                       TestWidget      *self)
+test_widget_init (TestWidget *self)
 {
        GtkSourceSpaceDrawer *space_drawer;
 
-       space_drawer = gtk_source_view_get_space_drawer (self->priv->view);
-
-       if (gtk_toggle_button_get_active (checkbutton))
-       {
-               gtk_source_space_drawer_set_types_for_locations (space_drawer,
-                                                                GTK_SOURCE_SPACE_LOCATION_ALL,
-                                                                GTK_SOURCE_SPACE_TYPE_ALL);
-       }
-       else
-       {
-               gtk_source_space_drawer_set_types_for_locations (space_drawer,
-                                                                GTK_SOURCE_SPACE_LOCATION_ALL,
-                                                                GTK_SOURCE_SPACE_TYPE_NONE);
-       }
-}
-
-static void
-test_widget_init (TestWidget *self)
-{
        self->priv = test_widget_get_instance_private (self);
 
        gtk_widget_init_template (GTK_WIDGET (self));
@@ -1075,11 +1055,6 @@ test_widget_init (TestWidget *self)
                                "visible",
                                G_BINDING_SYNC_CREATE);
 
-       g_signal_connect (self->priv->draw_spaces_checkbutton,
-                         "toggled",
-                         G_CALLBACK (draw_spaces_toggled_cb),
-                         self);
-
        g_object_bind_property (self->priv->smart_backspace_checkbutton,
                                "active",
                                self->priv->view,
@@ -1091,6 +1066,17 @@ test_widget_init (TestWidget *self)
                          G_CALLBACK (on_background_pattern_changed),
                          self);
 
+       /* White space drawing */
+       space_drawer = gtk_source_view_get_space_drawer (self->priv->view);
+
+       gtk_source_space_drawer_set_types_for_locations (space_drawer,
+                                                        GTK_SOURCE_SPACE_LOCATION_ALL,
+                                                        GTK_SOURCE_SPACE_TYPE_ALL);
+
+       g_object_bind_property (self->priv->draw_spaces_checkbutton, "active",
+                               space_drawer, "enable-matrix",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
        open_file (self, TOP_SRCDIR "/gtksourceview/gtksourcebuffer.c");
 }
 


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