]> uap-core.de Git - note.git/commitdiff
add editor_insert_image function to remove code dup
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 20 Apr 2025 10:00:16 +0000 (12:00 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 20 Apr 2025 10:00:16 +0000 (12:00 +0200)
application/gtk-text.c

index b6e42590909904a2dc818f3c788959af903c47ed..5e9f01bd26ebd43f7be3198c5fe60b08b4148587 100644 (file)
@@ -294,6 +294,40 @@ void md_serialize_image(EmbeddedWidget *em, CxBuffer *out) {
     cx_bprintf(out, "![image](%s)", attachment->name);
 }
 
+static void editor_insert_image(NoteEditor *editor, Attachment *attachment, GtkTextIter *iter) {
+    GtkTextView *textview = GTK_TEXT_VIEW(editor->textview);
+    GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
+    
+    GdkPixbuf *pixbuf = attachment->ui->img->value;
+    if(!pixbuf) {
+        fprintf(stderr, "Error: editor_insert_image: no pixbuf\n");
+        return;
+    }
+    
+    GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, iter);
+    GtkWidget *image = embedded_image_create(pixbuf);
+    gtk_text_view_add_child_at_anchor(textview, image, anchor);
+#if GTK_MAJOR_VERSION < 4
+    gtk_widget_show_all(image);
+#endif
+    
+    // remember widget and store a reference in the textbuffer
+    // TODO: we need a cleanup strategy
+    EmbeddedWidget *em = malloc(sizeof(EmbeddedWidget));
+    em->widget = image;
+    em->anchor = anchor;
+    em->data1 = attachment;
+    em->data2 = NULL;
+    em->serialize = md_serialize_image;
+    g_object_ref(image);
+    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);
+}
+
 static void editor_attach_image(NoteEditor *editor, GdkPixbuf *pixbuf, char *attachment_path) {
     MainWindow *wdata = editor->obj->window;
     Resource *note = wdata->current_notebook->current_note;
@@ -319,28 +353,7 @@ static void editor_attach_image(NoteEditor *editor, GdkPixbuf *pixbuf, char *att
     GtkTextIter iter;
     gtk_text_buffer_get_iter_at_mark(buffer, &iter, cursor);
     
-    GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, &iter);
-    GtkWidget *image = embedded_image_create(pixbuf);
-    gtk_text_view_add_child_at_anchor(textview, image, anchor);
-#if GTK_MAJOR_VERSION < 4
-    gtk_widget_show_all(image);
-#endif
-      
-    // remember widget and store a reference in the textbuffer
-    // TODO: we need a cleanup strategy
-    EmbeddedWidget *em = malloc(sizeof(EmbeddedWidget));
-    em->widget = image;
-    em->anchor = anchor;
-    em->data1 = attachment;
-    em->data2 = NULL;
-    em->serialize = md_serialize_image;
-    g_object_ref(image);
-    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);
+    editor_insert_image(editor, attachment, &iter);
     
     // add attachment to note
     note_add_attachment(note, attachment);
@@ -713,6 +726,7 @@ void init_tagtable(GtkTextTagTable *table) {
 void editor_apply_styles(Resource *note, UIWIDGET textview, UiText *text, CxList /* MDDocStyleSection */ *styles) {
     GtkTextBuffer *buffer = text->data1;
     GtkTextTagTable *tagtable = gtk_text_buffer_get_tag_table(buffer);
+    NoteEditor *editor = g_object_get_data(G_OBJECT(textview), "editor");
     
     CxIterator i = cxListIterator(styles);
     cx_foreach(MDDocStyleSection*, sec, i) {
@@ -721,26 +735,9 @@ void editor_apply_styles(Resource *note, UIWIDGET textview, UiText *text, CxList
             if(attachment && attachment->ui->img->value) {
                 GdkPixbuf *pixbuf = attachment->ui->img->value;
                     
-                // TODO: remove code dup
                 GtkTextIter iter;
                 gtk_text_buffer_get_iter_at_offset(buffer, &iter, sec->pos);
-                GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(buffer, &iter);
-                GtkWidget *image = embedded_image_create(pixbuf);
-                gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(textview), image, anchor);
-
-                EmbeddedWidget *em = malloc(sizeof(EmbeddedWidget));
-                em->widget = image;
-                em->anchor = anchor;
-                em->data1 = attachment;
-                em->data2 = NULL;
-                em->serialize = md_serialize_image;
-                g_object_ref(image);
-                g_object_ref(anchor);
-
-                BufferEmbeddedObjects *embedded_objects = g_object_get_data(G_OBJECT(buffer), "embedded");
-                cxListAdd(embedded_objects->objects, em);
-
-                g_object_set_data(G_OBJECT(anchor), "em", em);
+                editor_insert_image(editor, attachment, &iter);
             } else {
                 // TODO: what do we do in this case?
             }