ui/gtk/image.c

changeset 532
80a6d8923d75
parent 530
7992a44fe719
child 533
951b92ce3708
--- a/ui/gtk/image.c	Sun Mar 30 10:14:27 2025 +0200
+++ b/ui/gtk/image.c	Sun Mar 30 10:37:35 2025 +0200
@@ -81,7 +81,7 @@
     if(args.scrollarea) {
         toplevel = SCROLLEDWINDOW_NEW();
         SCROLLEDWINDOW_SET_CHILD(toplevel, widget);
-        args.adjustsize = TRUE;
+        args.adjustwidgetsize = TRUE;
     } else {
         toplevel = widget;
     }
@@ -99,7 +99,7 @@
         imgviewer->padding_top = args.image_padding_top;
         imgviewer->padding_bottom = args.image_padding_bottom;
     }
-    imgviewer->adjustsize = args.adjustsize;
+    imgviewer->adjustwidgetsize = args.adjustwidgetsize;
     imgviewer->autoscale = args.autoscale;
     imgviewer->useradjustable = args.useradjustable;
     imgviewer->zoom_scale = 20;
@@ -182,6 +182,44 @@
     return toplevel;
 }
 
+static void imageviewer_reset(UiImageViewer *imgviewer) {
+    imgviewer->zoom = 0;
+    imgviewer->isautoscaled = FALSE;
+    imgviewer->transx = 0;
+    imgviewer->transy;
+    imgviewer->begin_transx = 0;
+    imgviewer->begin_transy = 0;
+    imgviewer->scale = 1;
+}
+
+UIWIDGET ui_imageviewer_reset(UIWIDGET w) {
+    UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
+    if(imgviewer) {
+        imageviewer_reset(imgviewer);
+        gtk_widget_queue_draw(w);
+    }
+}
+
+UIWIDGET ui_imageviewer_set_autoscale(UIWIDGET w, UiBool set) {
+    UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
+    if(imgviewer) {
+        imgviewer->autoscale = set;
+    }
+}
+
+UIWIDGET ui_imageviewer_set_adjustwidgetsize(UIWIDGET w, UiBool set) {
+    UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
+    if(imgviewer) {
+        imgviewer->adjustwidgetsize = set;
+    }
+}
+
+UIWIDGET ui_imageviewer_set_useradjustable(UIWIDGET w, UiBool set) {
+    UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
+    if(imgviewer) {
+        imgviewer->useradjustable = set;
+    }
+}
 
 void ui_cairo_draw_image(UiImageViewer *imgviewer, cairo_t *cr, int width, int height) {
     if(!imgviewer->pixbuf) {
@@ -195,12 +233,25 @@
     double dwidth = width;
     double dheight = height;
     double scale = 1;
-    if(imgviewer->autoscale) {
-        scale = dwidth / dpixwidth;
-        if(dpixheight * scale > dheight) {
-            scale = dheight / dpixheight;
+    // if autoscale is enabled, scale the image to fill available space
+    // if useradjustable is also enabled, the autoscaling is only done once
+    if(imgviewer->autoscale && imgviewer->scale != 0) {
+        if(!imgviewer->isautoscaled) {
+            scale = dwidth / dpixwidth;
+            if(dpixheight * scale > dheight) {
+                scale = dheight / dpixheight;
+            }
+
+            if(imgviewer->useradjustable) {
+                imgviewer->isautoscaled = TRUE;
+            }
+            
+            imgviewer->scale = scale;
+        } else {
+            scale = imgviewer->scale;
         }
     } else {
+        // user-adjusted scaling
         scale = 1 + ((double)imgviewer->zoom / (double)imgviewer->zoom_scale);
     }
 
@@ -217,8 +268,6 @@
     
     gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
     cairo_paint(cr);
-    
-    imgviewer->prev_scale = scale;
 }
 
 void* ui_imageviewer_get(UiGeneric *g) {
@@ -241,12 +290,14 @@
     UiImageViewer *imgviewer = g->obj;
     g->value = pixbuf;
     
+    imageviewer_reset(imgviewer);
+    
     if(imgviewer->pixbuf) {
         g_object_unref(imgviewer->pixbuf);
     }
     imgviewer->pixbuf = pixbuf;
     
-    if(imgviewer->adjustsize) {
+    if(imgviewer->adjustwidgetsize && !imgviewer->autoscale) {
         int width = gdk_pixbuf_get_width(pixbuf);
         int height = gdk_pixbuf_get_height(pixbuf);
         gtk_widget_set_size_request(imgviewer->widget, width, height);
@@ -288,6 +339,7 @@
         if(imgviewer->zoom < -imgviewer->zoom_scale) {
             imgviewer->zoom = -imgviewer->zoom_scale;
         }
+        imgviewer->scale = 0; // disable autoscale
         gtk_widget_queue_draw(imgviewer->widget);
         return TRUE;
     }

mercurial