--- deliantra/Deliantra-Client/DC/UI.pm 2006/06/05 22:30:35 1.290 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/06/07 05:48:53 1.296 @@ -317,8 +317,8 @@ sub move_abs { my ($self, $x, $y, $z) = @_; - $self->{x} = List::Util::max 0, int $x; - $self->{y} = List::Util::max 0, int $y; + $self->{x} = List::Util::max 0, List::Util::min $self->{root}{w} - $self->{w}, int $x; + $self->{y} = List::Util::max 0, List::Util::min $self->{root}{h} - $self->{h}, int $y; $self->{z} = $z if defined $z; $self->update; @@ -1660,13 +1660,16 @@ glEnable GL_TEXTURE_2D; + my $w = List::Util::min $self->{w} + 4, $tex->{w}; + my $h = List::Util::min $self->{h} + 2, $tex->{h}; + 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}); + $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}); + $tex->draw_quad_alpha_premultiplied ($self->{ox}, $self->{oy}, $w, $h); } glDisable GL_TEXTURE_2D; @@ -1693,6 +1696,7 @@ valign => 0, can_events => 1, #text => ... + #hidden => "*", @_ ) } @@ -2305,8 +2309,10 @@ ($range, $self->{range}) = ($self->{range}, $range); - $self->update - if "@$range" ne "@{$self->{range}}"; + if ("@$range" ne "@{$self->{range}}") { + $self->update; + $self->set_value ($self->{range}[0]); + } } sub set_value { @@ -2475,6 +2481,7 @@ my $self = $class->SUPER::new ( fontsize => 1, can_events => 0, + indent => 0, #font => default_font @_, @@ -2507,6 +2514,7 @@ $self->{layout}->set_font ($self->{font}) if $self->{font}; $self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE); $self->{layout}->set_width ($self->{children}[0]{w}); + $self->{layout}->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $self->reflow; } @@ -2518,6 +2526,7 @@ $layout->set_height ($self->{fontsize} * $::FONTSIZE); $layout->set_width ($self->{children}[0]{w} - $indent); + $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $layout->set_markup ($text); $layout->size @@ -2566,7 +2575,7 @@ delete $self->{texture}; - $ROOT->on_post_alloc ($self, sub { + $ROOT->on_post_alloc ($self => sub { my ($W, $H) = @{$self->{children}[0]}{qw(w h)}; if (delete $self->{need_reflow}) { @@ -2579,6 +2588,7 @@ for (@{$self->{par}}) { if (1 || $_->[0] >= $W) { # TODO: works,but needs reconfigure etc. support $layout->set_width ($W - $_->[3]); + $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $layout->set_markup ($_->[4]); my ($w, $h) = $layout->size; $_->[0] = $w + $_->[3]; @@ -2591,7 +2601,7 @@ $self->{height} = $height; $self->{children}[1]->set_range ([$height, 0, $height, $H, 1]); - + delete $self->{texture}; } @@ -2620,6 +2630,7 @@ if ($y0 < $y + $h && $y < $y1) { $layout->set_foreground (@{ $par->[2] }); $layout->set_width ($W - $par->[3]); + $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent}); $layout->set_markup ($par->[4]); my ($w, $h, $data, $format, $internalformat) = $layout->render; @@ -2780,7 +2791,7 @@ my ($x, $y) = $widget->coord2global ($widget->{w}, 0); ($x, $y) = $widget->coord2global (-$self->{w}, 0) - if $x + $self->{w} > $::WIDTH; + if $x + $self->{w} > $self->{root}{w}; $self->move_abs ($x, $y); }); @@ -2922,14 +2933,15 @@ $self->add ($self->{vbox} = new CFClient::UI::VBox); for my $item (@{ $self->{items} }) { - my ($widget, $cb) = @$item; + my ($widget, $cb, $tooltip) = @$item; # handle various types of items, only text for now if (!ref $widget) { $widget = new CFClient::UI::Label can_hover => 1, can_events => 1, - text => $widget; + text => $widget, + tooltip => $tooltip } $self->{item}{$widget} = $item; @@ -3089,6 +3101,62 @@ } ############################################################################# + +package CFClient::UI::Combobox; + +use utf8; + +our @ISA = CFClient::UI::Button::; + +sub new { + my $class = shift; + + my $self = $class->SUPER::new ( + options => [], # [title, value, tooltip], ... + value => undef, + @_, + ); + + $self->_set_value ($self->{value}); + + $self +} + +sub button_down { + my ($self, $ev) = @_; + + my @menu_items; + + for (@{ $self->{options} }) { + my ($title, $value, $tooltip) = @$_; + + push @menu_items, [$tooltip, sub { $self->set_value ($value) }]; + } + + CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev); +} + +sub _set_value { + my ($self, $value) = @_; + + my ($item) = grep $_->[1] eq $value, @{ $self->{options} } + or return; + + $self->{value} = $item->[1]; + $self->set_markup ("$item->[0] ⇓"); + $self->set_tooltip ($item->[2]); +} + +sub set_value { + my ($self, $value) = @_; + + return unless $self->{value} ne $value; + + $self->_set_value ($value); + $self->_emit (changed => $value); +} + +############################################################################# package CFClient::UI::Statusbox;