--- deliantra/Deliantra-Client/DC/UI.pm 2006/12/09 02:21:25 1.361 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/04/12 07:53:31 1.365 @@ -3,7 +3,6 @@ use utf8; use strict; -use Scalar::Util (); use List::Util (); use Event; @@ -237,7 +236,7 @@ @_ }, $class; - Scalar::Util::weaken ($CFPlus::UI::WIDGET{$self+0} = $self); + CFPlus::weaken ($CFPlus::UI::WIDGET{$self+0} = $self); for (keys %$self) { if (/^on_(.*)$/) { @@ -532,10 +531,15 @@ #warn +(caller(1))[3] . "emit $signal on $self (parent $self->{parent})\n";#d# - #d##TODO# stop propagating at first true, do not use sum - (List::Util::sum map $_->($self, @args, @append), @{$self->{signal_cb}{$signal} || []}) # before - || ($self->can ("invoke_$signal") || sub { 1 })->($self, @args, @append) # closure - || ($self->{parent} && $self->{parent}->emit ($signal, @args)) # parent + for my $cb ( + @{$self->{signal_cb}{$signal} || []}, # before + ($self->can ("invoke_$signal") || sub { 1 }), # closure + ) { + return $cb->($self, @args, @append) || next; + } + + # parent + $self->{parent} && $self->{parent}->emit ($signal, @args) } sub find_widget { @@ -553,7 +557,7 @@ sub set_parent { my ($self, $parent) = @_; - Scalar::Util::weaken ($self->{parent} = $parent); + CFPlus::weaken ($self->{parent} = $parent); $self->set_visible if $parent->{visible}; } @@ -642,6 +646,7 @@ warn "no draw defined for $self\n"; } +my $cntx;#d# sub DESTROY { my ($self) = @_; @@ -1973,15 +1978,25 @@ } elsif ($sym == CFPlus::SDLK_RIGHT) { ++$self->{cursor} if $self->{cursor} < length $self->{text}; } elsif ($sym == CFPlus::SDLK_HOME) { - $self->{cursor} = 0; + # what a hack + $self->{cursor} = + (substr $self->{text}, 0, $self->{cursor}) =~ /^(.*\012)/ + ? length $1 + : 0; } elsif ($sym == CFPlus::SDLK_END) { - $self->{cursor} = length $text; + # uh, again + $self->{cursor} = + (substr $self->{text}, $self->{cursor}) =~ /^([^\012]*)\012/ + ? $self->{cursor} + length $1 + : length $self->{text}; } elsif ($uni == 21) { # ctrl-u $text = ""; $self->{cursor} = 0; } elsif ($uni == 27) { $self->emit ('escape'); - } elsif ($uni >= 0x20 || $uni == 0x0d) { + } elsif ($uni == 0x0d) { + substr $text, $self->{cursor}++, 0, "\012"; + } elsif ($uni >= 0x20) { substr $text, $self->{cursor}++, 0, chr $uni; } else { return 0; @@ -2312,7 +2327,7 @@ $self->{tex} ||= $texture_cache{$self->{path}} ||= new_from_file CFPlus::Texture CFPlus::find_rcfile $self->{path}, mipmap => 1; - Scalar::Util::weaken $texture_cache{$self->{path}}; + CFPlus::weaken $texture_cache{$self->{path}}; $self->{aspect} ||= $self->{tex}{w} / $self->{tex}{h}; @@ -2695,7 +2710,9 @@ my $delta = $self->{vertical} ? $ev->{dy} : $ev->{dx}; - $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * 0.2); + my $pagepart = $ev->{mod} & CFPlus::KMOD_SHIFT ? 1 : 0.2; + + $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * $pagepart); ! ! $delta } @@ -2815,6 +2832,7 @@ layout => (new CFPlus::Layout), par => [], + max_par => 0, height => 0, children => [ (new CFPlus::UI::Empty expand => 1), @@ -2949,6 +2967,10 @@ push @{$self->{par}}, $para; } + if (my $max = $self->{max_par}) { + shift @{$self->{par}} while @{$self->{par}} > $max; + } + $self->{need_reflow}++; $self->update; } @@ -3270,7 +3292,7 @@ ); if ($self->{anim} && $self->{animspeed}) { - Scalar::Util::weaken (my $widget = $self); + CFPlus::weaken (my $widget = $self); $self->{timer} = Event->timer ( at => $self->{animspeed} * int $::NOW / $self->{animspeed}, @@ -3534,7 +3556,7 @@ sub add { my ($self, $title, $widget, $tooltip) = @_; - Scalar::Util::weaken $self; + CFPlus::weaken $self; $self->{buttonbar}->add (new CFPlus::UI::Button markup => $title, @@ -3628,7 +3650,7 @@ @_, ); - Scalar::Util::weaken (my $this = $self); + CFPlus::weaken (my $this = $self); $self->{timer} = Event->timer (after => 1, interval => 1, cb => sub { $this->reorder }); @@ -3777,7 +3799,7 @@ @_, ); - Scalar::Util::weaken ($self->{root} = $self); + CFPlus::weaken ($self->{root} = $self); $self }