--- deliantra/Deliantra-Client/DC/UI.pm 2006/04/14 02:06:22 1.98 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/04/14 10:57:35 1.99 @@ -1158,6 +1158,28 @@ } } +package CFClient::UI::LineEntry; + +our @ISA = CFClient::UI::Entry::; + +use SDL; +use SDL::OpenGL; + +sub key_down { + my ($self, $ev) = @_; + + my $sym = $ev->key_sym; + + if ($sym == SDLK_RETURN) { + $self->emit (activate => $self->get_text); + $self->update; + + } else { + $self->SUPER::key_down ($ev); + } + +} + ############################################################################# package CFClient::UI::Button; @@ -1300,6 +1322,10 @@ our @ISA = CFClient::UI::DrawBG::; +my @tex = + map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + qw(s1_slider.png s1_slider_bg.png); + sub new { my $class = shift; @@ -1377,39 +1403,37 @@ my ($value, $lo, $hi, $page) = @{$self->{range}}; - $page = int $page * $w / ($hi - $lo); - $value = int +($value - $lo) * $w / ($hi - $lo); + # the inner_* stuff is for generating a padding for the slider handle, + # so that the handle doesn't leave the texture. This calculation isn't 100% + # correct propably, but it does the job for now + my $inner_pad = 5; # 5% of width for slider bg texture border + my $inner_pad_px = ($w / 100) * $inner_pad; # % to pixels + my $inner_w = $w - $inner_pad_px * 2; # * 2 for left & right + + $page = int $page * $inner_w / ($hi - $lo); + $value = int +($value - $lo) * $inner_w / ($hi - $lo); $w -= $page; $page &= ~1; glTranslate $page * 0.5, 0, 0; $page ||= 2; - glColor @$fg; - glBegin GL_LINES; - glVertex 0, 0; glVertex 0, $h; - glVertex $w - 1, 0; glVertex $w - 1, $h; - glVertex 0, $h * 0.5; glVertex $w, $h * 0.5; - glEnd; + my $knob_a = $inner_pad_px + ($value - $page * 0.5); + my $knob_b = $inner_pad_px + ($value + $page * 0.5); + + glEnable GL_BLEND; + glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; + glEnable GL_TEXTURE_2D; + glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; - my $knob_a = $value - $page * 0.5; - my $knob_b = $value + $page * 0.5; + # draw background + $tex[1]->draw_quad (0, 0, $w, $h); - glBegin GL_QUADS; - glColor @$fg; - glVertex $knob_a, 0; - glVertex $knob_a, $h; - glVertex $knob_b, $h; - glVertex $knob_b, 0; - - if ($knob_a < $knob_b - 2) { - glColor @$bg; - glVertex $knob_a + 1, 1; - glVertex $knob_a + 1, $h - 1; - glVertex $knob_b - 1, $h - 1; - glVertex $knob_b - 1, 1; - } - glEnd; + # draw handle + $tex[0]->draw_quad ($knob_a, 0, $knob_b - $knob_a, $h); + + glDisable GL_BLEND; + glDisable GL_TEXTURE_2D; } #############################################################################