--- deliantra/Deliantra-Client/DC/UI.pm 2006/08/13 21:46:10 1.345 +++ deliantra/Deliantra-Client/DC/UI.pm 2006/08/14 01:21:02 1.346 @@ -1134,6 +1134,106 @@ use CFPlus::OpenGL; +sub new { + my ($class, %arg) = @_; + + if ((exists $arg{label}) && !ref $arg{label}) { + $arg{label} = new CFPlus::UI::Label + align => 1, + valign => 1, + text => $arg{label}, + fontsize => ($arg{border} || 0.8) * 0.75; + } + + my $self = $class->SUPER::new ( + # label => "", + fg => [0.6, 0.3, 0.1], + border => 0.8, + style => 'single', + %arg, + ); + + $self +} + +sub add { + my ($self, @widgets) = @_; + + $self->SUPER::add (@widgets); + $self->CFPlus::UI::Container::add ($self->{label}) if $self->{label}; +} + +sub border { + int $_[0]{border} * $::FONTSIZE +} + +sub size_request { + my ($self) = @_; + + ($self->{label_w}, undef) = $self->{label}->size_request + if $self->{label}; + + my ($w, $h) = $self->SUPER::size_request; + + ( + $w + $self->border * 2, + $h + $self->border * 2, + ) +} + +sub invoke_size_allocate { + my ($self, $w, $h) = @_; + + my $border = $self->border; + + $w -= List::Util::max 0, $border * 2; + $h -= List::Util::max 0, $border * 2; + + if (my $label = $self->{label}) { + $label->{w} = List::Util::max 0, List::Util::min $self->{label_w}, $w - $border * 2; + $label->{h} = List::Util::min $h, $border; + $label->invoke_size_allocate ($label->{w}, $label->{h}); + } + + $self->child->configure ($border, $border, $w, $h); + + 1 +} + +sub _draw { + my ($self) = @_; + + my $child = $self->{children}[0]; + + my $border = $self->border; + my ($w, $h) = ($self->{w}, $self->{h}); + + $child->draw; + + glColor @{$self->{fg}}; + glBegin GL_LINE_STRIP; + glVertex $border * 1.5 , $border * 0.5 + 0.5; + glVertex $border * 0.5 + 0.5, $border * 0.5 + 0.5; + glVertex $border * 0.5 + 0.5, $h - $border * 0.5 + 0.5; + glVertex $w - $border * 0.5 + 0.5, $h - $border * 0.5 + 0.5; + glVertex $w - $border * 0.5 + 0.5, $border * 0.5 + 0.5; + glVertex $self->{label} ? $border * 2 + $self->{label}{w} : $border * 1.5, $border * 0.5 + 0.5; + glEnd; + + if ($self->{label}) { + glTranslate $border * 2, 0; + $self->{label}->_draw; + } +} + +############################################################################# + +package CFPlus::UI::Toplevel; + +our @ISA = CFPlus::UI::Bin::; + +use CFPlus::OpenGL; + my $bg = new_from_file CFPlus::Texture CFPlus::find_rcfile "d1_bg.png", mipmap => 1, wrap => 1; @@ -3191,7 +3291,7 @@ package CFPlus::UI::Menu; -our @ISA = CFPlus::UI::FancyFrame::; +our @ISA = CFPlus::UI::Toplevel::; use CFPlus::OpenGL;