--- deliantra/Deliantra-Client/DC/UI.pm 2006/08/14 01:21:02 1.346 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/08/14 03:41:28 1.347 @@ -1140,7 +1140,7 @@ if ((exists $arg{label}) && !ref $arg{label}) { $arg{label} = new CFPlus::UI::Label align => 1, - valign => 1, + valign => 0, text => $arg{label}, fontsize => ($arg{border} || 0.8) * 0.75; } @@ -2855,18 +2855,16 @@ sub current_paragraph { my ($self) = @_; - $self->force_uptodate; $self->{top_paragraph} - 1 } sub scroll_to { my ($self, $para) = @_; - $self->force_uptodate; - $para = List::Util::max 0, List::Util::min $#{$self->{par}}, $para; - $self->{children}[1]->set_value ($self->{par}[$para]{y}); + $self->{scroll_to} = $para; + $self->update; } sub clear { @@ -2905,7 +2903,7 @@ sub scroll_to_bottom { my ($self) = @_; - $self->{scroll_to_bottom} = 1; + $self->{scroll_to} = $#{$self->{par}}; $self->update; } @@ -2916,9 +2914,6 @@ my ($W, $H) = @{$self->{children}[0]}{qw(w h)}; my $height = 0; - my $paridx; - my $top_paragraph; - my $top = int $self->{children}[1]{range}[0]; for my $para (@{$self->{par}}) { if ($para->{w} != $W && ($para->{wrapped} || $para->{w} > $W)) { @@ -2931,23 +2926,17 @@ } $para->{y} = $height; - - $paridx++; - $top_paragraph ||= $paridx if $height >= $top; - $height += $para->{h}; } - $self->{top_paragraph} = $top_paragraph; $self->{height} = $height; - $self->{children}[1]->set_range ([$self->{children}[1]{range}[0], 0, $height, $H, 1]); delete $self->{texture}; } - if (delete $self->{scroll_to_bottom}) { - $self->{children}[1]->set_value (1e10); + if (my $paridx = delete $self->{scroll_to}) { + $self->{children}[1]->set_value ($self->{par}[$paridx]{y}); } } @@ -2971,6 +2960,10 @@ my $top = int $self->{children}[1]{range}[0]; + my $paridx = 0; + my $top_paragraph; + my $top = int $self->{children}[1]{range}[0]; + my $y0 = $top; my $y1 = $top + $H; @@ -2996,7 +2989,12 @@ } } } + + $paridx++; + $top_paragraph ||= $paridx if $y >= $top; } + + $self->{top_paragraph} = $top_paragraph; }; }); }