cxMapPut(markdown_tags, EDITOR_STYLE_HEADING5, &((MDTag){"##### ", NULL}));
cxMapPut(markdown_tags, EDITOR_STYLE_HEADING6, &((MDTag){"###### ", NULL}));
cxMapPut(markdown_tags, EDITOR_STYLE_CODE_BLOCK, &((MDTag){" ", NULL}));
- cxMapPut(markdown_tags, EDITOR_STYLE_LIST0, &((MDTag){" - ", NULL}));
cxMapPut(markdown_tags, EDITOR_STYLE_STRONG, &((MDTag){"**", "**"}));
cxMapPut(markdown_tags, EDITOR_STYLE_EMPHASIS, &((MDTag){"*", "*"}));
cxMapPut(markdown_tags, EDITOR_STYLE_CODE, &((MDTag){"`", "`"}));
pango_cairo_show_layout(cr, layout);
}
-void editor_insert_list(UiText *text, UiBool oredered) {
+static void md_serialize_list(EmbeddedWidget *em, CxBuffer *out) {
+ cxBufferPutString(out, " - ");
+}
+
+void editor_insert_list(UiText *text, UiBool ordered) {
GtkTextBuffer *buffer = text->data1;
NoteEditor *editor = g_object_get_data(text->obj, "editor");
GtkTextView *textview = GTK_TEXT_VIEW(editor->textview);
fprintf(stderr, "Error: no insert mark\n");
return;
}
- GtkTextIter start, end;
- gtk_text_buffer_get_iter_at_mark(buffer, &end, cursor);
-
- GtkTextMark *start_mark = gtk_text_buffer_create_mark(buffer, NULL, &end, TRUE);
PangoContext *context = gtk_widget_get_pango_context(editor->textview);
PangoFontMetrics *metrics = pango_context_get_metrics(context, NULL, NULL);
int descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
int height = pango_font_metrics_get_height(metrics) / PANGO_SCALE;
- //GtkWidget *widget = gtk_label_new("•");
GtkWidget *widget = gtk_drawing_area_new(); // •
gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(widget), draw_bulletlist, NULL, NULL);
-
gtk_widget_set_size_request(widget, 40, height);
//gtk_widget_add_css_class(widget, "ui_test");
gtk_widget_set_margin_bottom(widget, -descent);
gtk_widget_set_margin_start(widget, -40);
- GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, &end);
+ GtkTextIter iter;
+ gtk_text_buffer_get_iter_at_mark(buffer, &iter, cursor);
+ GtkTextMark *start_mark = gtk_text_buffer_create_mark(buffer, NULL, &iter, TRUE);
+
+ GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, &iter);
gtk_text_view_add_child_at_anchor(textview, widget, anchor);
+ // iter is updated to new position
+ GtkTextIter start;
gtk_text_buffer_get_iter_at_mark(buffer, &start, start_mark);
- gtk_text_buffer_apply_tag_by_name(buffer, EDITOR_STYLE_LIST0, &start, &end);
+ gtk_text_buffer_apply_tag_by_name(buffer, EDITOR_STYLE_LIST0, &start, &iter);
gtk_text_buffer_delete_mark(buffer, start_mark);
+
+ // remember widget/anchor
+ EmbeddedWidget *em = malloc(sizeof(EmbeddedWidget));
+ memset(em, 0, sizeof(EmbeddedWidget));
+#if GTK_MAJOR_VERSION < 4
+ gtk_widget_show_all(widget);
+#endif
+ em->widget = widget;
+ em->anchor = anchor;
+ em->serialize = md_serialize_list;
+ g_object_ref(widget);
+ g_object_ref(anchor);
+
+ g_object_set_data(G_OBJECT(anchor), "em", em);
+
+ BufferEmbeddedObjects *embedded_objects = g_object_get_data(G_OBJECT(buffer), "embedded");
+ cxListAdd(embedded_objects->objects, em);
}