--- deliantra/Deliantra-Client/DC/Item.pm 2007/12/26 18:09:30 1.9 +++ deliantra/Deliantra-Client/DC/Item.pm 2012/11/21 13:23:10 1.19 @@ -1,8 +1,6 @@ -package CFPlus::Item; +package DC::Item; -use strict; -use utf8; -use Encode; +use common::sense; use Deliantra::Protocol::Constants; @@ -14,7 +12,7 @@ my $desc = $self->{nrof} < 2 ? $self->{name} - : "$self->{nrof} × $self->{name_pl}"; + : "$self->{nrof} $self->{name_pl}"; $self->{flags} & F_OPEN and $desc .= " (open)"; @@ -45,14 +43,14 @@ sub do_n_dialog { my ($cb) = @_; - my $w = new CFPlus::UI::Toplevel + my $w = new DC::UI::Toplevel on_delete => sub { $_[0]->destroy; 1 }, has_close_button => 1, ; - $w->add (my $vb = new CFPlus::UI::VBox x => "center", y => "center"); - $vb->add (new CFPlus::UI::Label text => "Enter item count:"); - $vb->add (my $entry = new CFPlus::UI::Entry + $w->add (my $vb = new DC::UI::VBox x => "center", y => "center"); + $vb->add (new DC::UI::Label text => "Enter item count:"); + $vb->add (my $entry = new DC::UI::Entry text => $last_enter_count, on_activate => sub { my ($entry) = @_; @@ -69,11 +67,14 @@ $w->show; } +my $bg_cursed = [1 , 0 , 0, 0.5]; +my $bg_magic = [0.2, 0.2, 1, 0.5]; + sub update_widgets { my ($self) = @_; # necessary to avoid cyclic references - CFPlus::weaken $self; + DC::weaken $self; my $button_cb = sub { my (undef, $ev, $x, $y) = @_; @@ -84,10 +85,10 @@ $targ = $::CONN->{open_container}; } - if (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 1) { + if (($ev->{mod} & DC::KMOD_SHIFT) && $ev->{button} == 1) { $::CONN->send ("move $targ $self->{tag} 0") if $targ || !($self->{flags} & F_LOCKED); - } elsif (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 2) { + } elsif (($ev->{mod} & DC::KMOD_SHIFT) && $ev->{button} == 2) { $self->{flags} & F_LOCKED ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) : $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) @@ -101,7 +102,7 @@ $move_prefix = "take"; } - my $shortname = CFPlus::shorten $self->{name}, 14; + my $shortname = DC::shorten $self->{name}, 14; my @menu_items = ( ["examine", sub { $::CONN->send ("examine $self->{tag}") }], @@ -147,10 +148,10 @@ ] ) ), - ["bind apply $shortname to a key" => sub { CFPlus::Macro::quick_macro ["apply $self->{name}"] }], + ["bind apply $shortname to a key" => sub { DC::Macro::quick_macro ["apply $self->{name}"] }], ); - CFPlus::UI::Menu->new (items => \@menu_items)->popup ($ev); + DC::UI::Menu->new (items => \@menu_items)->popup ($ev); } 1 @@ -165,36 +166,51 @@ . "Right click - further options" . "\n"; - my $bg = $self->{flags} & F_CURSED ? [1 , 0 , 0, 0.5] - : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5] + my $bg = $self->{flags} & F_CURSED ? $bg_cursed + : $self->{flags} & F_MAGIC ? $bg_magic : undef; - my $desc = CFPlus::Item::desc_string $self; + my $desc = DC::Item::desc_string $self; + my $face_tooltip = "$desc\n\n$tooltip_std"; - $self->{face_widget} ||= new CFPlus::UI::Face - can_events => 1, - can_hover => 1, - anim => $self->{anim}, - animspeed => $self->{animspeed}, # TODO# must be set at creation time - on_button_down => $button_cb, - ; - $self->{face_widget}{bg} = $bg; - $self->{face_widget}{face} = $self->{face}; - $self->{face_widget}{anim} = $self->{anim}; - $self->{face_widget}{animspeed} = $self->{animspeed}; -# $self->{face_widget}->set_tooltip ( -# "Face/Animation.\n" -# . "Item uses face #$self->{face}. " -# . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ") -# . "\n\n$tooltip_std" -# ); - $self->{face_widget}->set_tooltip ("$desc\n\n$tooltip_std"); + if (my $face = $self->{face_widget}) { + # already exists, so update if it changed + if ($face->{bg} != $bg) { + $face->{bg} = $bg; + $face->update; + } + + $face->set_bg ($bg) if $face->{bg} != $bg; + $face->set_face ($self->{face}) if $face->{face} != $self->{face}; + $face->set_anim ($self->{anim}) if $face->{anim} != $self->{anim}; + $face->set_animspeed ($self->{animspeed}) if $face->{animspeed} != $self->{animspeed}; + + #$face->set_tooltip ( + # "Face/Animation.\n" + # . "Item uses face #$self->{face}. " + # . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ") + # . "\n\n$tooltip_std" + #); + $face->set_tooltip ($face_tooltip); + } else { + # new object, create new face + $self->{face_widget} = new DC::UI::Face + can_events => 1, + can_hover => 1, + bg => $bg, + face => $self->{face}, + anim => $self->{anim}, + animspeed => $self->{animspeed}, # TODO# must be set at creation time + tooltip => $face_tooltip, + on_button_down => $button_cb, + ; + } - $self->{desc_widget} ||= new CFPlus::UI::Label + $self->{desc_widget} ||= new DC::UI::Label can_events => 1, can_hover => 1, ellipsise => 2, - align => -1, + align => 0, on_button_down => $button_cb, on_tooltip_show => sub { @@ -203,7 +219,7 @@ $::CONN && $::CONN->ex ($self->{tag}, sub { my ($long_desc) = @_; - $long_desc =~ s/\s+$//; + $long_desc = DC::sanitise_cfxml ($long_desc); $self->{long_desc} = $long_desc; $widget->set_tooltip ("$long_desc\n\n$tooltip_std"); @@ -211,21 +227,20 @@ }, ; - $self->{desc_widget}{bg} = $bg; - $self->{desc_widget}->set_text ($desc); - my $long_desc = $self->{long_desc} || $desc; + + $self->{desc_widget}->set_bg ($bg) if $self->{desc_widget}{bg} != $bg; + $self->{desc_widget}->set_text ($desc); $self->{desc_widget}->set_tooltip ("$long_desc\n\n$tooltip_std"); - $self->{weight_widget} ||= new CFPlus::UI::Label + $self->{weight_widget} ||= new DC::UI::Label can_events => 1, can_hover => 1, ellipsise => 0, - align => 0, on_button_down => $button_cb, ; $self->{weight_widget}{bg} = $bg; - $self->{weight_widget}->set_text (CFPlus::Item::weight_string $self); + $self->{weight_widget}->set_text (DC::Item::weight_string $self); $self->{weight_widget}->set_tooltip ( "Weight.\n" . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ")