ui/gtk/image.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 112
c3f2f16fa4b8
--- a/ui/gtk/image.c	Sat Apr 05 17:57:04 2025 +0200
+++ b/ui/gtk/image.c	Sun Jul 20 22:04:39 2025 +0200
@@ -63,7 +63,7 @@
 
 #endif
 
-UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs args) {
+UIWIDGET ui_imageviewer_create(UiObject *obj, UiImageViewerArgs *args) {
     UiObject *current = uic_current_obj(obj);
     
     GtkWidget *drawingarea = gtk_drawing_area_new();
@@ -78,10 +78,10 @@
     widget = eventbox;
 #endif
     
-    if(args.scrollarea) {
+    if(args->scrollarea) {
         toplevel = SCROLLEDWINDOW_NEW();
         SCROLLEDWINDOW_SET_CHILD(toplevel, widget);
-        args.adjustwidgetsize = TRUE;
+        args->adjustwidgetsize = TRUE;
     } else {
         toplevel = widget;
     }
@@ -89,29 +89,29 @@
     UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer));
     memset(imgviewer, 0, sizeof(UiImageViewer));
     imgviewer->obj = obj;
-    imgviewer->onbuttonpress = args.onbuttonpress;
-    imgviewer->onbuttonpressdata = args.onbuttonpressdata;
-    imgviewer->onbuttonrelease = args.onbuttonrelease;
-    imgviewer->onbuttonreleasedata = args.onbuttonreleasedata;
-    if(args.image_padding > 0) {
-        imgviewer->padding_left = args.image_padding;
-        imgviewer->padding_right = args.image_padding;
-        imgviewer->padding_top = args.image_padding;
-        imgviewer->padding_bottom = args.image_padding;
+    imgviewer->onbuttonpress = args->onbuttonpress;
+    imgviewer->onbuttonpressdata = args->onbuttonpressdata;
+    imgviewer->onbuttonrelease = args->onbuttonrelease;
+    imgviewer->onbuttonreleasedata = args->onbuttonreleasedata;
+    if(args->image_padding > 0) {
+        imgviewer->padding_left = args->image_padding;
+        imgviewer->padding_right = args->image_padding;
+        imgviewer->padding_top = args->image_padding;
+        imgviewer->padding_bottom = args->image_padding;
     } else {
-        imgviewer->padding_left = args.image_padding_left;
-        imgviewer->padding_right = args.image_padding_right;
-        imgviewer->padding_top = args.image_padding_top;
-        imgviewer->padding_bottom = args.image_padding_bottom;
+        imgviewer->padding_left = args->image_padding_left;
+        imgviewer->padding_right = args->image_padding_right;
+        imgviewer->padding_top = args->image_padding_top;
+        imgviewer->padding_bottom = args->image_padding_bottom;
     }
-    imgviewer->adjustwidgetsize = args.adjustwidgetsize;
-    imgviewer->autoscale = args.autoscale;
-    imgviewer->useradjustable = args.useradjustable;
+    imgviewer->adjustwidgetsize = args->adjustwidgetsize;
+    imgviewer->autoscale = args->autoscale;
+    imgviewer->useradjustable = args->useradjustable;
     imgviewer->zoom_scale = 20;
     
     g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy);
     
-    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC);
+    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_GENERIC);
     imgviewer->var = var;
     imgviewer->widget = drawingarea;
     
@@ -136,7 +136,7 @@
             imgviewer,
             NULL);
     
-    if(args.useradjustable) {
+    if(args->useradjustable) {
         gtk_widget_set_focusable(drawingarea, TRUE);
     }
     
@@ -182,13 +182,13 @@
 
 #endif
     
-    if(args.contextmenu) {
-        UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget);
+    if(args->contextmenu) {
+        UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, widget);
         ui_widget_set_contextmenu(widget, menu);
     }
        
-    UI_APPLY_LAYOUT1(current, args);
-    current->container->add(current->container, toplevel, TRUE);
+    UI_APPLY_LAYOUT2(current, args);
+    current->container->add(current->container, toplevel);
     
     return toplevel;
 }
@@ -336,6 +336,28 @@
         g_object_unref(pixbuf);
     } else {
         obj->value = pixbuf;
+        obj->type = UI_IMAGE_OBJECT_TYPE;
+    }
+          
+    return 0;
+}
+
+UIEXPORT int ui_image_load_data(UiGeneric *obj, const void *imgdata, size_t size) {
+    GBytes *bytes = g_bytes_new_static(imgdata, size);
+    GInputStream *in = g_memory_input_stream_new_from_bytes(bytes);
+    GError *error = NULL;
+    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_stream(in, NULL, &error);
+    g_object_unref(in);
+    if(!pixbuf) {
+        return 1;
+    }
+    
+    if(obj->set) {
+        obj->set(obj, pixbuf, UI_IMAGE_OBJECT_TYPE);
+        g_object_unref(pixbuf);
+    } else {
+        obj->value = pixbuf;
+        obj->type = UI_IMAGE_OBJECT_TYPE;
     }
           
     return 0;
@@ -416,6 +438,7 @@
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
     event.eventdata = NULL;
+    event.eventdatatype = 0;
     event.intval = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture));
     event.set = 0;
     callback(&event, userdata);

mercurial