ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/Item.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC/Item.pm (file contents):
Revision 1.2 by root, Sat Dec 9 21:26:46 2006 UTC vs.
Revision 1.15 by root, Sun Jan 11 23:50:27 2009 UTC

1package CFPlus::Item; 1package DC::Item;
2 2
3use strict; 3use strict;
4use utf8;
5use Encode;
6
4use Crossfire::Protocol::Constants; 7use Deliantra::Protocol::Constants;
5 8
6my $last_enter_count = 1; 9my $last_enter_count = 1;
7 10
8sub desc_string { 11sub desc_string {
9 my ($self) = @_; 12 my ($self) = @_;
40} 43}
41 44
42sub do_n_dialog { 45sub do_n_dialog {
43 my ($cb) = @_; 46 my ($cb) = @_;
44 47
45 my $w = new CFPlus::UI::Toplevel 48 my $w = new DC::UI::Toplevel
46 on_delete => sub { $_[0]->destroy; 1 }, 49 on_delete => sub { $_[0]->destroy; 1 },
47 has_close_button => 1, 50 has_close_button => 1,
48 ; 51 ;
49 52
50 $w->add (my $vb = new CFPlus::UI::VBox x => "center", y => "center"); 53 $w->add (my $vb = new DC::UI::VBox x => "center", y => "center");
51 $vb->add (new CFPlus::UI::Label text => "Enter item count:"); 54 $vb->add (new DC::UI::Label text => "Enter item count:");
52 $vb->add (my $entry = new CFPlus::UI::Entry 55 $vb->add (my $entry = new DC::UI::Entry
53 text => $last_enter_count, 56 text => $last_enter_count,
54 on_activate => sub { 57 on_activate => sub {
55 my ($entry) = @_; 58 my ($entry) = @_;
56 $last_enter_count = $entry->get_text; 59 $last_enter_count = $entry->get_text;
57 $cb->($last_enter_count); 60 $cb->($last_enter_count);
64 ); 67 );
65 $entry->grab_focus; 68 $entry->grab_focus;
66 $w->show; 69 $w->show;
67} 70}
68 71
72my $bg_cursed = [1 , 0 , 0, 0.5];
73my $bg_magic = [0.2, 0.2, 1, 0.5];
74
69sub update_widgets { 75sub update_widgets {
70 my ($self) = @_; 76 my ($self) = @_;
71 77
72 # necessary to avoid cyclic references 78 # necessary to avoid cyclic references
73 CFPlus::weaken $self; 79 DC::weaken $self;
74 80
75 my $button_cb = sub { 81 my $button_cb = sub {
76 my (undef, $ev, $x, $y) = @_; 82 my (undef, $ev, $x, $y) = @_;
77 83
78 my $targ = $::CONN->{player}{tag}; 84 my $targ = $::CONN->{player}{tag};
79 85
80 if ($self->{container} == $::CONN->{player}{tag}) { 86 if ($self->{container} == $::CONN->{player}{tag}) {
81 $targ = $::CONN->{open_container}; 87 $targ = $::CONN->{open_container};
82 } 88 }
83 89
84 if (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 1) { 90 if (($ev->{mod} & DC::KMOD_SHIFT) && $ev->{button} == 1) {
85 $::CONN->send ("move $targ $self->{tag} 0") 91 $::CONN->send ("move $targ $self->{tag} 0")
86 if $targ || !($self->{flags} & F_LOCKED); 92 if $targ || !($self->{flags} & F_LOCKED);
87 } elsif (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 2) { 93 } elsif (($ev->{mod} & DC::KMOD_SHIFT) && $ev->{button} == 2) {
88 $self->{flags} & F_LOCKED 94 $self->{flags} & F_LOCKED
89 ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) 95 ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag})
90 : $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) 96 : $::CONN->send ("lock " . pack "CN", 1, $self->{tag})
91 } elsif ($ev->{button} == 1) { 97 } elsif ($ev->{button} == 1) {
92 $::CONN->send ("examine $self->{tag}"); 98 $::CONN->send ("examine $self->{tag}");
96 my $move_prefix = $::CONN->{open_container} ? 'put' : 'drop'; 102 my $move_prefix = $::CONN->{open_container} ? 'put' : 'drop';
97 if ($self->{container} == $::CONN->{open_container}) { 103 if ($self->{container} == $::CONN->{open_container}) {
98 $move_prefix = "take"; 104 $move_prefix = "take";
99 } 105 }
100 106
101 my $shortname = CFPlus::shorten $self->{name}, 14; 107 my $shortname = DC::shorten $self->{name}, 14;
102 108
103 my @menu_items = ( 109 my @menu_items = (
104 ["examine", sub { $::CONN->send ("examine $self->{tag}") }], 110 ["examine", sub { $::CONN->send ("examine $self->{tag}") }],
105 ["mark", sub { $::CONN->send ("mark ". pack "N", $self->{tag}) }], 111 ["mark", sub { $::CONN->send ("mark ". pack "N", $self->{tag}) }],
106 ["ignite/thaw", # first try of an easier use of flint&steel 112 ["ignite/thaw", # first try of an easier use of flint&steel
112 ["inscribe", # first try of an easier use of flint&steel 118 ["inscribe", # first try of an easier use of flint&steel
113 sub { 119 sub {
114 &::open_string_query ("Text to inscribe", sub { 120 &::open_string_query ("Text to inscribe", sub {
115 my ($entry, $txt) = @_; 121 my ($entry, $txt) = @_;
116 $::CONN->send ("mark ". pack "N", $self->{tag}); 122 $::CONN->send ("mark ". pack "N", $self->{tag});
117 $::CONN->send ("command use_skill inscription $txt"); 123 $::CONN->send_utf8 ("command use_skill inscription $txt");
118 }); 124 });
119 } 125 }
120 ], 126 ],
121 ["rename", # first try of an easier use of flint&steel 127 ["rename", # first try of an easier use of flint&steel
122 sub { 128 sub {
123 &::open_string_query ("Rename item to:", sub { 129 &::open_string_query ("Rename item to:", sub {
124 my ($entry, $txt) = @_; 130 my ($entry, $txt) = @_;
125 $::CONN->send ("mark ". pack "N", $self->{tag}); 131 $::CONN->send ("mark ". pack "N", $self->{tag});
126 $::CONN->send ("command rename to <$txt>"); 132 $::CONN->send_utf8 ("command rename to <$txt>");
127 }, $self->{name}, 133 }, $self->{name},
128 "If you input no name or erase the current custom name, the custom name will be unset"); 134 "If you input no name or erase the current custom name, the custom name will be unset");
129 } 135 }
130 ], 136 ],
131 ["apply", sub { $::CONN->send ("apply $self->{tag}") }], 137 ["apply", sub { $::CONN->send ("apply $self->{tag}") }],
142 do_n_dialog (sub { $::CONN->send ("move $targ $self->{tag} $_[0]") }) 148 do_n_dialog (sub { $::CONN->send ("move $targ $self->{tag} $_[0]") })
143 } 149 }
144 ] 150 ]
145 ) 151 )
146 ), 152 ),
147 ["bind <i>apply $shortname</i> to a key" => sub { CFPlus::Macro::quick_macro ["apply $self->{name}"] }], 153 ["bind <i>apply $shortname</i> to a key" => sub { DC::Macro::quick_macro ["apply $self->{name}"] }],
148 ); 154 );
149 155
150 CFPlus::UI::Menu->new (items => \@menu_items)->popup ($ev); 156 DC::UI::Menu->new (items => \@menu_items)->popup ($ev);
151 } 157 }
152 158
153 1 159 1
154 }; 160 };
155 161
156 my $tooltip_std = "<small>" 162 my $tooltip_std =
163 "<small>"
157 . "Left click - examine item\n" 164 . "Left click - examine item\n"
158 . "Shift-Left click - " . ($self->{container} ? "move or drop" : "take") . " item\n" 165 . "Shift-Left click - " . ($self->{container} ? "move or drop" : "take") . " item\n"
159 . "Middle click - apply\n" 166 . "Middle click - apply\n"
160 . "Shift-Middle click - lock/unlock\n" 167 . "Shift-Middle click - lock/unlock\n"
161 . "Right click - further options" 168 . "Right click - further options"
162 . "</small>\n"; 169 . "</small>\n";
163 170
164 my $bg = $self->{flags} & F_CURSED ? [1 , 0 , 0, 0.5] 171 my $bg = $self->{flags} & F_CURSED ? $bg_cursed
165 : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5] 172 : $self->{flags} & F_MAGIC ? $bg_magic
166 : undef; 173 : undef;
167 174
168 $self->{face_widget} ||= new CFPlus::UI::Face 175 my $desc = DC::Item::desc_string $self;
169 can_events => 1, 176 my $face_tooltip = "<b>$desc</b>\n\n$tooltip_std";
170 can_hover => 1, 177
171 anim => $self->{anim}, 178 if (my $face = $self->{face_widget}) {
172 animspeed => $self->{animspeed}, # TODO# must be set at creation time 179 # already exists, so update if it changed
173 on_button_down => $button_cb, 180 if ($face->{bg} != $bg) {
174 ; 181 $face->{bg} = $bg;
175 $self->{face_widget}{bg} = $bg; 182 $face->update;
176 $self->{face_widget}{face} = $self->{face}; 183 }
177 $self->{face_widget}{anim} = $self->{anim}; 184
178 $self->{face_widget}{animspeed} = $self->{animspeed}; 185 $face->set_bg ($bg) if $face->{bg} != $bg;
179 $self->{face_widget}->set_tooltip ( 186 $face->set_face ($self->{face}) if $face->{face} != $self->{face};
187 $face->set_anim ($self->{anim}) if $face->{anim} != $self->{anim};
188 $face->set_animspeed ($self->{animspeed}) if $face->{animspeed} != $self->{animspeed};
189
190 #$face->set_tooltip (
180 "<b>Face/Animation.</b>\n" 191 # "<b>Face/Animation.</b>\n"
181 . "Item uses face #$self->{face}. " 192 # . "Item uses face #$self->{face}. "
182 . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ") 193 # . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ")
183 . "\n\n$tooltip_std" 194 # . "\n\n$tooltip_std"
184 ); 195 #);
196 $face->set_tooltip ($face_tooltip);
197 } else {
198 # new object, create new face
199 $self->{face_widget} = new DC::UI::Face
200 can_events => 1,
201 can_hover => 1,
202 bg => $bg,
203 face => $self->{face},
204 anim => $self->{anim},
205 animspeed => $self->{animspeed}, # TODO# must be set at creation time
206 tooltip => $face_tooltip,
207 on_button_down => $button_cb,
208 ;
209 }
185 210
186 $self->{desc_widget} ||= new CFPlus::UI::Label 211 $self->{desc_widget} ||= new DC::UI::Label
187 can_events => 1, 212 can_events => 1,
188 can_hover => 1, 213 can_hover => 1,
189 ellipsise => 2, 214 ellipsise => 2,
190 align => -1, 215 align => 0,
216
191 on_button_down => $button_cb, 217 on_button_down => $button_cb,
218 on_tooltip_show => sub {
219 my ($widget) = @_;
220
221 $::CONN && $::CONN->ex ($self->{tag}, sub {
222 my ($long_desc) = @_;
223
224 $long_desc = DC::Protocol::sanitise_xml ($long_desc);
225
226 $self->{long_desc} = $long_desc;
227 $widget->set_tooltip ("<b>$long_desc</b>\n\n$tooltip_std");
228 });
229 },
192 ; 230 ;
193 my $desc = CFPlus::Item::desc_string $self; 231
194 $self->{desc_widget}{bg} = $bg; 232 my $long_desc = $self->{long_desc} || $desc;
233
234 $self->{desc_widget}->set_bg ($bg) if $self->{desc_widget}{bg} != $bg;
195 $self->{desc_widget}->set_text ($desc); 235 $self->{desc_widget}->set_text ($desc);
196 $self->{desc_widget}->set_tooltip ("<b>$desc</b>.\n$tooltip_std"); 236 $self->{desc_widget}->set_tooltip ("<b>$long_desc</b>\n\n$tooltip_std");
197 237
198 $self->{weight_widget} ||= new CFPlus::UI::Label 238 $self->{weight_widget} ||= new DC::UI::Label
199 can_events => 1, 239 can_events => 1,
200 can_hover => 1, 240 can_hover => 1,
201 ellipsise => 0, 241 ellipsise => 0,
202 align => 0,
203 on_button_down => $button_cb, 242 on_button_down => $button_cb,
204 ; 243 ;
205 $self->{weight_widget}{bg} = $bg; 244 $self->{weight_widget}{bg} = $bg;
206 $self->{weight_widget}->set_text (CFPlus::Item::weight_string $self); 245 $self->{weight_widget}->set_text (DC::Item::weight_string $self);
207 $self->{weight_widget}->set_tooltip ( 246 $self->{weight_widget}->set_tooltip (
208 "<b>Weight</b>.\n" 247 "<b>Weight</b>.\n"
209 . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ") 248 . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ")
210 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ") 249 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ")
211 . "\n\n$tooltip_std" 250 . "\n\n$tooltip_std"
212 ); 251 );
213} 252}
253

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines