--- deliantra/Deliantra-Client/DC/UI.pm 2007/06/25 05:43:37 1.368 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/07/15 20:25:26 1.369 @@ -322,8 +322,8 @@ return if $self->{visible} == $visible; - $visible ? $self->hide - : $self->show; + $visible ? $self->show + : $self->hide; } sub toggle_visibility { @@ -1035,7 +1035,7 @@ package CFPlus::UI::ScrolledWindow; -our @ISA = CFPlus::UI::HBox::; +our @ISA = CFPlus::UI::Table::; sub new { my ($class, %arg) = @_; @@ -1044,22 +1044,38 @@ my $self; - my $slider = new CFPlus::UI::Slider + my $hslider = new CFPlus::UI::Slider + vertical => 0, + range => [0, 0, 1, 0.01], # HACK fix + on_changed => sub { + $self->{hpos} = $_[1]; + $self->{vp}->set_offset ($self->{hpos}, $self->{vpos}); + }, + ; + + my $vslider = new CFPlus::UI::Slider vertical => 1, range => [0, 0, 1, 0.01], # HACK fix on_changed => sub { - $self->{vp}->set_offset (0, $_[1]); + $self->{vpos} = $_[1]; + $self->{vp}->set_offset ($self->{hpos}, $self->{vpos}); }, ; $self = $class->SUPER::new ( vp => (new CFPlus::UI::ViewPort expand => 1), can_events => 1, - slider => $slider, + hslider => $hslider, + vslider => $vslider, + col_expand => [1, 0], + row_expand => [1, 0], %arg, ); - $self->SUPER::add ($self->{vp}, $self->{slider}); + $self->SUPER::add (0, 0, $self->{vp}); + $self->SUPER::add (1, 0, $self->{vslider}); + $self->SUPER::add (0, 1, $self->{hslider}); + $self->add ($child) if $child; $self @@ -1078,7 +1094,7 @@ return 0 unless $ev->{dy}; # only vertical movements - $self->{slider}->emit (mouse_wheel => $ev); + $self->{vslider}->emit (mouse_wheel => $ev); 1 } @@ -1086,7 +1102,13 @@ sub update_slider { my ($self) = @_; - $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $self->{vp}->child->{h}, $self->{vp}{h}, 1]); + my ($w1, $w2) = ($self->{vp}->child->{w}, $self->{vp}{w}); + $self->{hslider}->set_range ([$self->{hslider}{range}[0], 0, $w1, $w2, 1]); + #$self->{hslider}->set_visibility ($w1 != $w2); + + my ($h1, $h2) = ($self->{vp}->child->{h}, $self->{vp}{h}); + $self->{vslider}->set_range ([$self->{vslider}{range}[0], 0, $h1, $h2, 1]); + #$self->{vslider}->set_visibility ($h1 != $h2); } sub update { @@ -1483,6 +1505,7 @@ $class->SUPER::new ( col_expand => [], + row_expand => [], @_, ) } @@ -1567,16 +1590,21 @@ my $req_w = (sum @$ws) || 1; my $req_h = (sum @$hs) || 1; - # TODO: nicer code && do row_expand + # TODO: nicer code my @col_expand = @{$self->{col_expand}}; @col_expand = (1) x @$ws unless @col_expand; my $col_expand = (sum @col_expand) || 1; - # linearly scale sizes $ws->[$_] += $col_expand[$_] / $col_expand * ($w - $req_w) for 0 .. $#$ws; - $hs->[$_] *= 1 * $h / $req_h for 0 .. $#$hs; CFPlus::UI::harmonize $ws; + + my @row_expand = @{$self->{row_expand}}; + @row_expand = (1) x @$ws unless @row_expand; + my $row_expand = (sum @row_expand) || 1; + + $hs->[$_] += $row_expand[$_] / $row_expand * ($h - $req_h) for 0 .. $#$hs; + CFPlus::UI::harmonize $hs; my $y;