[gtksourceview/wip/delegate-space-drawing: 2/2] Create SpaceDrawer private class to delegate space drawing



commit 0062b71c15591e8ba4fe254adf6f74342aaf3e6e
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Jul 21 15:05:12 2016 +0200

    Create SpaceDrawer private class to delegate space drawing
    
    gtksourceview.c is quite big (more than 5000 lines of code). So
    delegating some more work is better. It's clearer to have all the
    space-drawing-related code in one place.
    
    In gtksourcespacedrawer.c, add correct copyrights based on git blame.

 docs/reference/Makefile.am             |    1 +
 gtksourceview/Makefile.am              |    2 +
 gtksourceview/gtksourcespacedrawer.c   |   87 ++++++++++++++++++++++++++++++++
 gtksourceview/gtksourcespacedrawer.h   |   69 +++++++++++++++++++++++++
 gtksourceview/gtksourcetypes-private.h |    3 +-
 gtksourceview/gtksourceview.c          |   20 ++++++--
 po/POTFILES.in                         |    1 +
 7 files changed, 178 insertions(+), 5 deletions(-)
---
diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am
index a6f6b16..23037c6 100644
--- a/docs/reference/Makefile.am
+++ b/docs/reference/Makefile.am
@@ -53,6 +53,7 @@ IGNORE_HFILES =                                       \
        gtksourcemarkssequence.h                \
        gtksourcepixbufhelper.h                 \
        gtksourceregex.h                        \
+       gtksourcespacedrawer.h                  \
        gtksourcestyle-private.h                \
        gtksourcetypes-private.h                \
        gtksourceundomanagerdefault.h           \
diff --git a/gtksourceview/Makefile.am b/gtksourceview/Makefile.am
index 86f2a76..787132f 100644
--- a/gtksourceview/Makefile.am
+++ b/gtksourceview/Makefile.am
@@ -114,6 +114,7 @@ libgtksourceview_private_headers =          \
        gtksourcemarkssequence.h                \
        gtksourcepixbufhelper.h                 \
        gtksourceregex.h                        \
+       gtksourcespacedrawer.h                  \
        gtksourcestyle-private.h                \
        gtksourcetypes-private.h                \
        gtksourceundomanagerdefault.h           \
@@ -135,6 +136,7 @@ libgtksourceview_private_c_files =  \
        gtksourcemarkssequence.c        \
        gtksourcepixbufhelper.c         \
        gtksourceregex.c                \
+       gtksourcespacedrawer.c          \
        gtksourceundomanagerdefault.c   \
        gtksourceview-i18n.c            \
        gtksourceview-utils.c
