--- deliantra/Deliantra-Client/DC/UI.pm 2007/07/21 13:56:00 1.395 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/07/22 16:37:19 1.410 @@ -595,52 +595,8 @@ # functions seems pointless. our ($draw_x, $draw_y, $draw_w, $draw_h); # screen rectangle being drawn -sub draw { - my ($self) = @_; - - return unless $self->{h} && $self->{w}; - - # update screen rectangle - local $draw_x = $draw_x + $self->{x}; - local $draw_y = $draw_y + $self->{y}; - - # skip widgets that are entirely outside the drawing area - return if ($draw_x + $self->{w} < 0) || ($draw_x >= $draw_w) - || ($draw_y + $self->{h} < 0) || ($draw_y >= $draw_h); - - glPushMatrix; - glTranslate $self->{x}, $self->{y}, 0; - - if ($self == $HOVER && $self->{can_hover}) { - glColor 1*0.2, 0.8*0.2, 0.5*0.2, 0.2; - glEnable GL_BLEND; - glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; - glBegin GL_QUADS; - glVertex 0 , 0; - glVertex $self->{w}, 0; - glVertex $self->{w}, $self->{h}; - glVertex 0 , $self->{h}; - glEnd; - glDisable GL_BLEND; - } - - if ($ENV{CFPLUS_DEBUG} & 1) { - glPushMatrix; - glColor 1, 1, 0, 1; - glTranslate 0.375, 0.375; - glBegin GL_LINE_LOOP; - glVertex 0 , 0; - glVertex $self->{w} - 1, 0; - glVertex $self->{w} - 1, $self->{h} - 1; - glVertex 0 , $self->{h} - 1; - glEnd; - glPopMatrix; - #CFPlus::UI::Label->new (w => $self->{w}, h => $self->{h}, text => $self, fontsize => 0)->_draw; - } - - $self->_draw; - glPopMatrix; -} +#sub draw { +#CFPlus.xs sub _draw { my ($self) = @_; @@ -648,7 +604,6 @@ warn "no draw defined for $self\n"; } -my $cntx;#d# sub DESTROY { my ($self) = @_; @@ -771,6 +726,8 @@ ]; $self->realloc; + + map $_+0, @widgets } sub children { @@ -1095,6 +1052,11 @@ 0 }, + on_size_allocate => sub { + my ($vp, $w, $h) = @_; + $vp->{parent}->update_slider; + 0 + }, ; $self->SUPER::add ($self->{vp}); @@ -1115,35 +1077,54 @@ 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 invoke_mouse_wheel { +sub start_dragging { my ($self, $ev) = @_; - $self->{vslider}->emit (mouse_wheel => $ev) - if $ev->{dy}; + $self->grab_focus; + + my $ox = $self->{vp}{view_x}; + my $oy = $self->{vp}{view_y}; + + $self->{motion} = sub { + my ($ev, $x, $y) = @_; + + $ox -= $ev->{xrel}; + $oy -= $ev->{yrel}; + + $self->{vp}->set_offset ($ox, $oy); + }; +} + +sub invoke_mouse_wheel { + my ($self, $ev) = @_; - $self->{hslider}->emit (mouse_wheel => $ev) - if $ev->{dx}; + $self->{vslider}->emit (mouse_wheel => $ev) if $self->{vslider_visible}; + $self->{hslider}->emit (mouse_wheel => $ev) if $self->{hslider_visible}; 1 } @@ -1152,18 +1133,7 @@ my ($self, $ev, $x, $y) = @_; if ($ev->{button} == 2) { - $self->grab_focus; - - my $ox = $self->{vp}{view_x} + $ev->{x}; - my $oy = $self->{vp}{view_y} + $ev->{y}; - - $self->{motion} = sub { - my ($ev, $x, $y) = @_; - - $self->{vp}->set_offset ($ox - $ev->{x}, $oy - $ev->{y}); - $self->update; - }; - + $self->start_dragging ($ev); return 1; } @@ -1718,7 +1688,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]; @@ -1783,8 +1753,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); } @@ -2059,12 +2029,26 @@ : ($self->{h} - $size->[1]) * 0.5); }; - my $w = List::Util::min $self->{w} + 4, $size->[0]; - my $h = List::Util::min $self->{h} + 2, $size->[1]; +# unless ($self->{list}) { +# $self->{list} = CFPlus::OpenGL::glGenList; +# CFPlus::OpenGL::glNewList $self->{list}; +# $self->{layout}->render ($self->{ox}, $self->{oy}, $self->{style}); +# CFPlus::OpenGL::glEndList; +# } +# +# CFPlus::OpenGL::glCallList $self->{list}; $self->{layout}->render ($self->{ox}, $self->{oy}, $self->{style}); } +#sub destroy { +# my ($self) = @_; +# +# CFPlus::OpenGL::glDeleteList delete $self->{list} if $self->{list}; +# +# $self->SUPER::destroy; +#} + ############################################################################# package CFPlus::UI::EntryBase; @@ -2858,7 +2842,9 @@ $self->{click} = [$self->{range}[0], $self->{vertical} ? $y : $x]; - $self->invoke_mouse_motion ($ev, $x, $y) + $self->invoke_mouse_motion ($ev, $x, $y); + + 1 } sub invoke_mouse_motion { @@ -2888,7 +2874,7 @@ $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * $pagepart); - ! ! $delta + 1 } sub update { @@ -3471,7 +3457,7 @@ CFPlus::weaken (my $widget = $self); $widget->{animspeed} = List::Util::max 0.05, $widget->{animspeed}; - $widget->{anim_start} = $self->{animspeed} * Event::time / $self->{animspeed}; + $widget->{anim_start} = $self->{animspeed} * int Event::time / $self->{animspeed}; $self->{timer} = Event->timer ( parked => 1, cb => sub { @@ -3518,6 +3504,7 @@ if ($anim && @$anim) { delete $self->{wait_face}; $self->{face} = $anim->[ $self->{frame} % @$anim ]; + $self->{tex} = $::CONN->{texture}[ $::CONN->{faceid}[$self->{face}] ]; } } } @@ -3528,6 +3515,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 { @@ -3559,16 +3547,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; @@ -3788,11 +3769,15 @@ CFPlus::weaken $self; - $self->{buttonbar}->add (new CFPlus::UI::Button - markup => $title, - tooltip => $tooltip, - on_activate => sub { $self->set_current_page ($widget) }, - ); + unless (ref $title) { + $title = new CFPlus::UI::Button + markup => $title, + tooltip => $tooltip, + ; + } + + $title->connect (activate => sub { $self->set_current_page ($widget) }); + $self->{buttonbar}->add ($title); $self->{multiplexer}->add ($widget); } @@ -4134,7 +4119,7 @@ for values %{delete $self->{refresh_hook}}; } - if ($self->{realloc}) { + while ($self->{realloc}) { my %queue; my @queue; my $widget; @@ -4191,40 +4176,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 $widget = pop @queue || last; + while (my $size_alloc = delete $self->{size_alloc}) { + my @queue = sort { $a->{visible} <=> $b->{visible} } + values %$size_alloc; - 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); + } } } }