[evolution/449-support-markdown-in-composer] EMarkdownEditor: Add signals for text format/insert actions



commit 8313ea92ef2714d08105581272341d35e060a29b
Author: Milan Crha <mcrha redhat com>
Date:   Wed Feb 9 09:21:39 2022 +0100

    EMarkdownEditor: Add signals for text format/insert actions

 src/e-util/e-markdown-editor.c | 246 +++++++++++++++++++++++++++++++++--------
 src/e-util/e-markdown-editor.h |  14 +++
 2 files changed, 213 insertions(+), 47 deletions(-)
---
diff --git a/src/e-util/e-markdown-editor.c b/src/e-util/e-markdown-editor.c
index 959eaada03..fdb6a5485b 100644
--- a/src/e-util/e-markdown-editor.c
+++ b/src/e-util/e-markdown-editor.c
@@ -82,6 +82,15 @@ enum {
 
 enum {
        CHANGED,
+       FORMAT_BOLD,
+       FORMAT_ITALIC,
+       FORMAT_QUOTE,
+       FORMAT_CODE,
+       FORMAT_BULLET_LIST,
+       FORMAT_NUMBERED_LIST,
+       FORMAT_HEADER,
+       INSERT_LINK,
+       INSERT_EMOJI,
        LAST_SIGNAL
 };
 
@@ -721,43 +730,32 @@ e_markdown_editor_surround_selection (EMarkdownEditor *self,
 }
 
 static void
-e_markdown_editor_add_bold_text_cb (GtkToolButton *button,
-                                   gpointer user_data)
+e_markdown_editor_format_bold_text_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, FALSE, "**", "**");
 }
 
 static void
-e_markdown_editor_add_italic_text_cb (GtkToolButton *button,
-                                     gpointer user_data)
+e_markdown_editor_format_italic_text_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, FALSE, "_", "_");
 }
 
 static void
-e_markdown_editor_insert_quote_cb (GtkToolButton *button,
-                                  gpointer user_data)
+e_markdown_editor_format_quote_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, TRUE, "> ", NULL);
 }
 
 static void
-e_markdown_editor_insert_code_cb (GtkToolButton *button,
-                                 gpointer user_data)
+e_markdown_editor_format_code_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
        GtkTextIter start, end;
        gchar *selection = NULL;
 
@@ -804,10 +802,8 @@ e_markdown_editor_insert_code_cb (GtkToolButton *button,
 }
 
 static void
-e_markdown_editor_add_link_cb (GtkToolButton *button,
-                              gpointer user_data)
+e_markdown_editor_insert_link_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
        GtkTextBuffer *buffer;
        GtkTextIter start, end;
        gchar *selection = NULL;
@@ -859,54 +855,40 @@ e_markdown_editor_add_link_cb (GtkToolButton *button,
 }
 
 static void
-e_markdown_editor_add_bullet_list_cb (GtkToolButton *button,
-                                     gpointer user_data)
+e_markdown_editor_format_bullet_list_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, TRUE, "- ", NULL);
 }
 
 static void
-e_markdown_editor_add_numbered_list_cb (GtkToolButton *button,
-                                       gpointer user_data)
+e_markdown_editor_format_numbered_list_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, TRUE, "1. ", NULL);
 }
 
 static void
-e_markdown_editor_add_header_cb (GtkToolButton *button,
-                                gpointer user_data)
+e_markdown_editor_format_header_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        e_markdown_editor_surround_selection (self, TRUE, "# ", NULL);
 }
 
 static void
-e_markdown_editor_insert_emoji_cb (GtkToolButton *button,
-                                gpointer user_data)
+e_markdown_editor_insert_emoji_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
-
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
 
        g_signal_emit_by_name (self->priv->text_view, "insert-emoji", 0, NULL);
 }
 
 static void
