… | |
… | |
380 | } |
380 | } |
381 | |
381 | |
382 | sub set_parent { |
382 | sub set_parent { |
383 | my ($self, $parent) = @_; |
383 | my ($self, $parent) = @_; |
384 | |
384 | |
385 | $self->{_tree_depth} = $parent->{_tree_depth} + 1; |
|
|
386 | Scalar::Util::weaken ($self->{parent} = $parent); |
385 | Scalar::Util::weaken ($self->{parent} = $parent); |
|
|
386 | |
|
|
387 | $self->check_size |
|
|
388 | unless exists $self->{req_w}; |
387 | } |
389 | } |
388 | |
390 | |
389 | sub check_size { |
391 | sub check_size { |
390 | my ($self) = @_; |
392 | my ($self) = @_; |
391 | |
393 | |
… | |
… | |
506 | $self->{children} = [ |
508 | $self->{children} = [ |
507 | sort { $a->{z} <=> $b->{z} } |
509 | sort { $a->{z} <=> $b->{z} } |
508 | @{$self->{children}}, @widgets |
510 | @{$self->{children}}, @widgets |
509 | ]; |
511 | ]; |
510 | |
512 | |
511 | $_->check_size |
513 | $self->check_size; |
512 | for @widgets; |
|
|
513 | |
|
|
514 | $self->update; |
514 | $self->update; |
515 | } |
515 | } |
516 | |
516 | |
517 | sub children { |
517 | sub children { |
518 | @{ $_[0]{children} } |
518 | @{ $_[0]{children} } |
… | |
… | |
1212 | ) |
1212 | ) |
1213 | } |
1213 | } |
1214 | |
1214 | |
1215 | sub size_allocate { |
1215 | sub size_allocate { |
1216 | my ($self, $w, $h) = @_; |
1216 | my ($self, $w, $h) = @_; |
|
|
1217 | |
|
|
1218 | Carp::confess "negative size" if $w < 0 || $h < 0;#d# |
1217 | |
1219 | |
1218 | my $children = $self->{children}; |
1220 | my $children = $self->{children}; |
1219 | |
1221 | |
1220 | my @h = map $_->{req_h}, @$children; |
1222 | my @h = map $_->{req_h}, @$children; |
1221 | |
1223 | |
… | |
… | |
2773 | my ($w, $h) = $widget->{user_w} && $widget->{user_h} |
2775 | my ($w, $h) = $widget->{user_w} && $widget->{user_h} |
2774 | ? @$widget{qw(user_w user_h)} |
2776 | ? @$widget{qw(user_w user_h)} |
2775 | : $widget->size_request; |
2777 | : $widget->size_request; |
2776 | |
2778 | |
2777 | if ($w != $widget->{req_w} || $h != $widget->{req_h}) { |
2779 | if ($w != $widget->{req_w} || $h != $widget->{req_h}) { |
|
|
2780 | Carp::confess "$widget: size_request is negative" if $w < 0 || $h < 0;#d# |
|
|
2781 | |
2778 | $widget->{req_w} = $w; |
2782 | $widget->{req_w} = $w; |
2779 | $widget->{req_h} = $h; |
2783 | $widget->{req_h} = $h; |
2780 | |
2784 | |
2781 | $self->{size_alloc}{$widget} = [$widget, $widget->{w}, $widget->{h}]; |
2785 | $self->{size_alloc}{$widget} = [$widget, $widget->{w}, $widget->{h}]; |
2782 | |
2786 | |
… | |
… | |
2787 | } |
2791 | } |
2788 | |
2792 | |
2789 | while ($self->{size_alloc}) { |
2793 | while ($self->{size_alloc}) { |
2790 | for (values %{delete $self->{size_alloc}}) { |
2794 | for (values %{delete $self->{size_alloc}}) { |
2791 | my ($widget, $w, $h) = @$_; |
2795 | my ($widget, $w, $h) = @$_; |
|
|
2796 | |
|
|
2797 | $w = 0 if $w < 0; |
|
|
2798 | $h = 0 if $h < 0; |
2792 | |
2799 | |
2793 | $widget->{w} = $w; |
2800 | $widget->{w} = $w; |
2794 | $widget->{h} = $h; |
2801 | $widget->{h} = $h; |
2795 | $widget->size_allocate ($w, $h); |
2802 | $widget->size_allocate ($w, $h); |
2796 | $widget->emit (size_allocate => $w, $h); |
2803 | $widget->emit (size_allocate => $w, $h); |