On Wed, May 11, 2005 at 13:55:35 +0200, Timo Schneider wrote:
I have a Gtk2::Gtk::Image wich contains a Gtk2::Gtk::Pixbuf displaying an Image larger than the the Gtk2::Gtk::Image. How can I resize and update the Pixbuf whenever the Image-widget resizes? I tried it with using the size_allocate signal, but this creates infinite loops because $image->set_from_pixbuf($pixbuf), which is called from my signal handler, itself emits an size_allocate signal. I tried it with using a timer, it worked, but this doesn't seem to be the best sollution.
Hm, I had this working somewhere. I should probably release it as
a Gtk::Ex::<something> (I already have it as a module, so I will just
have to give it all appropriate names).
For the unpatient, here is the idea:
You must override 2 signals, size_allocate AND size_request.
For the size allocate, is should go along:
sub _size_allocate {
my ($self, $new) = @_;
no warnings 'uninitialized';
if($self->{width} != $new->width ||
$self->{height} != $new->height) {
$self->{width} = $new->width;
$self->{height} = $new->height;
my $pixbuf = GetTheBitmapAtSize($self->{width}, $self->{height});
$self->set_from_pixbuf($pixbuf);
}
$self->signal_chain_from_overridden($new);
}
where the "GetTheBitmapAtSize" should be the right call to
Gtk::Gdk::Pixbuf->scale_simple (I have my own function there, so I don't recall
the exact arguments).
And for the size_request, simples thing to do is:
sub _size_request {
my ($self, $req) = @_;
$req->width(1);
$req->height(1);
}
In the code I have I have an attribute for minimal size and minimal
scale so I compute this in quite sophisticated ways, but this works for
the basics. You want the widget to be packed with expand on.
Note that I am not blocking any signals -- I simply check whether
I should actually resize the image and don't do anything if the
dimensions did not change. That's enough.
-------------------------------------------------------------------------------
Jan 'Bulb' Hudec <bulb ucw cz>
Attachment:
signature.asc
Description: Digital signature