--- deliantra/Deliantra-Client/DC/UI.pm 2006/07/23 04:46:02 1.331 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/07/23 16:11:12 1.334 @@ -440,6 +440,8 @@ sub coord2global { my ($self, $x, $y) = @_; + Carp::confess unless $self->{parent};#d# + $self->{parent}->coord2global ($x + $self->{x}, $y + $self->{y}) } @@ -496,6 +498,11 @@ my ($self, $signal, $cb) = @_; push @{ $self->{signal_cb}{$signal} }, $cb; + + defined wantarray and CFClient::guard { + @{ $self->{signal_cb}{$signal} } = grep $_ != $cb, + @{ $self->{signal_cb}{$signal} }; + } } my %has_coords = ( @@ -508,6 +515,8 @@ sub emit { my ($self, $signal, @args) = @_; + # I do not really like this solution, but I dislike duplication + # and needlessly verbose code, too. my @append = $has_coords{$signal} ? $args[0]->xy ($self) @@ -724,6 +733,14 @@ $self } +sub realloc { + my ($self) = @_; + + $self->{force_realloc} = 1; + $self->{force_size_alloc} = 1; + $self->SUPER::realloc; +} + sub add { my ($self, @widgets) = @_; @@ -1349,11 +1366,16 @@ } sub add { - my ($self, $x, $y, $child) = @_; + my ($self) = shift; - $child->set_parent ($self); - $self->{children}[$y][$x] = $child; + while (@_) { + my ($x, $y, $child) = splice @_, 0, 3, (); + $child->set_parent ($self); + $self->{children}[$y][$x] = $child; + } + $self->{force_realloc} = 1; + $self->{force_size_alloc} = 1; $self->realloc; } @@ -1615,16 +1637,6 @@ $self } -sub escape($) { - local $_ = $_[0]; - - s/&/&/g; - s/>/>/g; - s/\n";#d# + + $self->{path} + or die "cannot serialise CFClient::UI::Image on non-loadable images\n"; + + $self->{path} +} + +sub STORABLE_attach { + my ($self, $cloning, $path) = @_; + warn "attach<@_>\n";#d# + + $self->new (path => $path) +} + sub size_request { my ($self) = @_; @@ -2206,7 +2236,7 @@ glEnable GL_TEXTURE_2D; glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; - $tex->draw_quad_alpha (0, 0, $w, $h); + $tex->draw_quad (0, 0, $w, $h); glDisable GL_TEXTURE_2D; } @@ -2508,7 +2538,7 @@ my $delta = $self->{vertical} ? $ev->{dy} : $ev->{dx}; - $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * 0.1); + $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * 0.2); ! ! $delta } @@ -2988,12 +3018,16 @@ my $widget = $self->{owner} or return; - my ($x, $y) = $widget->coord2global ($widget->{w}, 0); + if ($widget->{visible}) { + my ($x, $y) = $widget->coord2global ($widget->{w}, 0); - ($x, $y) = $widget->coord2global (-$self->{w}, 0) - if $x + $self->{w} > $self->{root}{w}; + ($x, $y) = $widget->coord2global (-$self->{w}, 0) + if $x + $self->{w} > $self->{root}{w}; - $self->move_abs ($x, $y); + $self->move_abs ($x, $y); + } else { + $self->hide; + } }); } @@ -3541,35 +3575,55 @@ my $self = $class->SUPER::new ( col_expand => [0, 1, 0], + items => [], @_, ); + $self->set_sort_order (undef); + $self } -sub set_items { - my ($self, $items) = @_; +sub update_items { + my ($self) = @_; $self->clear; - return unless $items; - - my @items = sort { - ($a->{type} <=> $b->{type}) - or ($a->{name} cmp $b->{name}) - } values %$items; - $self->{real_items} = \@items; + my @item = $self->{sort}->(@{ $self->{items} }); + my @adds; my $row = 0; - for my $item (@items) { + for my $item ($self->{sort}->(@{ $self->{items} })) { CFClient::Item::update_widgets $item; - $self->add (0, $row, $item->{face_widget}); - $self->add (1, $row, $item->{desc_widget}); - $self->add (2, $row, $item->{weight_widget}); + push @adds, 0, $row, $item->{face_widget}; + push @adds, 1, $row, $item->{desc_widget}; + push @adds, 2, $row, $item->{weight_widget}; $row++; } + + $self->add (@adds); +} + +sub set_sort_order { + my ($self, $order) = @_; + + $self->{sort} = $order ||= sub { + sort { + $a->{type} <=> $b->{type} + or $a->{name} cmp $b->{name} + } @_ + }; + + $self->update_items; +} + +sub set_items { + my ($self, $items) = @_; + + $self->{items} = [$items ? values %$items : ()]; + $self->update_items; } #############################################################################