[tepl] Statusbar: add set_tab_group()
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] Statusbar: add set_tab_group()
- Date: Mon, 20 Apr 2020 07:29:50 +0000 (UTC)
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]