diff --git a/gtksourceview/gtksourcespacedrawer.c b/gtksourceview/gtksourcespacedrawer.c
new file mode 100644
index 0000000..65f4a2b
--- /dev/null
+++ b/gtksourceview/gtksourcespacedrawer.c
@@ -0,0 +1,87 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- */
+/* gtksourcespacedrawer.c
+ * This file is part of GtkSourceView
+ *
+ * Copyright (C) 2008, 2011, 2016 - Paolo Borelli <pborelli gnome org>
+ * Copyright (C) 2008, 2010 - Ignacio Casal Quinteiro <icq gnome org>
+ * Copyright (C) 2010 - Garret Regier
+ * Copyright (C) 2013 - Arpad Borsos <arpad borsos googlemail com>
+ * Copyright (C) 2015, 2016 - Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2016 - Christian Hergert <christian hergert me>
+ *
+ * GtkSourceView is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GtkSourceView is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "gtksourcespacedrawer.h"
+
+struct _GtkSourceSpaceDrawerPrivate
+{
+       GtkSourceDrawSpacesFlags flags;
+       GdkRGBA *color;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkSourceSpaceDrawer, _gtk_source_space_drawer, G_TYPE_OBJECT)
+
+static void
+_gtk_source_space_drawer_finalize (GObject *object)
+{
+
+       G_OBJECT_CLASS (_gtk_source_space_drawer_parent_class)->finalize (object);
+}
+
+static void
+_gtk_source_space_drawer_class_init (GtkSourceSpaceDrawerClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->finalize = _gtk_source_space_drawer_finalize;
+}
+
+static void
+_gtk_source_space_drawer_init (GtkSourceSpaceDrawer *drawer)
+{
+       drawer->priv = _gtk_source_space_drawer_get_instance_private (drawer);
+}
+
+GtkSourceSpaceDrawer *
+_gtk_source_space_drawer_new (void)
+{
+       return g_object_new (GTK_SOURCE_TYPE_SPACE_DRAWER, NULL);
+}
+
+GtkSourceDrawSpacesFlags
+_gtk_source_space_drawer_get_flags (GtkSourceSpaceDrawer *drawer)
+{
+       g_return_val_if_fail (GTK_SOURCE_IS_SPACE_DRAWER (drawer), 0);
+
+       return drawer->priv->flags;
+}
+
+gboolean
+_gtk_source_space_drawer_set_flags (GtkSourceSpaceDrawer     *drawer,
+                                   GtkSourceDrawSpacesFlags  flags)
+{
+       gboolean changed = FALSE;
+
+       g_return_val_if_fail (GTK_SOURCE_IS_SPACE_DRAWER (drawer), changed);
+
+       if (drawer->priv->flags != flags)
+       {
+               drawer->priv->flags = flags;
+               changed = TRUE;
+       }
+
+       return changed;
+}
diff --git a/gtksourceview/gtksourcespacedrawer.h b/gtksourceview/gtksourcespacedrawer.h
new file mode 100644
index 0000000..15c4841
--- /dev/null
+++ b/gtksourceview/gtksourcespacedrawer.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- */
+/* gtksourcespacedrawer.h
+ * This file is part of GtkSourceView
+ *
+ * Copyright (C) 2016 - Sébastien Wilmet <swilmet gnome org>
+ *
+ * GtkSourceView is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * GtkSourceView is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef GTK_SOURCE_SPACE_DRAWER_H
+#define GTK_SOURCE_SPACE_DRAWER_H
+
+#include <glib-object.h>
+#include "gtksourcetypes-private.h"
+#include "gtksourceview.h"
+
+G_BEGIN_DECLS
+
+#define GTK_SOURCE_TYPE_SPACE_DRAWER             (_gtk_source_space_drawer_get_type ())
+#define GTK_SOURCE_SPACE_DRAWER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GTK_SOURCE_TYPE_SPACE_DRAWER, GtkSourceSpaceDrawer))
+#define GTK_SOURCE_SPACE_DRAWER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
GTK_SOURCE_TYPE_SPACE_DRAWER, GtkSourceSpaceDrawerClass))
+#define GTK_SOURCE_IS_SPACE_DRAWER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GTK_SOURCE_TYPE_SPACE_DRAWER))
+#define GTK_SOURCE_IS_SPACE_DRAWER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GTK_SOURCE_TYPE_SPACE_DRAWER))
+#define GTK_SOURCE_SPACE_DRAWER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GTK_SOURCE_TYPE_SPACE_DRAWER, GtkSourceSpaceDrawerClass))
+
+typedef struct _GtkSourceSpaceDrawerClass    GtkSourceSpaceDrawerClass;
+typedef struct _GtkSourceSpaceDrawerPrivate  GtkSourceSpaceDrawerPrivate;
+
+struct _GtkSourceSpaceDrawer
+{
+       GObject parent;
+
+       GtkSourceSpaceDrawerPrivate *priv;
+};
+
+struct _GtkSourceSpaceDrawerClass
+{
+       GObjectClass parent_class;
+};
+
+G_GNUC_INTERNAL
+GType                  _gtk_source_space_drawer_get_type                       (void) G_GNUC_CONST;
+
+G_GNUC_INTERNAL
+GtkSourceSpaceDrawer * _gtk_source_space_drawer_new                            (void);
+
+G_GNUC_INTERNAL
+GtkSourceDrawSpacesFlags
+                       _gtk_source_space_drawer_get_flags                      (GtkSourceSpaceDrawer 
*drawer);
+
+G_GNUC_INTERNAL
+gboolean               _gtk_source_space_drawer_set_flags                      (GtkSourceSpaceDrawer     
*drawer,
+                                                                                GtkSourceDrawSpacesFlags  
flags);
+
+G_END_DECLS
+
+#endif /* GTK_SOURCE_SPACE_DRAWER_H */
diff --git a/gtksourceview/gtksourcetypes-private.h b/gtksourceview/gtksourcetypes-private.h
index 283bfe0..857a4b2 100644
--- a/gtksourceview/gtksourcetypes-private.h
+++ b/gtksourceview/gtksourcetypes-private.h
@@ -2,7 +2,7 @@
  * gtksourcetypes-private.h
  * This file is part of GtkSourceView
  *
