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
+
+
+
+ False
+ False
+ 8
+
+