[tepl] Statusbar: add set_tab_group()



commit a1c21fa35e9d17b2bda4c40709855f9f43f914ad
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Mon Apr 20 07:54:38 2020 +0200

    Statusbar: add set_tab_group()

 docs/reference/tepl-sections.txt |   1 +
 tepl/tepl-statusbar.c            | 129 +++++++++++++++++++++++++++++++++++++++
 tepl/tepl-statusbar.h            |   4 ++
 3 files changed, 134 insertions(+)
---
diff --git a/docs/reference/tepl-sections.txt b/docs/reference/tepl-sections.txt
index 2bda7a5..dcf0498 100644
--- a/docs/reference/tepl-sections.txt
+++ b/docs/reference/tepl-sections.txt
@@ -324,6 +324,7 @@ TeplStatusbar
 tepl_statusbar_new
 tepl_statusbar_show_cursor_position
 tepl_statusbar_hide_cursor_position
+tepl_statusbar_set_tab_group
 <SUBSECTION Standard>
 TEPL_IS_STATUSBAR
 TEPL_IS_STATUSBAR_CLASS
diff --git a/tepl/tepl-statusbar.c b/tepl/tepl-statusbar.c
index e9f49fb..7b1e132 100644
--- a/tepl/tepl-statusbar.c
+++ b/tepl/tepl-statusbar.c
@@ -20,6 +20,7 @@
 #include "config.h"
 #include "tepl-statusbar.h"
 #include <glib/gi18n-lib.h>
+#include "tepl-signal-group.h"
 
 /**
  * SECTION:statusbar
@@ -33,13 +34,31 @@
 struct _TeplStatusbarPrivate
 {
        GtkLabel *label;
+       TeplTabGroup *tab_group;
+       TeplSignalGroup *buffer_signal_group;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (TeplStatusbar, tepl_statusbar, GTK_TYPE_STATUSBAR)
 
+static void
+tepl_statusbar_dispose (GObject *object)
+{
+       TeplStatusbar *statusbar = TEPL_STATUSBAR (object);
+
+       g_clear_object (&statusbar->priv->tab_group);
+       _tepl_signal_group_clear (&statusbar->priv->buffer_signal_group);
+
+       statusbar->priv->label = NULL;
+
+       G_OBJECT_CLASS (tepl_statusbar_parent_class)->dispose (object);
+}
+
 static void
 tepl_statusbar_class_init (TeplStatusbarClass *klass)
 {
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->dispose = tepl_statusbar_dispose;
 }
 
 static void
@@ -120,3 +139,113 @@ tepl_statusbar_hide_cursor_position (TeplStatusbar *statusbar)
 
        gtk_widget_hide (GTK_WIDGET (statusbar->priv->label));
 }
+
+static void
+update_cursor_position (TeplStatusbar *statusbar)
+{
+       TeplView *active_view;
+       GtkTextBuffer *active_buffer;
+       GtkTextIter iter;
+       gint line;
+       gint column;
+
+       active_view = tepl_tab_group_get_active_view (statusbar->priv->tab_group);
+       if (active_view == NULL)
+       {
+               tepl_statusbar_hide_cursor_position (statusbar);
+               return;
+       }
+
+       active_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view));
+       gtk_text_buffer_get_iter_at_mark (active_buffer,
+                                         &iter,
+                                         gtk_text_buffer_get_insert (active_buffer));
+
+       line = gtk_text_iter_get_line (&iter);
+       column = gtk_source_view_get_visual_column (GTK_SOURCE_VIEW (active_view), &iter);
+       tepl_statusbar_show_cursor_position (statusbar, line + 1, column + 1);
+}
+
+static void
+active_buffer_cursor_moved_cb (TeplBuffer    *active_buffer,
+                              TeplStatusbar *statusbar)
+{
+       update_cursor_position (statusbar);
+}
+
+static void
+active_buffer_changed (TeplStatusbar *statusbar)
+{
+       TeplBuffer *active_buffer;
+
+       _tepl_signal_group_clear (&statusbar->priv->buffer_signal_group);
+
+       active_buffer = tepl_tab_group_get_active_buffer (statusbar->priv->tab_group);
+       if (active_buffer == NULL)
+       {
+               goto end;
+       }
+
+       statusbar->priv->buffer_signal_group = _tepl_signal_group_new (G_OBJECT (active_buffer));
+
+       _tepl_signal_group_add (statusbar->priv->buffer_signal_group,
+                               g_signal_connect (active_buffer,
+                                                 "tepl-cursor-moved",
+                                                 G_CALLBACK (active_buffer_cursor_moved_cb),
+                                                 statusbar));
+
+end:
+       update_cursor_position (statusbar);
+}
+
+static void
+active_buffer_notify_cb (TeplTabGroup  *tab_group,
+                        GParamSpec    *pspec,
+                        TeplStatusbar *statusbar)
+{
+       active_buffer_changed (statusbar);
+}
+
+/**
+ * tepl_statusbar_set_tab_group:
+ * @statusbar: a #TeplStatusbar.
+ * @tab_group: a #TeplTabGroup.
+ *
+ * Calls tepl_statusbar_show_cursor_position() and
+ * tepl_statusbar_hide_cursor_position() according to the
+ * #TeplTabGroup:active-view of @tab_group, and the
+ * #TeplBuffer::tepl-cursor-moved signal.
+ *
+ * For the column number it uses the gtk_source_view_get_visual_column()
+ * function.
+ *
+ * This function can be called only once, it is not possible to change the
+ * #TeplTabGroup afterwards (this restriction may be lifted in the future if
+ * there is a compelling use-case).
+ *
+ * Since: 5.0
+ */
+void
+tepl_statusbar_set_tab_group (TeplStatusbar *statusbar,
+                             TeplTabGroup  *tab_group)
+{
+       g_return_if_fail (TEPL_IS_STATUSBAR (statusbar));
+       g_return_if_fail (TEPL_IS_TAB_GROUP (tab_group));
+
+       if (statusbar->priv->tab_group != NULL)
+       {
+               g_warning ("%s(): the TeplTabGroup has already been set, it can be set only once.",
+                          G_STRFUNC);
+               return;
+       }
+
+       statusbar->priv->tab_group = g_object_ref_sink (tab_group);
+
+       g_signal_connect_object (tab_group,
+                                "notify::active-buffer",
+                                G_CALLBACK (active_buffer_notify_cb),
+                                statusbar,
+                                0);
+
+       active_buffer_changed (statusbar);
+}
diff --git a/tepl/tepl-statusbar.h b/tepl/tepl-statusbar.h
index 6adc4d7..3ee5371 100644
--- a/tepl/tepl-statusbar.h
+++ b/tepl/tepl-statusbar.h
@@ -25,6 +25,7 @@
 #endif
 
 #include <gtk/gtk.h>
+#include <tepl/tepl-tab-group.h>
 
 G_BEGIN_DECLS
 
@@ -63,6 +64,9 @@ void          tepl_statusbar_show_cursor_position     (TeplStatusbar *statusbar,
 
 void           tepl_statusbar_hide_cursor_position     (TeplStatusbar *statusbar);
 
+void           tepl_statusbar_set_tab_group            (TeplStatusbar *statusbar,
+                                                        TeplTabGroup  *tab_group);
+
 G_END_DECLS
 
 #endif /* TEPL_STATUSBAR_H */


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