- * Copyright (C) 2012 - Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2012, 2013, 2016 - Sébastien Wilmet <swilmet gnome org>
  *
  * GtkSourceView is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -37,6 +37,7 @@ typedef struct _GtkSourceGutterRendererMarks  GtkSourceGutterRendererMarks;
 typedef struct _GtkSourceMarksSequence         GtkSourceMarksSequence;
 typedef struct _GtkSourcePixbufHelper          GtkSourcePixbufHelper;
 typedef struct _GtkSourceRegex                 GtkSourceRegex;
+typedef struct _GtkSourceSpaceDrawer           GtkSourceSpaceDrawer;
 typedef struct _GtkSourceUndoManagerDefault    GtkSourceUndoManagerDefault;
 
 #ifdef _MSC_VER
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index 12d8087..ddfa368 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -49,6 +49,7 @@
 #include "gtksourcegutterrenderermarks.h"
 #include "gtksourceiter.h"
 #include "gtksourcetag.h"
+#include "gtksourcespacedrawer.h"
 
 /**
  * SECTION:view
@@ -166,6 +167,7 @@ struct _GtkSourceViewPrivate
        GdkRGBA *right_margin_line_color;
        GdkRGBA *right_margin_overlay_color;
 
+       GtkSourceSpaceDrawer *space_drawer;
        GtkSourceDrawSpacesFlags draw_spaces;
        GdkRGBA *spaces_color;
 
@@ -1273,6 +1275,8 @@ gtk_source_view_init (GtkSourceView *view)
        view->priv->right_margin_overlay_color = NULL;
        view->priv->spaces_color = NULL;
 
+       view->priv->space_drawer = _gtk_source_space_drawer_new ();
+
        view->priv->mark_categories = g_hash_table_new_full (g_str_hash,
                                                             g_str_equal,
                                                             (GDestroyNotify) g_free,
@@ -1308,6 +1312,7 @@ gtk_source_view_dispose (GObject *object)
        g_clear_object (&view->priv->left_gutter);
        g_clear_object (&view->priv->right_gutter);
        g_clear_object (&view->priv->style_scheme);
+       g_clear_object (&view->priv->space_drawer);
 
        remove_source_buffer (view);
 
@@ -4915,12 +4920,14 @@ gtk_source_view_set_draw_spaces (GtkSourceView            *view,
 {
        g_return_if_fail (GTK_SOURCE_IS_VIEW (view));
 
-       if (view->priv->draw_spaces != flags)
+       if (view->priv->space_drawer == NULL)
        {
-               view->priv->draw_spaces = flags;
+               return;
+       }
 
+       if (_gtk_source_space_drawer_set_flags (view->priv->space_drawer, flags))
+       {
                gtk_widget_queue_draw (GTK_WIDGET (view));
-
                g_object_notify (G_OBJECT (view), "draw-spaces");
        }
 }
@@ -4939,7 +4946,12 @@ gtk_source_view_get_draw_spaces (GtkSourceView *view)
 {
        g_return_val_if_fail (GTK_SOURCE_IS_VIEW (view), 0);
 
-       return view->priv->draw_spaces;
+       if (view->priv->space_drawer == NULL)
+       {
+               return 0;
+       }
+
+       return _gtk_source_space_drawer_get_flags (view->priv->space_drawer);
 }
 
 /**
diff --git a/po/POTFILES.in b/po/POTFILES.in
index bc45896..95fdced 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -32,6 +32,7 @@ gtksourceview/gtksourceprintcompositor.c
 gtksourceview/gtksourceregex.c
 gtksourceview/gtksourcesearchcontext.c
 gtksourceview/gtksourcesearchsettings.c
+gtksourceview/gtksourcespacedrawer.c
 gtksourceview/gtksourcestyle.c
 gtksourceview/gtksourcestylescheme.c
 gtksourceview/gtksourcestyleschemechooserbutton.c


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