--- deliantra/Deliantra-Client/DC/UI.pm 2006/05/26 20:50:35 1.241 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/05/27 20:46:54 1.243 @@ -11,12 +11,31 @@ our ($FOCUS, $HOVER, $GRAB); # various widgets +our $LAYOUT; our $ROOT; our $TOOLTIP; our $BUTTON_STATE; our %WIDGET; # all widgets, weak-referenced +sub get_layout { + for (grep { $_->{name} } values %WIDGET) { + $LAYOUT->{$_->{name}} = { + x => $_->{x} / $::WIDTH, + y => $_->{y} / $::HEIGHT, + w => $_->{w} / $::WIDTH, + h => $_->{h} / $::HEIGHT + }; + } + + return $LAYOUT; +} + +sub set_layout { + my ($layout) = @_; + $LAYOUT = $layout; +} + sub check_tooltip { if (!$GRAB) { for (my $widget = $HOVER; $widget; $widget = $widget->{parent}) { @@ -189,13 +208,20 @@ }, $class; for (keys %$self) { - if (/^connect_(.*)$/) { + if (/^on_(.*)$/) { $self->connect ($1 => delete $self->{$_}); } } Scalar::Util::weaken ($CFClient::UI::WIDGET{$self+0} = $self); + if (my $layout = $CFClient::UI::LAYOUT->{$self->{name}}) { + $self->{user_x} = $layout->{x} * $::WIDTH; + $self->{user_y} = $layout->{y} * $::HEIGHT; + $self->{user_w} = ($layout->{w} != 0 ? $layout->{w} : 1) * $::WIDTH; + $self->{user_h} = ($layout->{h} != 0 ? $layout->{h} : 1) * $::HEIGHT; + } + $self } @@ -860,9 +886,9 @@ my $self; my $slider = new CFClient::UI::Slider - vertical => 1, - range => [0, 0, 1, 0.01], # HACK fix - connect_changed => sub { + vertical => 1, + range => [0, 0, 1, 0.01], # HACK fix + on_changed => sub { $self->{vp}->set_offset (0, $_[1]); }, ; @@ -1027,9 +1053,11 @@ my $dx = $ev->{x} - $ox; my $dy = $ev->{y} - $oy; + $self->{user_x} = $wx + $dx * $mx; + $self->{user_y} = $wy + $dy * $my; $self->{user_w} = $bw + $dx * ($mx ? -1 : 1); $self->{user_h} = $bh + $dy * ($my ? -1 : 1); - $self->move ($wx + $dx * $mx, $wy + $dy * $my); + $self->move ($self->{user_x}, $self->{user_y}); $self->check_size; }; @@ -1042,7 +1070,9 @@ ($x, $y) = ($ev->{x}, $ev->{y}); - $self->move ($bx + $x - $ox, $by + $y - $oy); + $self->{user_x} = $bx + $x - $ox; + $self->{user_y} = $by + $y - $oy; + $self->move ($self->{user_x}, $self->{user_y}); $self->update; }; } @@ -2546,8 +2576,8 @@ my $class = shift; my $self = $class->SUPER::new ( - state => 0, - connect_activate => \&toggle_flopper, + state => 0, + on_activate => \&toggle_flopper, @_ ); @@ -3083,16 +3113,19 @@ } if ($self->{check_size}) { - my @queue = ([], []); + my @queue; for (;;) { if ($self->{check_size}) { - # heuristic: check containers last - push @{ $queue[ ! ! $_->isa ("CFClient::UI::Container") ] }, $_ - for values %{delete $self->{check_size}} + #TODO use array-of-depth approach + + @queue = sort { $a->{visible} <=> $b->{visible} } + @queue, values %{delete $self->{check_size}}; } - my $widget = (pop @{ $queue[0] }) || (pop @{ $queue[1] }) || last; + my $widget = pop @queue || last; + + defined $widget->{visible} or last; # do not resize invisible widgets my ($w, $h) = $widget->{user_w} && $widget->{user_h} ? @$widget{qw(user_w user_h)}