--- deliantra/Deliantra-Client/DC/UI.pm 2007/07/21 13:02:05 1.389 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/07/21 13:29:46 1.390 @@ -743,7 +743,7 @@ ); $self->add (@$children) - if $children; + if $children && @$children; $self } @@ -762,6 +762,7 @@ $_->set_parent ($self) for @widgets; + # TODO: only do this in widgets that need it, e.g. root, fixed use sort 'stable'; $self->{children} = [ @@ -1048,6 +1049,8 @@ my $self; my $hslider = new CFPlus::UI::Slider + col => 0, + row => 1, vertical => 0, range => [0, 0, 1, 0.01], # HACK fix on_changed => sub { @@ -1057,6 +1060,8 @@ ; my $vslider = new CFPlus::UI::Slider + col => 1, + row => 0, vertical => 1, range => [0, 0, 1, 0.01], # HACK fix on_changed => sub { @@ -1077,6 +1082,8 @@ ); $self->{vp} = new CFPlus::UI::ViewPort + col => 0, + row => 0, expand => 1, scroll_x => $self->{scroll_x}, scroll_y => $self->{scroll_y}, @@ -1090,14 +1097,14 @@ }, ; - $self->SUPER::add_at (0, 0, $self->{vp}); + $self->SUPER::add ($self->{vp}); $self->add ($child) if $child; $self } -#TODO# update range on size_allocate depending on child +#TODO# update range on size_allocate depending on child? sub add { my ($self, $widget) = @_; @@ -1115,8 +1122,8 @@ my $visible = $w1 > $w2; if ($visible != $self->{hslider}{visible}) { - $visible ? $self->SUPER::add_at (0, 1, $self->{hslider}) - : $self->{hslider}->hide; + $visible ? $self->SUPER::add ($self->{hslider}) + : $self->SUPER::remove ($self->{hslider}); } my ($h1, $h2) = ($child->{h}, $self->{vp}{h}); @@ -1124,8 +1131,8 @@ my $visible = $h1 > $h2; if ($visible != $self->{vslider}{visible}) { - $visible ? $self->SUPER::add_at (1, 0, $self->{vslider}) - : $self->{vslider}->hide; + $visible ? $self->SUPER::add ($self->{vslider}) + : $self->SUPER::remove ($self->{vslider}); } } @@ -1583,7 +1590,7 @@ package CFPlus::UI::Table; -our @ISA = CFPlus::UI::Base::; +our @ISA = CFPlus::UI::Container::; use List::Util qw(max sum); @@ -1593,69 +1600,38 @@ my $class = shift; $class->SUPER::new ( - children => [], col_expand => [], row_expand => [], @_, ) } -sub children { - grep $_, map @$_, grep $_, @{ $_[0]{children} } -} - -# TODO: store row/col info in child widget and use standard add/del sub add { - my $self = shift; + my ($self, @widgets) = @_; - Carp::cluck "please use the add_at method instead of calling add, thank you.\n";#d# - $self->add_at (@_); + for my $child (@widgets) { + $child->{rowspan} ||= 1; + $child->{colspan} ||= 1; + } + + $self->SUPER::add (@widgets); } sub add_at { my $self = shift; + my @widgets; + while (@_) { my ($col, $row, $child) = splice @_, 0, 3, (); $child->{row} = $row; $child->{col} = $col; - $child->{rowspan} ||= 1; - $child->{colspan} ||= 1; - - $child->set_parent ($self); - $self->{children}[$row][$col] = $child; - } - - $self->{force_realloc} = 1; - $self->{force_size_alloc} = 1; - $self->realloc; -} - -sub remove { - my ($self, $child) = @_; - - for (@{ $self->{children} }) { - for (@{ $_ || [] }) { - $_ = undef if $_ == $child; - } - } -} - -# TODO: move to container class maybe? send children a signal on removal? -sub clear { - my ($self) = @_; - - my @children = $self->children; - delete $self->{children}; - - for (@children) { - delete $_->{parent}; - $_->hide; + push @widgets, $child; } - $self->realloc; + $self->add (@widgets); } sub get_wh { @@ -1719,10 +1695,8 @@ CFPlus::UI::harmonize $hs; - my (@x, @y); - - for (0 .. $#$ws) { $x[$_ + 1] = $x[$_] + $ws->[$_] } - for (0 .. $#$hs) { $y[$_ + 1] = $y[$_] + $hs->[$_] } + my @x; for (0 .. $#$ws) { $x[$_ + 1] = $x[$_] + $ws->[$_] } + my @y; for (0 .. $#$hs) { $y[$_ + 1] = $y[$_] + $hs->[$_] } for my $widget ($self->children) { my ($r, $c, $w, $h, $rs, $cs) = @$widget{qw(row col req_w req_h rowspan colspan)}; @@ -1736,30 +1710,6 @@ 1 } -sub find_widget { - my ($self, $x, $y) = @_; - - $x -= $self->{x}; - $y -= $self->{y}; - - my $res; - - for (grep $_, map @$_, grep $_, @{ $self->{children} }) { - $res = $_->find_widget ($x, $y) - and return $res; - } - - $self->SUPER::find_widget ($x + $self->{x}, $y + $self->{y}) -} - -sub _draw { - my ($self) = @_; - - for (grep $_, @{$self->{children}}) { - $_->draw for grep $_, @$_; - } -} - ############################################################################# package CFPlus::UI::Fixed;