The contents of the GtkPicture changes when a new image is downloaded. I’d like to fix the aspect ratio of the GtkPicture to a constant value, so that whenever a new picture is set as the GtkPicture’s paintable, it crops the image. I essentially want a fixed aspect ratio preview window, but I can’t figure out how to fix the size of the GtkPicture (or a parent widget, if that’s the right way to go about doing this).
Currently, if the GtkPicture is loaded with an image that has larger vertical size than horizontal size, the GtkPicture scales up when I resize my window, looking something like this:
As far as I know you probably want to use Gtk.Image. It is different to Gtk.Picture in that the size is defined by the application, and not the picture.
Gtk.Image is super fixed on size. That is even if the user resizes the window manually, it won’t scale with it. Maybe setting Gtk.Picture’s can-shrink property to true and content-fit property to COVER can do the job.
This is what I’m working on. I think some combination of using a GtkPicture and setting its paintable to a snapshot of a texture. I’ll be sure to share what I settle on when I figure it out.
OK, So, I tried a simple example with a Gtk.Picture being the only child of a Gtk.ApplicationWindow. Keeping everything the default and changing just the file property of the picture doesn’t resize the window. The Gdk.Paintable that was autogenerated by changing the file property had its STATIC_SIZE flag set. So, if whatever implementation of Gtk.Paintable you are using has a way to set that flag, doing so might help. Otherwise, just use Gio.File instead of Gdk.Paintable.
So I figured out that if I set the GtkPicture’s width-request and height-request properties to:
int width = int.min (300, texture.get_intrinsic_width ());
int height = int.min (200, texture.get_intrinsic_height ());
Then I can realistically expect a smallish size preview image that sets the size of the GtkPicture to exactly the size of the texture used as its paintable.