diff --git a/data/icons/hicolor_actions_scalable_markdown-bold-dark.svg b/data/icons/hicolor_actions_scalable_markdown-bold-dark.svg index e56fb34935..b058bf1429 100644 --- a/data/icons/hicolor_actions_scalable_markdown-bold-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-bold-dark.svg @@ -5,15 +5,14 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-bold.svg b/data/icons/hicolor_actions_scalable_markdown-bold.svg index 39a46d8331..5b0c8e8041 100644 --- a/data/icons/hicolor_actions_scalable_markdown-bold.svg +++ b/data/icons/hicolor_actions_scalable_markdown-bold.svg @@ -5,14 +5,14 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-bullets-dark.svg b/data/icons/hicolor_actions_scalable_markdown-bullets-dark.svg index fa2bf472e6..b92d278cea 100644 --- a/data/icons/hicolor_actions_scalable_markdown-bullets-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-bullets-dark.svg @@ -5,27 +5,27 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-bullets.svg b/data/icons/hicolor_actions_scalable_markdown-bullets.svg index fe13db36e8..067414fbea 100644 --- a/data/icons/hicolor_actions_scalable_markdown-bullets.svg +++ b/data/icons/hicolor_actions_scalable_markdown-bullets.svg @@ -5,27 +5,27 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-code-dark.svg b/data/icons/hicolor_actions_scalable_markdown-code-dark.svg index 23b6dcf3ff..7702653f8d 100644 --- a/data/icons/hicolor_actions_scalable_markdown-code-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-code-dark.svg @@ -5,18 +5,16 @@ version="1.1" id="svg51326" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-header.svg b/data/icons/hicolor_actions_scalable_markdown-header.svg index e509013d69..35879ea8f4 100644 --- a/data/icons/hicolor_actions_scalable_markdown-header.svg +++ b/data/icons/hicolor_actions_scalable_markdown-header.svg @@ -5,18 +5,18 @@ version="1.1" id="svg4631" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-help-dark.svg b/data/icons/hicolor_actions_scalable_markdown-help-dark.svg index fcd2864596..c0e13a842c 100644 --- a/data/icons/hicolor_actions_scalable_markdown-help-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-help-dark.svg @@ -5,30 +5,29 @@ version="1.1" id="svg11209" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + id="defs11213" /> diff --git a/data/icons/hicolor_actions_scalable_markdown-help.svg b/data/icons/hicolor_actions_scalable_markdown-help.svg index 6be86d3402..2b80ab7e7e 100644 --- a/data/icons/hicolor_actions_scalable_markdown-help.svg +++ b/data/icons/hicolor_actions_scalable_markdown-help.svg @@ -5,14 +5,14 @@ version="1.1" id="svg11209" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-italic.svg b/data/icons/hicolor_actions_scalable_markdown-italic.svg index 3b64797ad3..c9474a9cc1 100644 --- a/data/icons/hicolor_actions_scalable_markdown-italic.svg +++ b/data/icons/hicolor_actions_scalable_markdown-italic.svg @@ -5,12 +5,12 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> diff --git a/data/icons/hicolor_actions_scalable_markdown-link-dark.svg b/data/icons/hicolor_actions_scalable_markdown-link-dark.svg index 5cafddcdf8..6c73830fd8 100644 --- a/data/icons/hicolor_actions_scalable_markdown-link-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-link-dark.svg @@ -5,23 +5,20 @@ version="1.1" id="svg51326" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + id="g5385"> diff --git a/data/icons/hicolor_actions_scalable_markdown-numbers.svg b/data/icons/hicolor_actions_scalable_markdown-numbers.svg index 7ca25fb951..c1fb4f65ca 100644 --- a/data/icons/hicolor_actions_scalable_markdown-numbers.svg +++ b/data/icons/hicolor_actions_scalable_markdown-numbers.svg @@ -5,36 +5,34 @@ version="1.1" id="svg824" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + id="g5385"> diff --git a/data/icons/hicolor_actions_scalable_markdown-quote-dark.svg b/data/icons/hicolor_actions_scalable_markdown-quote-dark.svg index 2b57fc1e60..0f174db4fa 100644 --- a/data/icons/hicolor_actions_scalable_markdown-quote-dark.svg +++ b/data/icons/hicolor_actions_scalable_markdown-quote-dark.svg @@ -5,21 +5,23 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + id="defs33410" /> diff --git a/data/icons/hicolor_actions_scalable_markdown-quote.svg b/data/icons/hicolor_actions_scalable_markdown-quote.svg index 3b301881d3..161e13ff64 100644 --- a/data/icons/hicolor_actions_scalable_markdown-quote.svg +++ b/data/icons/hicolor_actions_scalable_markdown-quote.svg @@ -5,21 +5,23 @@ version="1.1" id="svg33406" xml:space="preserve" - width="24" - height="24" - viewBox="0 0 24 24" + width="20" + height="20" + viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + id="defs33410" /> diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in b/data/org.gnome.evolution.calendar.gschema.xml.in index a8a2787ac3..0703e95aac 100644 --- a/data/org.gnome.evolution.calendar.gschema.xml.in +++ b/data/org.gnome.evolution.calendar.gschema.xml.in @@ -471,6 +471,10 @@ [] <_summary>User-defined reminder times, in minutes + + false + <_summary>Whether to use markdown editor for the description in the component editor. + diff --git a/src/calendar/gui/e-comp-editor-property-part.c b/src/calendar/gui/e-comp-editor-property-part.c index 14bb9b408d..6bed833b12 100644 --- a/src/calendar/gui/e-comp-editor-property-part.c +++ b/src/calendar/gui/e-comp-editor-property-part.c @@ -378,8 +378,7 @@ ecepp_string_create_widgets (ECompEditorPropertyPart *property_part, klass = E_COMP_EDITOR_PROPERTY_PART_STRING_GET_CLASS (property_part); g_return_if_fail (klass != NULL); - g_return_if_fail (g_type_is_a (klass->entry_type, GTK_TYPE_ENTRY) || - g_type_is_a (klass->entry_type, GTK_TYPE_TEXT_VIEW)); + g_return_if_fail (klass->entry_type > 0); /* The descendant sets the 'out_label_widget' parameter */ *out_edit_widget = g_object_new (klass->entry_type, NULL); diff --git a/src/calendar/gui/e-comp-editor-property-parts.c b/src/calendar/gui/e-comp-editor-property-parts.c index 99e993dbb9..b14c2c7fd6 100644 --- a/src/calendar/gui/e-comp-editor-property-parts.c +++ b/src/calendar/gui/e-comp-editor-property-parts.c @@ -608,9 +608,19 @@ G_DEFINE_TYPE (ECompEditorPropertyPartDescription, e_comp_editor_property_part_d static GtkWidget * ecepp_description_get_real_edit_widget (ECompEditorPropertyPartString *part_string) { + ECompEditorPropertyPartDescription *description_part; + g_return_val_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (part_string), NULL); - return E_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (part_string)->real_edit_widget; + description_part = E_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (part_string); + + if (!description_part->real_edit_widget) + return NULL; + + if (E_IS_MARKDOWN_EDITOR (description_part->real_edit_widget)) + return GTK_WIDGET (e_markdown_editor_get_text_view (E_MARKDOWN_EDITOR (description_part->real_edit_widget))); + + return description_part->real_edit_widget; } static void @@ -681,6 +691,25 @@ ecepp_description_flip_view_as_cb (GtkLabel *label, return TRUE; } +static void +ecepp_description_changed_cb (GtkWidget *widget, + gpointer user_data) +{ + ECompEditorPropertyPartDescription *description_part = user_data; + + g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (description_part)); + + if (description_part->has_html) { + description_part->has_html = FALSE; + description_part->mode_html = TRUE; + g_clear_pointer (&description_part->alt_desc, g_free); + + ecepp_description_update_view_mode (description_part); + } + + e_comp_editor_property_part_emit_changed (E_COMP_EDITOR_PROPERTY_PART (description_part)); +} + static void ecepp_description_create_widgets (ECompEditorPropertyPart *property_part, GtkWidget **out_label_widget, @@ -688,7 +717,7 @@ ecepp_description_create_widgets (ECompEditorPropertyPart *property_part, { ECompEditorPropertyPartClass *part_class; ECompEditorPropertyPartDescription *description_part; - GtkTextView *text_view; + GSettings *settings; GtkWidget *box, *label; g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (property_part)); @@ -703,9 +732,38 @@ ecepp_description_create_widgets (ECompEditorPropertyPart *property_part, *out_label_widget = NULL; - part_class->create_widgets (property_part, out_label_widget, out_edit_widget); - g_return_if_fail (*out_label_widget == NULL); - g_return_if_fail (*out_edit_widget != NULL); + settings = e_util_ref_settings ("org.gnome.evolution.calendar"); + + if (g_settings_get_boolean (settings, "use-markdown-editor")) { + *out_edit_widget = e_markdown_editor_new (); + + g_object_set (G_OBJECT (*out_edit_widget), + "hexpand", FALSE, + "halign", GTK_ALIGN_FILL, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "visible", TRUE, + NULL); + + g_signal_connect_object (*out_edit_widget, "changed", G_CALLBACK (ecepp_description_changed_cb), description_part, 0); + } else { + GtkTextView *text_view; + + part_class->create_widgets (property_part, out_label_widget, out_edit_widget); + g_return_if_fail (*out_label_widget == NULL); + g_return_if_fail (*out_edit_widget != NULL); + + text_view = GTK_TEXT_VIEW (gtk_bin_get_child (GTK_BIN (*out_edit_widget))); + gtk_text_view_set_wrap_mode (text_view, GTK_WRAP_WORD); + gtk_text_view_set_monospace (text_view, TRUE); + e_buffer_tagger_connect (text_view); + e_spell_text_view_attach (text_view); + + g_signal_connect_object (gtk_text_view_get_buffer (text_view), "changed", + G_CALLBACK (ecepp_description_changed_cb), description_part, 0); + } + + g_clear_object (&settings); description_part->real_edit_widget = *out_edit_widget; @@ -714,12 +772,6 @@ ecepp_description_create_widgets (ECompEditorPropertyPart *property_part, description_part->description_label = label; - text_view = GTK_TEXT_VIEW (gtk_bin_get_child (GTK_BIN (*out_edit_widget))); - gtk_text_view_set_wrap_mode (text_view, GTK_WRAP_WORD); - gtk_text_view_set_monospace (text_view, TRUE); - e_buffer_tagger_connect (text_view); - e_spell_text_view_attach (text_view); - g_object_set (G_OBJECT (label), "hexpand", FALSE, "halign", GTK_ALIGN_END, @@ -850,7 +902,8 @@ ecepp_description_fill_widget (ECompEditorPropertyPart *property_part, edit_widget = e_comp_editor_property_part_string_get_real_edit_widget (E_COMP_EDITOR_PROPERTY_PART_STRING (property_part)); g_return_if_fail (GTK_IS_TEXT_VIEW (edit_widget)); - e_buffer_tagger_update_tags (GTK_TEXT_VIEW (edit_widget)); + if (!E_IS_MARKDOWN_EDITOR (description_part->real_edit_widget)) + e_buffer_tagger_update_tags (GTK_TEXT_VIEW (edit_widget)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (edit_widget)); gtk_text_buffer_get_start_iter (buffer, &text_iter_start); @@ -910,6 +963,11 @@ ecepp_description_fill_component (ECompEditorPropertyPart *property_part, ICalComponent *component) { ECompEditorPropertyPartClass *part_class; + ECompEditorPropertyPartDescription *description_part; + + g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (property_part)); + + description_part = E_COMP_EDITOR_PROPERTY_PART_DESCRIPTION (property_part); part_class = E_COMP_EDITOR_PROPERTY_PART_CLASS (e_comp_editor_property_part_description_parent_class); g_return_if_fail (part_class != NULL); @@ -920,6 +978,27 @@ ecepp_description_fill_component (ECompEditorPropertyPart *property_part, while (e_cal_util_component_remove_x_property (component, "X-ALT-DESC")) { /* Remove all of them, not only text/html, they are obsolete now */ } + + if (E_IS_MARKDOWN_EDITOR (description_part->real_edit_widget)) { + gchar *html; + + html = e_markdown_editor_dup_html (E_MARKDOWN_EDITOR (description_part->real_edit_widget)); + + if (html && *html) { + ICalProperty *prop; + ICalParameter *param; + + prop = i_cal_property_new_x (html); + i_cal_property_set_x_name (prop, "X-ALT-DESC"); + + param = i_cal_parameter_new_fmttype ("text/html"); + i_cal_property_take_parameter (prop, param); + + i_cal_component_take_property (component, prop); + } + + g_free (html); + } } static void diff --git a/src/e-util/e-markdown-editor.c b/src/e-util/e-markdown-editor.c index dfefde101a..08d4db5bee 100644 --- a/src/e-util/e-markdown-editor.c +++ b/src/e-util/e-markdown-editor.c @@ -25,10 +25,18 @@ struct _EMarkdownEditorPrivate { GtkTextView *text_view; EWebView *web_view; GtkToolbar *action_toolbar; + gboolean is_dark_theme; }; G_DEFINE_TYPE_WITH_PRIVATE (EMarkdownEditor, e_markdown_editor, GTK_TYPE_BOX) +enum { + CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + static void e_markdown_editor_get_selection (EMarkdownEditor *self, GtkTextIter *out_start, @@ -126,7 +134,7 @@ e_markdown_editor_add_italic_text_cb (GtkToolButton *button, g_return_if_fail (E_IS_MARKDOWN_EDITOR (self)); - e_markdown_editor_surround_selection (self, FALSE, "*", "*"); + e_markdown_editor_surround_selection (self, FALSE, "_", "_"); } static void @@ -302,10 +310,23 @@ e_markdown_editor_switch_page_cb (GtkNotebook *notebook, EMarkdownEditor *self = user_data; gchar *converted; gchar *html; + gint n_items, ii; g_return_if_fail (E_IS_MARKDOWN_EDITOR (self)); - gtk_widget_set_visible (GTK_WIDGET (self->priv->action_toolbar), page_num != 1); + n_items = gtk_toolbar_get_n_items (self->priv->action_toolbar); + + for (ii = 0; ii < n_items; ii++) { + GtkToolItem *item = gtk_toolbar_get_nth_item (self->priv->action_toolbar, ii); + + if (item) { + GtkWidget *widget = GTK_WIDGET (item); + + /* Keep only the help button and hide any other */ + if (g_strcmp0 (gtk_widget_get_name (widget), "markdown-help") != 0) + gtk_widget_set_visible (widget, page_num != 1); + } + } /* Not the Preview page */ if (page_num != 1) @@ -328,10 +349,14 @@ e_markdown_editor_switch_page_cb (GtkNotebook *notebook, static gboolean e_markdown_editor_is_dark_theme (EMarkdownEditor *self) { + GtkStyleContext *style_context; GdkRGBA rgba; gdouble brightness; - e_utils_get_theme_color (GTK_WIDGET (self), "theme_text_color,theme_fg_color", E_UTILS_DEFAULT_THEME_TEXT_COLOR, &rgba); + g_return_val_if_fail (self->priv->action_toolbar != NULL, FALSE); + + style_context = gtk_widget_get_style_context (GTK_WIDGET (self->priv->action_toolbar)); + gtk_style_context_get_color (style_context, gtk_style_context_get_state (style_context), &rgba); brightness = (0.2109 * 255.0 * rgba.red) + @@ -341,33 +366,128 @@ e_markdown_editor_is_dark_theme (EMarkdownEditor *self) return brightness > 140; } +struct _toolbar_items { + const gchar *label; + const gchar *icon_name; + const gchar *icon_name_dark; + GCallback callback; +}; + +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 (NULL, "", NULL), + ITEM (N_("Open online common mark documentation"), "markdown-help", G_CALLBACK (e_markdown_editor_markdown_syntax_cb)) + #undef ITEM +}; + +static void +e_markdown_editor_style_updated_cb (GtkWidget *widget, + gpointer user_data) +{ + EMarkdownEditor *self; + gboolean is_dark_theme; + + g_return_if_fail (E_IS_MARKDOWN_EDITOR (widget)); + + self = E_MARKDOWN_EDITOR (widget); + is_dark_theme = e_markdown_editor_is_dark_theme (self); + + if (self->priv->is_dark_theme != is_dark_theme) { + gint n_items, ii, jj, idx = 0; + + self->priv->is_dark_theme = is_dark_theme; + + n_items = gtk_toolbar_get_n_items (self->priv->action_toolbar); + + for (ii = 0; ii < n_items; ii++) { + GtkToolItem *item = gtk_toolbar_get_nth_item (self->priv->action_toolbar, ii); + const gchar *name; + + if (!item || !GTK_IS_TOOL_BUTTON (item)) + continue; + + name = gtk_widget_get_name (GTK_WIDGET (item)); + + if (!name || !*name) + continue; + + for (jj = 0; jj < G_N_ELEMENTS (toolbar_items); jj++) { + gint index = (jj + idx) % G_N_ELEMENTS (toolbar_items); + + if (g_strcmp0 (name, toolbar_items[index].icon_name) == 0) { + const gchar *icon_name = is_dark_theme ? toolbar_items[index].icon_name_dark : toolbar_items[index].icon_name; + + if (icon_name) { + GtkWidget *icon_widget = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON (item)); + + if (icon_widget) + gtk_image_set_from_icon_name (GTK_IMAGE (icon_widget), icon_name, GTK_ICON_SIZE_SMALL_TOOLBAR); + else + gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (item), icon_name); + } + + idx = jj + 1; + break; + } + } + } + } +} + +static void +e_markdown_editor_notify_editable_cb (GObject *object, + GParamSpec *param, + gpointer user_data) +{ + EMarkdownEditor *self = user_data; + gboolean sensitive = FALSE; + gint n_items, ii; + + g_return_if_fail (E_IS_MARKDOWN_EDITOR (self)); + + g_object_get (object, "editable", &sensitive, NULL); + + n_items = gtk_toolbar_get_n_items (self->priv->action_toolbar); + + for (ii = 0; ii < n_items; ii++) { + GtkToolItem *item = gtk_toolbar_get_nth_item (self->priv->action_toolbar, ii); + + if (item) { + GtkWidget *widget = GTK_WIDGET (item); + + /* Keep only the help button and hide any other */ + if (g_strcmp0 (gtk_widget_get_name (widget), "markdown-help") != 0) + gtk_widget_set_sensitive (widget, sensitive); + } + } +} + +static void +e_markdown_editor_text_view_changed_cb (GtkTextView *text_view, + gpointer user_data) +{ + EMarkdownEditor *self = user_data; + + g_return_if_fail (E_IS_MARKDOWN_EDITOR (self)); + + g_signal_emit (self, signals[CHANGED], 0, NULL); +} + static void e_markdown_editor_constructed (GObject *object) { - struct _items { - const gchar *label; - const gchar *icon_name; - const gchar *icon_name_dark; - GCallback callback; - } 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 (NULL, "", NULL), - ITEM (N_("Open online common mark documentation"), "markdown-help", G_CALLBACK (e_markdown_editor_markdown_syntax_cb)) - #undef ITEM - }; EMarkdownEditor *self = E_MARKDOWN_EDITOR (object); GtkWidget *widget; GtkNotebook *notebook; GtkScrolledWindow *scrolled_window; - gboolean is_dark_theme; guint ii; /* Chain up to parent's method. */ @@ -380,7 +500,7 @@ e_markdown_editor_constructed (GObject *object) "valign", GTK_ALIGN_FILL, "vexpand", TRUE, "visible", TRUE, - "show-border", FALSE, + "show-border", TRUE, "show-tabs", TRUE, NULL); gtk_box_pack_start (GTK_BOX (self), widget, TRUE, TRUE, 0); @@ -453,26 +573,27 @@ e_markdown_editor_constructed (GObject *object) #endif /* HAVE_MARKDOWN */ widget = gtk_toolbar_new (); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (widget), GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show (widget); gtk_notebook_set_action_widget (notebook, widget, GTK_PACK_END); self->priv->action_toolbar = GTK_TOOLBAR (widget); + self->priv->is_dark_theme = e_markdown_editor_is_dark_theme (self); - is_dark_theme = e_markdown_editor_is_dark_theme (self); - - for (ii = 0; ii < G_N_ELEMENTS (items); ii++) { + for (ii = 0; ii < G_N_ELEMENTS (toolbar_items); ii++) { GtkToolItem *item; - if (items[ii].callback) { + if (toolbar_items[ii].callback) { GtkWidget *icon; const gchar *icon_name; - icon_name = is_dark_theme ? items[ii].icon_name_dark : items[ii].icon_name; - icon = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); + icon_name = self->priv->is_dark_theme ? toolbar_items[ii].icon_name_dark : toolbar_items[ii].icon_name; + icon = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show (GTK_WIDGET (icon)); - item = gtk_tool_button_new (icon, _(items[ii].label)); - gtk_tool_item_set_tooltip_text (item, _(items[ii].label)); - g_signal_connect_object (item, "clicked", items[ii].callback, self, 0); + 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); } else { item = gtk_separator_tool_item_new (); } @@ -484,6 +605,10 @@ e_markdown_editor_constructed (GObject *object) #ifdef HAVE_MARKDOWN g_signal_connect_object (notebook, "switch-page", G_CALLBACK (e_markdown_editor_switch_page_cb), self, 0); #endif + + g_signal_connect (self, "style-updated", G_CALLBACK (e_markdown_editor_style_updated_cb), NULL); + g_signal_connect_object (gtk_text_view_get_buffer (self->priv->text_view), "changed", G_CALLBACK (e_markdown_editor_text_view_changed_cb), self, 0); + e_signal_connect_notify_object (self->priv->text_view, "notify::editable", G_CALLBACK (e_markdown_editor_notify_editable_cb), self, 0); } static void @@ -493,6 +618,23 @@ e_markdown_editor_class_init (EMarkdownEditorClass *klass) object_class = G_OBJECT_CLASS (klass); object_class->constructed = e_markdown_editor_constructed; + + /** + * EMarkdownEditor::changed: + * @self: an #EMarkdownEditor, which sent the signal + * + * This signal is emitted the content of the @self changes. + * + * Since: 3.44 + **/ + signals[CHANGED] = g_signal_new ( + "changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0, + G_TYPE_NONE); } static void @@ -516,6 +658,39 @@ e_markdown_editor_new (void) return g_object_new (E_TYPE_MARKDOWN_EDITOR, NULL); } +/** + * e_markdown_editor_get_text_view: + * @self: an #EMarkdownEditor + * + * Returns: (transfer none): a #GtkTextView of the @self + * + * Since: 3.44 + **/ +GtkTextView * +e_markdown_editor_get_text_view (EMarkdownEditor *self) +{ + g_return_val_if_fail (E_IS_MARKDOWN_EDITOR (self), NULL); + + return self->priv->text_view; +} + +/** + * e_markdown_editor_get_action_toolbar: + * @self: an #EMarkdownEditor + * + * Returns: (transfer none): a #GtkToolbar of the @self, where the caller + * can add its own action buttons. + * + * Since: 3.44 + **/ +GtkToolbar * +e_markdown_editor_get_action_toolbar (EMarkdownEditor *self) +{ + g_return_val_if_fail (E_IS_MARKDOWN_EDITOR (self), NULL); + + return self->priv->action_toolbar; +} + /** * e_markdown_editor_dup_text: * @self: an #EMarkdownEditor diff --git a/src/e-util/e-markdown-editor.h b/src/e-util/e-markdown-editor.h index 4369e7c25e..0cacea1493 100644 --- a/src/e-util/e-markdown-editor.h +++ b/src/e-util/e-markdown-editor.h @@ -49,6 +49,8 @@ struct _EMarkdownEditorClass { GType e_markdown_editor_get_type (void) G_GNUC_CONST; GtkWidget * e_markdown_editor_new (void); +GtkTextView * e_markdown_editor_get_text_view (EMarkdownEditor *self); +GtkToolbar * e_markdown_editor_get_action_toolbar (EMarkdownEditor *self); gchar * e_markdown_editor_dup_text (EMarkdownEditor *self); gchar * e_markdown_editor_dup_html (EMarkdownEditor *self); diff --git a/src/modules/calendar/e-calendar-preferences.c b/src/modules/calendar/e-calendar-preferences.c index 905c0e2e12..7440f09d6e 100644 --- a/src/modules/calendar/e-calendar-preferences.c +++ b/src/modules/calendar/e-calendar-preferences.c @@ -898,6 +898,12 @@ calendar_preferences_construct (ECalendarPreferences *prefs, widget, "active", G_SETTINGS_BIND_DEFAULT); + widget = e_builder_get_widget (prefs->priv->builder, "use-markdown-editor"); + g_settings_bind ( + settings, "use-markdown-editor", + widget, "active", + G_SETTINGS_BIND_DEFAULT); + /* These settings control the "Birthdays & Anniversaries" backend. */ eds_settings = diff --git a/src/modules/calendar/e-calendar-preferences.ui b/src/modules/calendar/e-calendar-preferences.ui index 2d10e26b32..10806c032b 100644 --- a/src/modules/calendar/e-calendar-preferences.ui +++ b/src/modules/calendar/e-calendar-preferences.ui @@ -790,6 +790,22 @@ 7 + + + Use ma_rkdown for Description in the component editor + True + True + False + 12 + True + True + + + False + False + 8 + + True @@ -798,7 +814,7 @@ True True - 8 + 9