]> uap-core.de Git - note.git/commitdiff
use EmbeddedWidget to save bullet point widgets
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 24 Apr 2025 18:15:50 +0000 (20:15 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 24 Apr 2025 18:15:50 +0000 (20:15 +0200)
application/editor.h
application/gtk-text.c

index b678633ab451deb079a7ab0988fe7a4a40d245f2..ae4bb996022e8588db828b2959967d351ba99290 100644 (file)
@@ -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);
index e6839c8253d683ce1c6a66ace3330046387978ee..27a0818ea1d3d152f57309f64d6b25d94008aca7 100644 (file)
@@ -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);
 }