--- deliantra/Deliantra-Client/DC/UI.pm 2006/07/02 21:07:26 1.319 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/07/23 02:44:06 1.329 @@ -454,17 +454,17 @@ $self->emit ("focus_in"); } -sub invoke_mouse_motion { 1 } -sub invoke_button_up { 1 } -sub invoke_key_down { 1 } -sub invoke_key_up { 1 } +sub invoke_mouse_motion { 0 } +sub invoke_button_up { 0 } +sub invoke_key_down { 0 } +sub invoke_key_up { 0 } sub invoke_button_down { my ($self, $ev, $x, $y) = @_; $self->grab_focus; - 1 + 0 } sub connect { @@ -476,6 +476,8 @@ sub emit { my ($self, $signal, @args) = @_; + #warn +(caller(1))[3] . "emit $signal on $self (parent $self->{parent})\n";#d# + #d##TODO# stop propagating at first true, do not use sum (List::Util::sum map $_->($self, @args), @{$self->{signal_cb}{$signal} || []}) # before || ($self->can ("invoke_$signal") || sub { 1 })->($self, @args) # closure @@ -589,6 +591,8 @@ sub DESTROY { my ($self) = @_; + return if CFClient::in_destruct; + delete $WIDGET{$self+0}; eval { $self->destroy }; @@ -996,6 +1000,14 @@ $self->{vp}->add ($self->{child} = $widget); } +sub invoke_button_up { + my ($self, $ev) = @_; + + warn "button up $ev->{button}\n";#d# + + 0 +} + sub update_slider { my ($self) = @_; @@ -1082,8 +1094,8 @@ border_bg => [1, 1, 1, 1], border => 0.6, can_events => 1, - min_w => 16, - min_h => 16, + min_w => 64, + min_h => 32, %arg, ); @@ -1593,7 +1605,6 @@ return if $self->{text} eq "T$text"; $self->{text} = "T$text"; - $self->{layout} = new CFClient::Layout if $self->{layout}->is_rgba; $self->{layout}->set_text ($text); delete $self->{size_req}; @@ -1609,7 +1620,6 @@ my $rgba = $markup =~ /span.*(?:foreground|background)/; - $self->{layout} = new CFClient::Layout $rgba if $self->{layout}->is_rgba != $rgba; $self->{layout}->set_markup ($markup); delete $self->{size_req}; @@ -1631,6 +1641,7 @@ if (exists $self->{template}) { $self->{template}->set_font ($self->{font}) if $self->{font}; + $self->{template}->set_width ($self->{max_w} || -1); $self->{template}->set_height ($self->{fontsize} * $::FONTSIZE); my ($w2, $h2) = $self->{template}->size; @@ -1674,6 +1685,7 @@ my ($self) = @_; delete $self->{size_req}; + delete $self->{texture}; $self->SUPER::reconfigure; } @@ -1683,7 +1695,7 @@ $self->SUPER::_draw; # draw background, if applicable - my $tex = $self->{texture} ||= do { + my $size = $self->{texture} ||= do { $self->{layout}->set_foreground (@{$self->{fg}}); $self->{layout}->set_font ($self->{font}) if $self->{font}; $self->{layout}->set_width ($self->{w}); @@ -1691,34 +1703,23 @@ $self->{layout}->set_single_paragraph_mode ($self->{ellipsise}); $self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE); - new_from_layout CFClient::Texture $self->{layout} + [$self->{layout}->size] }; unless (exists $self->{ox}) { $self->{ox} = int ($self->{align} < 0 ? $self->{padding_x} - : $self->{align} > 0 ? $self->{w} - $tex->{w} - $self->{padding_x} - : ($self->{w} - $tex->{w}) * 0.5); + : $self->{align} > 0 ? $self->{w} - $size->[0] - $self->{padding_x} + : ($self->{w} - $size->[0]) * 0.5); $self->{oy} = int ($self->{valign} < 0 ? $self->{padding_y} - : $self->{valign} > 0 ? $self->{h} - $tex->{h} - $self->{padding_y} - : ($self->{h} - $tex->{h}) * 0.5); + : $self->{valign} > 0 ? $self->{h} - $size->[1] - $self->{padding_y} + : ($self->{h} - $size->[1]) * 0.5); }; - glEnable GL_TEXTURE_2D; - - my $w = List::Util::min $self->{w} + 4, $tex->{w}; - my $h = List::Util::min $self->{h} + 2, $tex->{h}; + my $w = List::Util::min $self->{w} + 4, $size->[0]; + my $h = List::Util::min $self->{h} + 2, $size->[1]; - if ($tex->{format} == GL_ALPHA) { - glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; - glColor @{$self->{fg}}; - $tex->draw_quad_alpha ($self->{ox}, $self->{oy}, $w, $h); - } else { - glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; - $tex->draw_quad_alpha_premultiplied ($self->{ox}, $self->{oy}, $w, $h); - } - - glDisable GL_TEXTURE_2D; + $self->{layout}->render ($self->{ox}, $self->{oy}); } ############################################################################# @@ -1839,8 +1840,8 @@ # byte-index to char-index my $text = $self->{text}; - utf8::encode $text; - $self->{cursor} = length substr $text, 0, $idx; + utf8::encode $text; $text = substr $text, 0, $idx; utf8::decode $text; + $self->{cursor} = length $text; $self->_set_text ($self->{text}); $self->update; @@ -2129,10 +2130,10 @@ @_, ); - $self->{path} - or Carp::croak "required attribute 'path' not set"; + $self->{path} || $self->{tex} + or Carp::croak "'path' or 'tex' attributes required"; - $self->{tex} = $texture_cache{$self->{path}} ||= + $self->{tex} ||= $texture_cache{$self->{path}} ||= new_from_file CFClient::Texture CFClient::find_rcfile $self->{path}, mipmap => 1; Scalar::Util::weaken $texture_cache{$self->{path}}; @@ -2575,7 +2576,7 @@ #font => default_font @_, - layout => (new CFClient::Layout 1), + layout => (new CFClient::Layout), par => [], height => 0, children => [ @@ -2746,10 +2747,6 @@ my $y = 0; - glEnable GL_BLEND; - #TODO# not correct in windows where rgba is forced off - glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; - for my $para (@{$self->{par}}) { my $h = $para->{h}; @@ -2757,15 +2754,11 @@ my $layout = $self->get_layout ($para); - my ($w, $h, $data, $format, $internalformat) = $layout->render; - - glRasterPos $para->{indent}, $y - $y0; - glDrawPixels $w, $h, $format, GL_UNSIGNED_BYTE, $data; + $layout->render ($para->{indent}, $y - $y0); if (my @w = @{ $para->{widget} }) { my @s = $layout->get_shapes; - glDisable GL_BLEND; for (@w) { my ($dx, $dy) = splice @s, 0, 2, (); @@ -2774,15 +2767,11 @@ $_->draw; } - glEnable GL_BLEND; - glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; } } $y += $h; } - - glDisable GL_BLEND; }; }); } @@ -3088,11 +3077,26 @@ # handle various types of items, only text for now if (!ref $widget) { - $widget = new CFClient::UI::Label - can_hover => 1, - can_events => 1, - markup => $widget, - tooltip => $tooltip + if ($widget =~ /\t/) { + my ($left, $right) = split /\t/, $widget, 2; + + $widget = new CFClient::UI::HBox + can_hover => 1, + can_events => 1, + tooltip => $tooltip, + children => [ + (new CFClient::UI::Label markup => $left, expand => 1), + (new CFClient::UI::Label markup => $right, align => +1), + ], + ; + + } else { + $widget = new CFClient::UI::Label + can_hover => 1, + can_events => 1, + markup => $widget, + tooltip => $tooltip; + } } $self->{item}{$widget} = $item; @@ -3824,6 +3828,12 @@ $w = 0 if $w < 0; $h = 0 if $h < 0; + $w = max $widget->{min_w}, $w; + $h = max $widget->{min_h}, $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;