--- deliantra/Deliantra-Client/DC/UI.pm 2007/07/21 14:01:35 1.397 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/07/21 21:25:23 1.403 @@ -648,7 +648,6 @@ warn "no draw defined for $self\n"; } -my $cntx;#d# sub DESTROY { my ($self) = @_; @@ -771,6 +770,8 @@ ]; $self->realloc; + + map $_+0, @widgets } sub children { @@ -1095,6 +1096,11 @@ 0 }, + on_size_allocate => sub { + my ($vp, $w, $h) = @_; + $vp->{parent}->update_slider; + 0 + }, ; $self->SUPER::add ($self->{vp}); @@ -1115,28 +1121,31 @@ my $child = ($self->{vp} or return)->child; - my ($w1, $w2) = ($child->{w}, $self->{vp}{w}); - $self->{hslider}->set_range ([$self->{hslider}{range}[0], 0, $w1, $w2, 1]); + if ($self->{scroll_x}) { + my ($w1, $w2) = ($child->{req_w}, $self->{vp}{w}); + $self->{hslider}->set_range ([$self->{hslider}{range}[0], 0, $w1, $w2, 1]); + + my $visible = $w1 > $w2; + if ($visible != $self->{hslider_visible}) { + $self->{hslider_visible} = $visible; + $visible ? $self->SUPER::add ($self->{hslider}) + : $self->SUPER::remove ($self->{hslider}); + } + } - my $visible = $w1 > $w2; - if ($visible != $self->{hslider_visible}) { - $self->{hslider_visible} = $visible; - $visible ? $self->SUPER::add ($self->{hslider}) - : $self->SUPER::remove ($self->{hslider}); - } - - my ($h1, $h2) = ($child->{h}, $self->{vp}{h}); - $self->{vslider}->set_range ([$self->{vslider}{range}[0], 0, $h1, $h2, 1]); - - my $visible = $h1 > $h2; - if ($visible != $self->{vslider_visible}) { - $self->{vslider_visible} = $visible; - $visible ? $self->SUPER::add ($self->{vslider}) - : $self->SUPER::remove ($self->{vslider}); + if ($self->{scroll_y}) { + my ($h1, $h2) = ($child->{req_h}, $self->{vp}{h}); + $self->{vslider}->set_range ([$self->{vslider}{range}[0], 0, $h1, $h2, 1]); + + my $visible = $h1 > $h2; + if ($visible != $self->{vslider_visible}) { + $self->{vslider_visible} = $visible; + $visible ? $self->SUPER::add ($self->{vslider}) + : $self->SUPER::remove ($self->{vslider}); + } } } - sub start_dragging { my ($self, $ev) = @_; @@ -1158,8 +1167,8 @@ sub invoke_mouse_wheel { my ($self, $ev) = @_; - $self->{vslider}->emit (mouse_wheel => $ev); - $self->{hslider}->emit (mouse_wheel => $ev); + $self->{vslider}->emit (mouse_wheel => $ev) if $self->{vslider_visible}; + $self->{hslider}->emit (mouse_wheel => $ev) if $self->{hslider_visible}; 1 } @@ -1167,9 +1176,12 @@ sub invoke_button_down { my ($self, $ev, $x, $y) = @_; - $self->start_dragging ($ev); + if ($ev->{button} == 2) { + $self->start_dragging ($ev); + return 1; + } - 1 + 0 } sub invoke_button_up { @@ -1720,7 +1732,7 @@ our @ISA = CFPlus::UI::Container::; -sub add { +sub add_fixed { my ($self, $child, $posmode, $x, $y, $sizemode, $w, $h) = @_; $child->{_fixed} = [$posmode, $x, $y, $sizemode, $w, $h]; @@ -1785,8 +1797,8 @@ $x = _scale $pos, $x, $W; $y = _scale $pos, $x, $H; - $w = _scale $size, $w, $child->{req_w}; - $h = _scale $size, $h, $child->{req_h}; + $w = _scale $size, $w, $W; + $h = _scale $size, $h, $H; $child->configure ($x, $y, $w, $h); } @@ -3520,6 +3532,7 @@ if ($anim && @$anim) { delete $self->{wait_face}; $self->{face} = $anim->[ $self->{frame} % @$anim ]; + $self->{tex} = $::CONN->{texture}[ $::CONN->{faceid}[$self->{face}] ]; } } } @@ -3530,6 +3543,7 @@ if ($::CONN) { if (my $faceid = $::CONN->{faceid}[$self->{face}]) { if (my $tex = $::CONN->{texture}[$faceid]) { + $self->{tex} = $tex; return ($self->{size_w} || $tex->{w}, $self->{size_h} || $tex->{h}); } else { $self->{wait_face} ||= $::CONN->connect_face_update ($faceid, sub { @@ -3561,16 +3575,9 @@ sub _draw { my ($self) = @_; - return unless $::CONN; - $self->SUPER::_draw; - my $faceid = $::CONN->{faceid}[$self->{face}] - or return; - - my $tex = $::CONN->{texture}[$faceid]; - - if ($tex) { + if (my $tex = $self->{tex}) { glEnable GL_TEXTURE_2D; glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; glColor 0, 0, 0, 1; @@ -4136,7 +4143,7 @@ for values %{delete $self->{refresh_hook}}; } - if ($self->{realloc}) { + while ($self->{realloc}) { my %queue; my @queue; my $widget; @@ -4193,40 +4200,37 @@ delete $self->{realloc}{$widget+0}; } - } - while (my $size_alloc = delete $self->{size_alloc}) { - my @queue = sort { $b->{visible} <=> $a->{visible} } - values %$size_alloc; + while (my $size_alloc = delete $self->{size_alloc}) { + my @queue = sort { $a->{visible} <=> $b->{visible} } + values %$size_alloc; - while () { - my $widget = pop @queue || last; - - my ($w, $h) = @$widget{qw(alloc_w alloc_h)}; + while () { + my $widget = pop @queue || last; - $w = 0 if $w < 0; - $h = 0 if $h < 0; + my ($w, $h) = @$widget{qw(alloc_w alloc_h)}; - $w = max $widget->{min_w}, $w; - $h = max $widget->{min_h}, $h; + $w = max $widget->{min_w}, $w; + $h = max $widget->{min_h}, $h; # $w = min $self->{w} - $widget->{x}, $w if $self->{w}; # $h = min $self->{h} - $widget->{y}, $h if $self->{h}; - $w = min $widget->{max_w}, $w if exists $widget->{max_w}; - $h = min $widget->{max_h}, $h if exists $widget->{max_h}; + $w = min $widget->{max_w}, $w if exists $widget->{max_w}; + $h = min $widget->{max_h}, $h if exists $widget->{max_h}; - $w = int $w + 0.5; - $h = int $h + 0.5; + $w = int $w + 0.5; + $h = int $h + 0.5; - if ($widget->{w} != $w || $widget->{h} != $h || delete $widget->{force_size_alloc}) { - $widget->{old_w} = $widget->{w}; - $widget->{old_h} = $widget->{h}; + if ($widget->{w} != $w || $widget->{h} != $h || delete $widget->{force_size_alloc}) { + $widget->{old_w} = $widget->{w}; + $widget->{old_h} = $widget->{h}; - $widget->{w} = $w; - $widget->{h} = $h; + $widget->{w} = $w; + $widget->{h} = $h; - $widget->emit (size_allocate => $w, $h); + $widget->emit (size_allocate => $w, $h); + } } } }