From: Olaf Wintermann Date: Sun, 20 Apr 2025 10:00:16 +0000 (+0200) Subject: add editor_insert_image function to remove code dup X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=127d24b7f440aae88f30fe2a393952484c348fe8;p=note.git add editor_insert_image function to remove code dup --- diff --git a/application/gtk-text.c b/application/gtk-text.c index b6e4259..5e9f01b 100644 --- a/application/gtk-text.c +++ b/application/gtk-text.c @@ -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? }