From: Olaf Wintermann Date: Thu, 24 Apr 2025 18:15:50 +0000 (+0200) Subject: use EmbeddedWidget to save bullet point widgets X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=c375710b13267b62a068d472f659f3d18f8ea0d0;p=note.git use EmbeddedWidget to save bullet point widgets --- diff --git a/application/editor.h b/application/editor.h index b678633..ae4bb99 100644 --- a/application/editor.h +++ b/application/editor.h @@ -132,7 +132,7 @@ cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a); UiBool editor_set_style(UiText *text, const char *style, UiBool enabled); void editor_set_paragraph_style(UiText *text, const char *style); -void editor_insert_list(UiText *text, UiBool oredered); +void editor_insert_list(UiText *text, UiBool ordered); #if GTK_MAJOR_VERSION >= 4 GtkWidget* editor_gtk4_workaround(UiObject *obj, UiWidgetArgs args, void *userdata); diff --git a/application/gtk-text.c b/application/gtk-text.c index e6839c8..27a0818 100644 --- a/application/gtk-text.c +++ b/application/gtk-text.c @@ -124,7 +124,6 @@ void editor_global_init() { 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){"`", "`"})); @@ -1207,7 +1206,11 @@ static void draw_bulletlist( 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); @@ -1217,10 +1220,6 @@ void editor_insert_list(UiText *text, UiBool oredered) { 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); @@ -1229,19 +1228,40 @@ void editor_insert_list(UiText *text, UiBool oredered) { 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); }