--- deliantra/Deliantra-Client/DC/UI.pm 2007/08/19 10:32:49 1.427 +++ deliantra/Deliantra-Client/DC/UI.pm 2007/09/01 07:22:21 1.438 @@ -32,10 +32,6 @@ return if $ENV{CFPLUS_DEBUG} & 8; - my $tip = $widget->{tooltip}; - - $tip = $tip->($widget) if CODE:: eq ref $tip; - $TOOLTIP->set_tooltip_from ($widget); $TOOLTIP->show; } @@ -275,7 +271,7 @@ } sub TO_JSON { - { __w_ => $_[0]{s_id} } + { "\fw" => $_[0]{s_id} } } sub show { @@ -609,6 +605,7 @@ return if CFPlus::in_destruct; + local $@; eval { $self->destroy }; warn "exception during widget destruction: $@" if $@ & $@ != /during global destruction/; @@ -627,8 +624,6 @@ sub new { my $class = shift; - # range [value, low, high, page] - $class->SUPER::new ( #bg => [0, 0, 0, 0.2], #active_bg => [1, 1, 1, 0.5], @@ -649,14 +644,7 @@ glEnable GL_BLEND; glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; glColor_premultiply @$color; - - glBegin GL_QUADS; - glVertex 0 , 0; - glVertex 0 , $h; - glVertex $w, $h; - glVertex $w, 0; - glEnd; - + glRect 0, 0, $w, $h; glDisable GL_BLEND; } } @@ -1221,14 +1209,7 @@ glEnable GL_BLEND; glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; glColor_premultiply @{ $self->{bg} }; - - glBegin GL_QUADS; - glVertex 0 , 0; - glVertex 0 , $h; - glVertex $w, $h; - glVertex $w, 0; - glEnd; - + glRect 0, 0, $w, $h; glDisable GL_BLEND; } @@ -2237,12 +2218,7 @@ glEnable GL_BLEND; glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; - glBegin GL_QUADS; - glVertex 0 , 0; - glVertex 0 , $self->{h}; - glVertex $self->{w}, $self->{h}; - glVertex $self->{w}, 0; - glEnd; + glRect 0, 0, $self->{w}, $self->{h}; glDisable GL_BLEND; $self->SUPER::_draw; @@ -2259,28 +2235,22 @@ glColor_premultiply @{$self->{active_fg}}; glBegin GL_LINES; - glVertex 0.5 + $self->{cur_x} + $self->{ox}, $self->{cur_y} + $self->{oy}; - glVertex 0.5 + $self->{cur_x} + $self->{ox}, $self->{cur_y} + $self->{oy} + $self->{cur_h}; + glVertex $self->{cur_x} + $self->{ox} + .5, $self->{cur_y} + $self->{oy}; + glVertex $self->{cur_x} + $self->{ox} + .5, $self->{cur_y} + $self->{oy} + $self->{cur_h}; glEnd; glLineWidth 3; glColor @{$self->{active_outline}}; - glBegin GL_LINE_LOOP; - glVertex 0, 0; - glVertex $self->{w} - 1, 0; - glVertex $self->{w} - 1, $self->{h} - 1; - glVertex 0, $self->{h} - 1; - glEnd; + glRect_lineloop 1.5, 1.5, $self->{w} - 1.5, $self->{h} - 1.5; glLineWidth 1; } else { glColor @{$self->{outline}}; - glTranslate .375, .375; glBegin GL_LINE_STRIP; - glVertex 0, $self->{h} * .5; - glVertex 0, $self->{h} - 3; - glVertex $self->{w} - 1, $self->{h} - 3; - glVertex $self->{w} - 1, $self->{h} * .5; + glVertex .5, $self->{h} * .5; + glVertex .5, $self->{h} - 2.5; + glVertex $self->{w} - .5, $self->{h} - 2.5; + glVertex $self->{w} - .5, $self->{h} * .5; glEnd; } } @@ -2539,7 +2509,7 @@ $self->SUPER::_draw; - glTranslate $self->{padding_x} + 0.375, $self->{padding_y} + 0.375, 0; + glTranslate $self->{padding_x}, $self->{padding_y}, 0; my ($w, $h) = @$self{qw(w h)}; @@ -2655,6 +2625,12 @@ ); } +sub invoke_button_down { + my ($self, $ev, $x, $y) = @_; + + 1 +} + sub invoke_button_up { my ($self, $ev, $x, $y) = @_; @@ -2802,6 +2778,144 @@ ############################################################################# +package CFPlus::UI::Progress; + +our @ISA = CFPlus::UI::Label::; + +use CFPlus::OpenGL; + +sub new { + my ($class, %arg) = @_; + + my $self = $class->SUPER::new ( + fg => [1, 1, 1], + bg => [0, 0, 1, 0.2], + bar => [0.7, 0.5, 0.1, 0.8], + outline => [0.4, 0.3, 0], + fontsize => 0.9, + valign => 0, + align => 0, + can_events => 1, + ellipsise => 1, + label => "%d%%", + %arg, + ); + + $self->set_value ($arg{value} || -1); + + $self +} + +sub set_label { + my ($self, $label) = @_; + + return if $self->{label} eq $label; + $self->{label} = $label; + + $self->CFPlus::UI::Progress::set_value (0 + delete $self->{value}); +} + +sub set_value { + my ($self, $value) = @_; + + if ($self->{value} ne $value) { + $self->{value} = $value; + + if ($value < 0) { + $self->set_text ("-"); + } else { + $self->set_text (sprintf $self->{label}, $value * 100); + } + + $self->update; + } +} + +sub _draw { + my ($self) = @_; + + glEnable GL_BLEND; + glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; + + if ($self->{value} >= 0) { + my $s = int 2 + ($self->{w} - 4) * $self->{value}; + + glColor_premultiply @{$self->{bar}}; + glRect 2, 2, $s, $self->{h} - 2; + glColor_premultiply @{$self->{bg}}; + glRect $s, 2, $self->{w} - 2, $self->{h} - 2; + } + + glColor_premultiply @{$self->{outline}}; + glRect_lineloop 1.5, 1.5, $self->{w} - 1.5, $self->{h} - 1.5; + + glDisable GL_BLEND; + + { + local $self->{bg}; # do not draw background + $self->SUPER::_draw; + } +} + +############################################################################# + +package CFPlus::UI::ExperienceProgress; + +our @ISA = CFPlus::UI::Progress::; + +sub new { + my ($class, %arg) = @_; + + my $self = $class->SUPER::new ( + tooltip => sub { + my ($self) = @_; + + sprintf "level %d\n%s points\n%s next level\n%s to go", + $self->{lvl}, + ::formsep ($self->{exp}), + ::formsep ($self->{nxt}), + ::formsep ($self->{nxt} - $self->{exp}), + }, + %arg + ); + + $::CONN->{on_exp_update}{$self+0} = sub { $self->set_value ($self->{value}) } + if $::CONN; + + $self +} + +sub DESTROY { + my ($self) = @_; + + delete $::CONN->{on_exp_update}{$self+0} + if $::CONN; + + $self->SUPER::DESTROY; +} + +sub set_value { + my ($self, $lvl, $exp) = @_; + + $self->{lvl} = $lvl; + $self->{exp} = $exp; + + my $v = -1; + + if ($::CONN && (my $table = $::CONN->{exp_table})) { + my $l0 = $table->[$lvl - 1]; + my $l1 = $table->[$lvl]; + + $self->{nxt} = $l1; + + $v = ($exp - $l0) / ($l1 - $l0); + } + + $self->SUPER::set_value ($v); +} + +############################################################################# + package CFPlus::UI::Gauge; our @ISA = CFPlus::UI::VBox::; @@ -3440,23 +3554,24 @@ sub set_tooltip_from { my ($self, $widget) = @_; - $widget->{tooltip} = CFPlus::Pod::section_label tooltip => $1 - if $widget->{tooltip} =~ /^#(.*)$/; - - my $tooltip = $widget->{tooltip}; + my $tip = $widget->{tooltip}; + $tip = $tip->($widget) if "CODE" eq ref $tip; + + $tip = CFPlus::Pod::section_label tooltip => $1 + if $tip =~ /^#(.*)$/; if ($ENV{CFPLUS_DEBUG} & 2) { - $tooltip .= "\n\n" . (ref $widget) . "\n" - . "$widget->{x} $widget->{y} $widget->{w} $widget->{h}\n" - . "req $widget->{req_w} $widget->{req_h}\n" - . "visible $widget->{visible}"; + $tip .= "\n\n" . (ref $widget) . "\n" + . "$widget->{x} $widget->{y} $widget->{w} $widget->{h}\n" + . "req $widget->{req_w} $widget->{req_h}\n" + . "visible $widget->{visible}"; } - $tooltip =~ s/^\n+//; - $tooltip =~ s/\n+$//; + $tip =~ s/^\n+//; + $tip =~ s/\n+$//; $self->add (new CFPlus::UI::Label - markup => $tooltip, + markup => $tip, max_w => ($widget->{tooltip_width} || 0.25) * $::WIDTH, fontsize => 0.8, style => 1, # FLAG_INVERSE @@ -3504,22 +3619,15 @@ sub _draw { my ($self) = @_; - glTranslate 0.375, 0.375; - my ($w, $h) = @$self{qw(w h)}; glColor 1, 0.8, 0.4; glRect 0, 0, $w, $h; glColor 0, 0, 0; - glBegin GL_LINE_LOOP; - glVertex 0 , 0; - glVertex 0 , $h; - glVertex $w, $h; - glVertex $w, 0; - glEnd; + glRect_lineloop .5, .5, $w + .5, $h + .5; - glTranslate 2 - 0.375, 2 - 0.375; + glTranslate 2, 2; $self->SUPER::_draw; } @@ -3592,15 +3700,16 @@ sub update_face { my ($self) = @_; - return unless $::CONN; - - if (my $anim = $::CONN->{anim}[$self->{anim}]) { - if ($anim && @$anim) { - delete $self->{wait_face}; - $self->{face} = $anim->[ $self->{frame} % @$anim ]; - if (my $tex = $self->{tex} = $::CONN->{texture}[ $::CONN->{faceid}[$self->{face}] ]) { - unless ($tex->{name} || $tex->{loading}) { - $tex->upload (sub { $self->reconfigure }); + if ($::CONN) { + if (my $anim = $::CONN->{anim}[$self->{anim}]) { + if ($anim && @$anim) { + $self->{face} = $anim->[ $self->{frame} % @$anim ]; + delete $self->{face_change_cb}; + + if (my $tex = $self->{tex} = $::CONN->{texture}[ $::CONN->{face}[$self->{face}]{id} ]) { + unless ($tex->{name} || $tex->{loading}) { + $tex->upload (sub { $self->reconfigure }); + } } } } @@ -3611,18 +3720,16 @@ my ($self) = @_; if ($::CONN) { - if (my $faceid = $::CONN->{faceid}[$self->{face}]) { + if (my $faceid = $::CONN->{face}[$self->{face}]{id}) { if (my $tex = $self->{tex} = $::CONN->{texture}[$faceid]) { if ($tex->{name}) { return ($self->{size_w} || $tex->{w}, $self->{size_h} || $tex->{h}); } elsif (!$tex->{loading}) { $tex->upload (sub { $self->reconfigure }); } - } else { - $self->{wait_face} ||= $::CONN->connect_face_update ($faceid, sub { - $self->reconfigure; - }); } + + $self->{face_change_cb} ||= $::CONN->on_face_change ($self->{face}, sub { $self->reconfigure }); } } @@ -3847,14 +3954,17 @@ package CFPlus::UI::Notebook; +use CFPlus::OpenGL; + our @ISA = CFPlus::UI::VBox::; sub new { my $class = shift; my $self = $class->SUPER::new ( - buttonbar => (new CFPlus::UI::Buttonbar), - multiplexer => (new CFPlus::UI::Multiplexer expand => 1), + buttonbar => (new CFPlus::UI::Buttonbar), + multiplexer => (new CFPlus::UI::Multiplexer expand => 1), + active_outline => [.7, .7, 0.2], # filter => # will be put between multiplexer and $self @_, ); @@ -3938,6 +4048,26 @@ $self->emit (page_changed => $self->{multiplexer}{current}); } +sub _draw { + my ($self) = @_; + + $self->SUPER::_draw (); + + if (my $cur = $self->{multiplexer}{current}) { + if ($cur = $cur->{c_tab_}) { + glTranslate $self->{buttonbar}{x} + $cur->{x}, + $self->{buttonbar}{y} + $cur->{y}; + glLineWidth 3; + #glEnable GL_BLEND; + #glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA; + glColor @{$self->{active_outline}}; + glRect_lineloop 1.5, 1.5, $cur->{w} - 1.5, $cur->{h} - 1.5; + glLineWidth 1; + #glDisable GL_BLEND; + } + } +} + ############################################################################# package CFPlus::UI::Selector;