--- deliantra/Deliantra-Client/DC/UI.pm 2006/04/20 04:20:52 1.140 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/04/21 15:03:46 1.146 @@ -148,21 +148,31 @@ sub configure { my ($self, $x, $y, $w, $h) = @_; - $self->{x} = $x; - $self->{y} = $y; - if ($self->{aspect}) { - $w = List::Util::min $w, int $h * $self->{aspect}; - $h = List::Util::min $h, int $w / $self->{aspect}; + my $w2 = List::Util::min $w, int $h * $self->{aspect}; + my $h2 = List::Util::min $h, int $w / $self->{aspect}; + + # use alignment to adjust x, y + + $x += ($w - $w2) * 0.5; + $y += ($h - $h2) * 0.5; + + ($w, $h) = ($w2, $h2); } - return unless $self->{w} != $w || $self->{h} != $h; + if ($self->{x} != $x || $self->{y} != $y) { + $self->{x} = $x; + $self->{y} = $y; + $self->update; + } - $self->{w} = $w; - $self->{h} = $h; + if ($self->{w} != $w || $self->{h} != $h) { + $self->{w} = $w; + $self->{h} = $h; - $self->size_allocate ($w, $h); - $self->update; + $self->size_allocate ($w, $h); + $self->update; + } } sub size_allocate { @@ -617,7 +627,7 @@ use CFClient::OpenGL; my @tex = - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw(d1_bg.png d1_border_top.png d1_border_right.png d1_border_left.png d1_border_bottom.png); sub new { @@ -625,12 +635,20 @@ # TODO: user_x, user_y, overwrite moveto? - $class->SUPER::new ( + my $self = $class->SUPER::new ( bg => [1, 1, 1, 1], border_bg => [1, 1, 1, 1], border => 0.8, @_ - ) + ); + + $self->{title} &&= new CFClient::UI::Label + align => 0, + valign => 1, + text => $self->{title}, + fontsize => 1; + + $self } sub border { @@ -656,6 +674,9 @@ $h -= List::Util::max 0, $self->border * 2; $w -= List::Util::max 0, $self->border * 2; + $self->{title}->configure ($self->border, $self->border - $::FONTSIZE * 2, $w, $::FONTSIZE * 2) + if $self->{title}; + $self->child->configure ($self->border, $self->border, $w, $h); } @@ -744,6 +765,7 @@ glDisable GL_TEXTURE_2D; glDisable GL_BLEND; + $self->{title}->draw if $self->{title}; $self->child->draw; } @@ -1022,7 +1044,11 @@ %arg ); - $self->{xxx}++ if $self->{text} eq "Client Setup" && $self->{align};#d# + if (exists $self->{template}) { + my $layout = new CFClient::Layout; + $layout->set_text (delete $self->{template}); + $self->{template} = $layout; + } $self->set_text (delete $self->{text}) if exists $self->{text}; $self->set_markup (delete $self->{markup}) if exists $self->{markup}; @@ -1066,6 +1092,15 @@ my ($w, $h) = $self->{layout}->size; + if (exists $self->{template}) { + $self->{template}->set_height ($self->{fontsize} * $::FONTSIZE); + + my ($w2, $h2) = $self->{template}->size; + + $w = List::Util::max $w, $w2; + $h = List::Util::max $h, $h2; + } + ( $w + $self->{padding} * 2, $h + $self->{padding} * 2, @@ -1078,6 +1113,13 @@ delete $self->{texture}; } +sub set_fontsize { + my ($self, $fontsize) = @_; + + $self->{fontsize} = $fontsize; + $self->update; +} + sub _draw { my ($self) = @_; @@ -1311,7 +1353,7 @@ use CFClient::OpenGL; my @tex = - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw(b1_button_active.png); sub new { @@ -1368,7 +1410,7 @@ our @ISA = CFClient::UI::DrawBG::; my @tex = - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw(c1_checkbox_bg.png c1_checkbox_active.png); use CFClient::OpenGL; @@ -1427,6 +1469,65 @@ ############################################################################# +package CFClient::UI::Image; + +our @ISA = CFClient::UI::Base::; + +use CFClient::OpenGL; +use Carp qw/confess/; + +our %loaded_images; + +sub new { + my $class = shift; + + my $self = $class->SUPER::new (@_); + + $self->{image} or confess "Image has 'image' not set. This is a fatal error!"; + + $loaded_images{$self->{image}} ||= + new_from_file CFClient::Texture CFClient::find_rcfile $self->{image}, mipmap => 1; + + my $tex = $self->{tex} = $loaded_images{$self->{image}}; + + $self->{aspect} = $tex->{w} / $tex->{h}; + + $self +} + +sub size_request { + my ($self) = @_; + + ($self->{tex}->{w}, $self->{tex}->{h}) +} + +sub _draw { + my ($self) = @_; + + my $tex = $self->{tex}; + + my ($w, $h) = ($self->{w}, $self->{h}); + + if ($self->{rot90}) { + glRotate 90, 0, 0, 1; + glTranslate 0, -$self->{w}, 0; + + ($w, $h) = ($h, $w); + } + + 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; + + $tex->draw_quad (0, 0, $w, $h); + + glDisable GL_BLEND; + glDisable GL_TEXTURE_2D; +} + +############################################################################# + package CFClient::UI::VGauge; our @ISA = CFClient::UI::Base::; @@ -1435,19 +1536,19 @@ my %tex = ( food => [ - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw/g1_food_gauge_empty.png g1_food_gauge_full.png/ ], grace => [ - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw/g1_grace_gauge_empty.png g1_grace_gauge_full.png/ ], hp => [ - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw/g1_hp_gauge_empty.png g1_hp_gauge_full.png/ ], mana => [ - map { new_from_file CFClient::Texture CFClient::find_rcfile $_ } + map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } qw/g1_mana_gauge_empty.png g1_mana_gauge_full.png/ ], ); @@ -1457,11 +1558,11 @@ my $class = shift; my $self = $class->SUPER::new ( - gauge => 'food', + type => 'food', @_ ); - $self->{aspect} = $tex{$self->{gauge}}[0]{w} / $tex{$self->{gauge}}[0]{h}; + $self->{aspect} = $tex{$self->{type}}[0]{w} / $tex{$self->{type}}[0]{h}; $self } @@ -1469,9 +1570,9 @@ sub size_request { my ($self) = @_; - my $tex = $tex{$self->{gauge}}[0]; - - @$tex{qw(w h)} + #my $tex = $tex{$self->{type}}[0]; + #@$tex{qw(w h)} + (0, 0) } sub set_max { @@ -1495,10 +1596,17 @@ sub _draw { my ($self) = @_; - my $tex = $tex{$self->{gauge}}; + my $tex = $tex{$self->{type}}; my ($w, $h) = ($self->{w}, $self->{h}); + if ($self->{vertical}) { + glRotate 90, 0, 0, 1; + glTranslate 0, -$self->{w}, 0; + + ($w, $h) = ($h, $w); + } + my $ycut = $self->{val} / ($self->{max_val} || 1); $ycut = 1 if $self->{val} > $self->{max_val}; @@ -1513,24 +1621,20 @@ my $h1 = $self->{h} - $ycut * $self->{h}; my $h2 = $ycut * $self->{h}; - my $yp = 0; - glBindTexture GL_TEXTURE_2D, $t1->{name}; glBegin GL_QUADS; - glTexCoord 0 , 0; glVertex 0 , $yp; - glTexCoord 0 , $t1->{t} * (1 - $ycut); glVertex 0 , $yp + $h1; - glTexCoord $t1->{s}, $t1->{t} * (1 - $ycut); glVertex 0 + $w, $yp + $h1; - glTexCoord $t1->{s}, 0; glVertex 0 + $w, $yp; + glTexCoord 0 , 0; glVertex 0 , 0; + glTexCoord 0 , $t1->{t} * (1 - $ycut); glVertex 0 , $h1; + glTexCoord $t1->{s}, $t1->{t} * (1 - $ycut); glVertex $w, $h1; + glTexCoord $t1->{s}, 0; glVertex $w, 0; glEnd; - $yp += $h1; - glBindTexture GL_TEXTURE_2D, $t2->{name}; glBegin GL_QUADS; - glTexCoord 0 , $t2->{t} * (1 - $ycut); glVertex 0 , $yp; - glTexCoord 0 , $t2->{t}; glVertex 0 , $yp + $h2; - glTexCoord $t2->{s}, $t2->{t}; glVertex 0 + $w, $yp + $h2; - glTexCoord $t2->{s}, $t2->{t} * (1 - $ycut); glVertex 0 + $w, $yp; + glTexCoord 0 , $t2->{t} * (1 - $ycut); glVertex 0 , $h1; + glTexCoord 0 , $t2->{t}; glVertex 0 , $h1 + $h2; + glTexCoord $t2->{s}, $t2->{t}; glVertex $w, $h1 + $h2; + glTexCoord $t2->{s}, $t2->{t} * (1 - $ycut); glVertex $w, $h1; glEnd; glDisable GL_BLEND; @@ -1539,6 +1643,51 @@ ############################################################################# +package CFClient::UI::Gauge; + +our @ISA = CFClient::UI::VBox::; + +sub new { + my ($class, %arg) = shift; + + my $self = $class->SUPER::new ( + @_, + ); + + $self->add ($self->{value} = new CFClient::UI::Label valign => 1, align => 0, template => "999"); + $self->add ($self->{gauge} = new CFClient::UI::VGauge type => $self->{type}, expand => 1); + $self->add ($self->{max} = new CFClient::UI::Label valign => 1, align => 0, template => "999"); + + $self +} + +sub set_fontsize { + my ($self, $fsize) = @_; + + $self->{value}->set_fontsize ($fsize); + $self->{max} ->set_fontsize ($fsize); + $self->update; +} + +sub set_value { + my ($self, $val, $max) = @_; + + $self->set_max ($max) + if defined $max; + + $self->{gauge}->set_value ($val, $max); + $self->{value}->set_text ($val); +} + +sub set_max { + my ($self, $max) = @_; + + $self->{gauge}->set_max ($max); + $self->{max}->set_text ($max); +} + +############################################################################# + package CFClient::UI::Slider; use strict; @@ -1954,6 +2103,10 @@ sub add { my ($self, $child) = @_; + # integerize window positions + $child->{x} = int $child->{x}; + $child->{y} = int $child->{y}; + $self->SUPER::add ($child); }