-e_markdown_editor_markdown_syntax_cb (GtkToolButton *button,
-                                     gpointer user_data)
+e_markdown_editor_markdown_syntax_cb (EMarkdownEditor *self)
 {
-       EMarkdownEditor *self = user_data;
        GtkWidget *toplevel;
 
        g_return_if_fail (E_IS_MARKDOWN_EDITOR (self));
@@ -991,14 +973,14 @@ struct _toolbar_items {
 
 static struct _toolbar_items toolbar_items[] = {
        #define ITEM(lbl, icn, cbk) { lbl, icn, icn "-dark", G_CALLBACK (cbk) }
-       ITEM (N_("Add bold text"), "markdown-bold", e_markdown_editor_add_bold_text_cb),
-       ITEM (N_("Add italic text"), "markdown-italic", e_markdown_editor_add_italic_text_cb),
-       ITEM (N_("Insert a quote"), "markdown-quote", e_markdown_editor_insert_quote_cb),
-       ITEM (N_("Insert code"), "markdown-code", e_markdown_editor_insert_code_cb),
-       ITEM (N_("Add a link"), "markdown-link", e_markdown_editor_add_link_cb),
-       ITEM (N_("Add a bullet list"), "markdown-bullets", e_markdown_editor_add_bullet_list_cb),
-       ITEM (N_("Add a numbered list"), "markdown-numbers", e_markdown_editor_add_numbered_list_cb),
-       ITEM (N_("Add a header"), "markdown-header", e_markdown_editor_add_header_cb),
+       ITEM (N_("Add bold text"), "markdown-bold", e_markdown_editor_format_bold_text_cb),
+       ITEM (N_("Add italic text"), "markdown-italic", e_markdown_editor_format_italic_text_cb),
+       ITEM (N_("Insert a quote"), "markdown-quote", e_markdown_editor_format_quote_cb),
+       ITEM (N_("Insert code"), "markdown-code", e_markdown_editor_format_code_cb),
+       ITEM (N_("Add a link"), "markdown-link", e_markdown_editor_insert_link_cb),
+       ITEM (N_("Add a bullet list"), "markdown-bullets", e_markdown_editor_format_bullet_list_cb),
+       ITEM (N_("Add a numbered list"), "markdown-numbers", e_markdown_editor_format_numbered_list_cb),
+       ITEM (N_("Add a header"), "markdown-header", e_markdown_editor_format_header_cb),
        ITEM (N_("Insert Emoji"), "markdown-emoji", e_markdown_editor_insert_emoji_cb),
        ITEM (NULL, "", NULL),
        ITEM (N_("Open online common mark documentation"), "markdown-help", G_CALLBACK 
(e_markdown_editor_markdown_syntax_cb))
@@ -1412,7 +1394,7 @@ e_markdown_editor_constructed (GObject *object)
                        item = gtk_tool_button_new (icon, _(toolbar_items[ii].label));
                        gtk_widget_set_name (GTK_WIDGET (item), toolbar_items[ii].icon_name);
                        gtk_tool_item_set_tooltip_text (item, _(toolbar_items[ii].label));
-                       g_signal_connect_object (item, "clicked", toolbar_items[ii].callback, self, 0);
+                       g_signal_connect_object (item, "clicked", toolbar_items[ii].callback, self, 
G_CONNECT_SWAPPED);
                } else {
                        item = gtk_separator_tool_item_new ();
                }
@@ -1445,6 +1427,17 @@ static void
 e_markdown_editor_class_init (EMarkdownEditorClass *klass)
 {
        GObjectClass *object_class;
+       GtkBindingSet *binding_set;
+
+       klass->format_bold = e_markdown_editor_format_bold_text_cb;
+       klass->format_italic = e_markdown_editor_format_italic_text_cb;
+       klass->format_quote = e_markdown_editor_format_quote_cb;
+       klass->format_code = e_markdown_editor_format_code_cb;
+       klass->format_bullet_list = e_markdown_editor_format_bullet_list_cb;
+       klass->format_numbered_list = e_markdown_editor_format_numbered_list_cb;
+       klass->format_header = e_markdown_editor_format_header_cb;
+       klass->insert_link = e_markdown_editor_insert_link_cb;
+       klass->insert_emoji = e_markdown_editor_insert_emoji_cb;
 
        object_class = G_OBJECT_CLASS (klass);
        object_class->get_property = e_markdown_editor_get_property;
@@ -1493,10 +1486,169 @@ e_markdown_editor_class_init (EMarkdownEditorClass *klass)
                "changed",
                G_TYPE_FROM_CLASS (klass),
                G_SIGNAL_RUN_FIRST,
-               0,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, changed),
                NULL, NULL, NULL,
                G_TYPE_NONE, 0,
                G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-bold:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to bold.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_BOLD] = g_signal_new (
+               "format-bold",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_bold),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-italic:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to italic.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_ITALIC] = g_signal_new (
+               "format-italic",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_italic),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-quote:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to quote.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_QUOTE] = g_signal_new (
+               "format-quote",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_quote),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-code:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to code.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_CODE] = g_signal_new (
+               "format-code",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_code),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-bullet-list:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to bullet list.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_BULLET_LIST] = g_signal_new (
+               "format-bullet-list",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_bullet_list),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-numbered-list:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to numbered list.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_NUMBERED_LIST] = g_signal_new (
+               "format-numbered-list",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_numbered_list),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::format-header:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to set text format to header.
+        *
+        * Since: 3.44
+        **/
+       signals[FORMAT_HEADER] = g_signal_new (
+               "format-header",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, format_header),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::insert-link:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to insert a link.
+        *
+        * Since: 3.44
+        **/
+       signals[INSERT_LINK] = g_signal_new (
+               "insert-link",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, insert_link),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       /**
+        * EMarkdownEditor::insert-emoji:
+        * @self: an #EMarkdownEditor, which receives the signal
+        *
+        * A signal to open a dialog to insert Emoji.
+        *
+        * Since: 3.44
+        **/
+       signals[INSERT_EMOJI] = g_signal_new (
+               "insert-emoji",
+               G_TYPE_FROM_CLASS (klass),
+               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+               G_STRUCT_OFFSET (EMarkdownEditorClass, insert_emoji),
+               NULL, NULL, NULL,
+               G_TYPE_NONE, 0,
+               G_TYPE_NONE);
+
+       binding_set = gtk_binding_set_by_class (klass);
+
+       gtk_binding_entry_add_signal (binding_set, GDK_KEY_b, GDK_CONTROL_MASK, "format-bold", 0);
+       gtk_binding_entry_add_signal (binding_set, GDK_KEY_i, GDK_CONTROL_MASK, "format-italic", 0);
+       gtk_binding_entry_add_signal (binding_set, GDK_KEY_k, GDK_CONTROL_MASK, "insert-link", 0);
 }
 
 static void
diff --git a/src/e-util/e-markdown-editor.h b/src/e-util/e-markdown-editor.h
index c8cc59bc5b..db62d706f5 100644
--- a/src/e-util/e-markdown-editor.h
+++ b/src/e-util/e-markdown-editor.h
@@ -47,6 +47,20 @@ struct _EMarkdownEditor {
 
 struct _EMarkdownEditorClass {
        GtkBoxClass parent_class;
+
+       void    (* changed)             (EMarkdownEditor *self);
+       void    (* format_bold)         (EMarkdownEditor *self);
+       void    (* format_italic)       (EMarkdownEditor *self);
+       void    (* format_quote)        (EMarkdownEditor *self);
+       void    (* format_code)         (EMarkdownEditor *self);
+       void    (* format_bullet_list)  (EMarkdownEditor *self);
+       void    (* format_numbered_list)(EMarkdownEditor *self);
+       void    (* format_header)       (EMarkdownEditor *self);
+       void    (* insert_link)         (EMarkdownEditor *self);
+       void    (* insert_emoji)        (EMarkdownEditor *self);
+
+       /* Padding for future expansion */
+       gpointer padding[12];
 };
 
 GType          e_markdown_editor_get_type              (void) G_GNUC_CONST;


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