--- deliantra/Deliantra-Client/DC/UI.pm 2009/01/11 03:19:47 1.473 +++ deliantra/Deliantra-Client/DC/UI.pm 2009/01/11 23:50:27 1.477 @@ -5,6 +5,8 @@ use List::Util (); +use Guard (); + use DC; use DC::Pod; use DC::Texture; @@ -532,7 +534,7 @@ push @{ $self->{signal_cb}{$signal} }, $cb; - defined wantarray and DC::guard { + defined wantarray and Guard::guard { @{ $self->{signal_cb}{$signal} } = grep $_ != $cb, @{ $self->{signal_cb}{$signal} }; } @@ -656,6 +658,13 @@ ) } +sub set_bg { + my ($self, $bg) = @_; + + $self->{bg} = $bg; + $self->update; +} + sub _draw { my ($self) = @_; @@ -2523,6 +2532,7 @@ my $class = shift; $class->SUPER::new ( + fontsize => 1, padding_x => 2, padding_y => 2, fg => [1, 1, 1], @@ -2538,7 +2548,7 @@ sub size_request { my ($self) = @_; - (6) x 2 + ($self->{fontsize} * $::FONTSIZE) x 2 } sub toggle { @@ -2940,12 +2950,13 @@ tooltip => sub { my ($self) = @_; - sprintf "%slevel %d\n%s points\n%s next level\n%s to go", + sprintf "%slevel %d\n%s points\n%s next level\n%s to go, %d%% done", $tt, $self->{lvl}, ::formsep ($self->{exp}), ::formsep ($self->{nxt}), ::formsep ($self->{nxt} - $self->{exp}), + $self->_percent * 100, }, ); @@ -2964,24 +2975,27 @@ $self->SUPER::DESTROY; } -sub set_value { - my ($self, $lvl, $exp) = @_; +sub _percent { + my ($self) = @_; - $self->{lvl} = $lvl; - $self->{exp} = $exp; + my $table = $::CONN && $::CONN->{exp_table} + or return -1; - my $v = -1; + my $l0 = $table->[$self->{lvl} - 1]; + my $l1 = $table->[$self->{lvl}]; - if ($::CONN && (my $table = $::CONN->{exp_table})) { - my $l0 = $table->[$lvl - 1]; - my $l1 = $table->[$lvl]; + $self->{nxt} = $l1; - $self->{nxt} = $l1; + ($self->{exp} - $l0) / ($l1 - $l0) +} - $v = ($exp - $l0) / ($l1 - $l0); - } +sub set_value { + my ($self, $lvl, $exp) = @_; - $self->SUPER::set_value ($v); + $self->{lvl} = $lvl; + $self->{exp} = $exp; + + $self->SUPER::set_value ($self->_percent); } ############################################################################# @@ -3721,27 +3735,7 @@ @_, ); - if ($self->{anim} && $self->{animspeed}) { - DC::weaken (my $widget = $self); - - $self->{animspeed} = List::Util::max 0.05, $self->{animspeed}; - $self->{timer} = EV::periodic_ns 0, $self->{animspeed}, undef, sub { - return unless $::CONN; - - my $w = $widget - or return; - - ++$w->{frame}; - $w->update_face; - - # somehow, $widget can go away - $w->update; - $w->update_timer; - }; - - $self->update_face; - $self->update_timer; - } + $self->update_anim; $self } @@ -3777,6 +3771,34 @@ } } +sub update_anim { + my ($self) = @_; + + if ($self->{anim} && $self->{animspeed}) { + DC::weaken (my $widget = $self); + + $self->{animspeed} = List::Util::max 0.05, $self->{animspeed}; + $self->{timer} = EV::periodic_ns 0, $self->{animspeed}, undef, sub { + return unless $::CONN; + + my $w = $widget + or return; + + ++$w->{frame}; + $w->update_face; + + # somehow, $widget can go away + $w->update; + $w->update_timer; + }; + + $self->update_face; + $self->update_timer; + } else { + delete $self->{timer}; + } +} + sub size_request { my ($self) = @_; @@ -3805,6 +3827,27 @@ $self->SUPER::update; } +sub set_face { + my ($self, $face) = @_; + + $self->{face} = $face; + $self->reconfigure; +} + +sub set_anim { + my ($self, $anim) = @_; + + $self->{anim} = $anim; + $self->update_anim; +} + +sub set_animspeed { + my ($self, $animspeed) = @_; + + $self->{animspeed} = $animspeed; + $self->update_anim; +} + sub invoke_visibility_change { my ($self) = @_; @@ -3910,7 +3953,13 @@ $self->{button} = $ev->{button}; $self->show; - $self->move_abs ($ev->{x} - $self->{w} * 0.5, $ev->{y} - $self->{h} * 0.5); + + my $x = $ev->{x}; + my $y = $ev->{y}; + + $self->{root}->on_post_alloc ($self => sub { + $self->move_abs ($x - $self->{w} * 0.25, $y - $self->{border} * $::FONTSIZE * .5); + }); 1 # so it can be used inside event handlers }