--- deliantra/Deliantra-Client/DC/UI.pm 2006/06/23 20:28:20 1.310 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/06/24 00:24:09 1.313 @@ -337,6 +337,10 @@ Carp::confess "size_request is abstract"; } +sub baseline_shift { + 0 +} + sub configure { my ($self, $x, $y, $w, $h) = @_; @@ -537,8 +541,6 @@ # update screen rectangle local $draw_x = $draw_x + $self->{x}; local $draw_y = $draw_y + $self->{y}; - local $draw_w = $draw_x + $self->{w}; - local $draw_h = $draw_y + $self->{h}; # skip widgets that are entirely outside the drawing area return if ($draw_x + $self->{w} < 0) || ($draw_x >= $draw_w) @@ -1633,6 +1635,10 @@ @{ $self->{size_req} } } +sub baseline_shift { + $_[0]{layout}->descent +} + sub invoke_size_allocate { my ($self, $w, $h) = @_; @@ -2569,25 +2575,29 @@ $self->reflow; } -sub visible_children { +sub size_request { my ($self) = @_; - @{$self->{children}}[0,1] + my ($empty, $slider) = @{ $self->{children} }; + + local $self->{children} = [$empty, $slider]; + $self->SUPER::size_request } sub invoke_size_allocate { my ($self, $w, $h) = @_; - my (undef, undef, @other) = @{ $self->{children} }; + my ($empty, $slider, @other) = @{ $self->{children} }; $_->configure (@$_{qw(x y req_w req_h)}) for @other; $self->{layout}->set_font ($self->{font}) if $self->{font}; $self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE); - $self->{layout}->set_width ($self->{children}[0]{w}); + $self->{layout}->set_width ($empty->{w}); $self->{layout}->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $self->reflow; + local $self->{children} = [$empty, $slider]; $self->SUPER::invoke_size_allocate ($w, $h) } @@ -2597,11 +2607,17 @@ my $layout = $self->{layout}; $layout->set_font ($self->{font}) if $self->{font}; + $layout->set_foreground (@{$para->{fg}}); $layout->set_height ($self->{fontsize} * $::FONTSIZE); $layout->set_width ($self->{children}[0]{w} - $para->{indent}); $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $layout->set_markup ($para->{markup}); - $layout->set_shapes (map +($_->{req_w}, $_->{req_h}), @{$para->{widget}}); + + $layout->set_shapes ( + map + +(0, $_->baseline_shift +$_->{padding_y} - $_->{h}, $_->{w}, $_->{h}), + @{$para->{widget}} + ); $layout } @@ -2679,8 +2695,8 @@ my $layout = $self->get_layout ($para); my ($w, $h) = $layout->size; - $para->{w} = $w + $para->{indent}; - $para->{h} = $h; + $para->{w} = $w + $para->{indent}; + $para->{h} = $h; $para->{wrapped} = $layout->has_wrapped; } @@ -2728,6 +2744,7 @@ if (my @w = @{ $para->{widget} }) { my @s = $layout->get_shapes; + glDisable GL_BLEND; for (@w) { my ($dx, $dy) = splice @s, 0, 2, (); @@ -2736,6 +2753,8 @@ $_->draw; } + glEnable GL_BLEND; + glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; } }