ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/AttrEdit.pm
(Generate patch)

Comparing deliantra/gde/GCE/AttrEdit.pm (file contents):
Revision 1.46.2.1 by elmex, Tue Jul 7 15:42:18 2009 UTC vs.
Revision 1.46.2.2 by elmex, Mon Dec 21 15:51:30 2009 UTC

3=head1 NAME 3=head1 NAME
4 4
5 GCE::AttrEdit - an edit wiget for attributes 5 GCE::AttrEdit - an edit wiget for attributes
6 6
7=cut 7=cut
8
9use Scalar::Util qw/weaken/;
8 10
9use Gtk2; 11use Gtk2;
10use Gtk2::Gdk::Keysyms; 12use Gtk2::Gdk::Keysyms;
11use Gtk2::SimpleList; 13use Gtk2::SimpleList;
12 14
64 my $ar = $self->{archref}; 66 my $ar = $self->{archref};
65 return unless $ar; 67 return unless $ar;
66 unless ($self->{attach_editor}) { 68 unless ($self->{attach_editor}) {
67 my $w = GCE::AttachEditor->new; 69 my $w = GCE::AttachEditor->new;
68 $w->set_attachment ( 70 $w->set_attachment (
69 $ar->get ('attach'), 71 $ar->attr ('attach'),
70 sub { 72 sub {
71 if (@{$_[0]}) { 73 if (@{$_[0]}) {
72 $ar->set (attach => $_[0]) 74 $ar->attr_set (attach => $_[0], undef, 'attr_edit')
73 } else { 75 } else {
74 $ar->set (attach => undef) 76 $ar->attr_set (attach => undef, undef, 'attr_edit')
75 } 77 }
76 } 78 }
77 ); 79 );
78 $self->{attach_editor} = $w; 80 $self->{attach_editor} = $w;
79 $w->signal_connect (destroy => sub { delete $self->{attach_editor} }); 81 $w->signal_connect (destroy => sub { delete $self->{attach_editor} });
115 $self->{use_lbl}->set_line_wrap (1); 117 $self->{use_lbl}->set_line_wrap (1);
116 118
117 $self->add2 (my $sw = Gtk2::ScrolledWindow->new); 119 $self->add2 (my $sw = Gtk2::ScrolledWindow->new);
118 $sw->set_policy ('automatic', 'automatic'); 120 $sw->set_policy ('automatic', 'automatic');
119 $sw->add_with_viewport (my $inv = $self->{inv_edit} = GCE::InventoryEditor->new); 121 $sw->add_with_viewport (my $inv = $self->{inv_edit} = GCE::InventoryEditor->new);
120
121 $::MAINWIN->reg_cb (
122 cursor_updates => sub {
123 my ($mainwin, $cursors) = @_;
124
125 if (grep { $_ == $self->{archref} } @$cursors) {
126 $self->set_from_map;
127 }
128 }
129 );
130}
131
132#sub spawn_editor {
133# my ($arch, $cb) = @_;
134#
135# my $w = Gtk2::Window->new;
136# $w->set_title ("gce - edit attrs");
137# $w->add (my $ae = GCE::AttrEdit->new);
138#
139# main::set_pos_and_size ($w, $main::CFG->{attr_view}, 200, 200);
140#
141# $ae->set_arch ($arch, $cb);
142# $w->set_title ("gce - edit $arch->{_name}");
143#
144# $w->show_all;
145#}
146
147sub update_arch {
148 my ($self, $ar, $key, $value) = @_;
149 $ar->set ($key, $value);
150}
151
152sub set_attr {
153 my ($self, $key, $value) = @_;
154
155 my $attr = $self->{archref}->get ($key);
156
157 unless (ref $attr) {
158
159 $self->{archref}->set ($key, $value);
160 }
161} 122}
162 123
163sub get_arch { 124sub get_arch {
164 my ($self) = @_; 125 my ($self) = @_;
165
166 $self->{archref} 126 $self->{arch}
167} 127}
168 128
169#sub update { 129sub update_attrs {
170# my ($self, $narch) = @_; 130 my ($self) = @_;
171#
172# if (ref ($narch) ne 'GCE::ArchRef') { require Carp; Carp::confess ("NO ARCH REF!") }
173#
174# if ($narch) {
175# $self->set_arch ($narch);
176# } else {
177# $self->set_arch ($self->{archref});
178# }
179#}
180 131
181sub set_from_map {
182 #my ($self, $ar, $clear_inv) = @_;
183 my ($self, $map, $x, $y, $z) = @_;
184
185 unless (defined $map) {
186 ($map, $x, $y, $z) = (
187 $self->{archref}->{map},
188 $self->{archref}->{x},
189 $self->{archref}->{y},
190 $self->{archref}->{z}
191 );
192 }
193
194 my $ar =
195 $self->{archref} =
196 $::MAINWIN->cursor ($map, attr_edit => $x, $y, $z);
197
198 unless (defined $ar) {
199 $ar = $self->{archref} = 132 my $ar = $self->{arch};
200 GCE::ArchRef->new (arch => { _name => 'empty_archetype' }); 133
201 } 134 $self->{attach_editor}->destroy
135 if $self->{attach_editor};
202 136
203 # XXX: port to new scheme 137 # XXX: port to new scheme
204 $self->{attach_editor}->destroy if $self->{attach_editor};
205
206 #$self->{inv_edit}->clear_inv_hist if $clear_inv; 138 #$self->{inv_edit}->clear_inv_hist if $clear_inv;
207 #$self->{inv_edit}->set_arch ($ar); 139 #$self->{inv_edit}->set_arch ($ar);
208 140
209 $self->{arch_name_lbl}->set_text ($ar->longname); 141 $self->{arch_name_lbl}->set_text ($ar->longname);
142 warn "LONGNAME: " . $ar->longname . "\n";
210 143
211 fill_pb_from_arch ($self->{arch_pb}, $ar->getarch); 144 fill_pb_from_arch ($self->{arch_pb}, $ar->get);
212 $self->{arch_img}->set_from_pixbuf ($self->{arch_pb}); 145 $self->{arch_img}->set_from_pixbuf ($self->{arch_pb});
213 $self->label_set_color ($self->{arch_name_lbl}, 0); 146 $self->label_set_color ($self->{arch_name_lbl}, 0);
214 147
215 $self->{arch_stat_btn}->set_label ($ar->{source}); 148 $self->{arch_stat_btn}->set_label ($ar->{source});
216 149
241 $self->{ntbook}->append_page (my $v = Gtk2::VBox->new, $key); 174 $self->{ntbook}->append_page (my $v = Gtk2::VBox->new, $key);
242 $v->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0); 175 $v->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0);
243 $sw->set_policy ('automatic', 'automatic'); 176 $sw->set_policy ('automatic', 'automatic');
244 $sw->add (my $tb = $self->{"${key}_txt"} = Gtk2::TextView->new); 177 $sw->add (my $tb = $self->{"${key}_txt"} = Gtk2::TextView->new);
245 my $buf = $tb->get_buffer; 178 my $buf = $tb->get_buffer;
179
246 $buf->set_text ($ar->get ($key)); 180 $buf->set_text ($ar->attr ($key));
181
247 $buf->signal_connect (changed => sub { 182 $buf->signal_connect (changed => sub {
248 my ($buf) = @_; 183 my ($buf) = @_;
184
185 my $txt =
186 $buf->get_text (
249 my $txt = $buf->get_text ($buf->get_start_iter, $buf->get_end_iter, 0); 187 $buf->get_start_iter, $buf->get_end_iter, 0);
188
250 if ($txt ne $ar->get ($key)) { 189 if ($txt ne $ar->attr ($key)) {
251 $ar->set ($key, $txt); 190 $ar->attr_set ($key, $txt, 'attr_edit');
252 } 191 }
192
253 1 193 1
254 }); 194 });
255 } 195 }
256 196
257 my $desc = pseudohtml2txt $type->{desc}; 197 my $desc = pseudohtml2txt $type->{desc};
274 $self->{ntbook}->set_current_page ($i); 214 $self->{ntbook}->set_current_page ($i);
275 last; 215 last;
276 } 216 }
277 } 217 }
278 } 218 }
219}
220
221sub update_view {
222 my ($self, $ar) = @_;
223
224 unless (defined $ar) {
225 delete $self->{arch_cb_reg};
226 $ar = $self->{arch};
227 }
228
229 unless (defined $ar) { # fallback in case the arch was deleted!
230 delete $self->{arch_cb_reg};
231 my $sr = GCE::StackRef->new (owner => 'attr_edit');
232 $ar = $sr->cursor (0);
233 }
234
235 $self->{arch} = $ar;
236
237 unless (defined $self->{arch_cb_reg}) {
238 $self->{arch_cb_reg} = $ar->reg_cb (changed => sub {
239 my ($ar, $change, $invalid) = @_;
240
241 if ($invalid) {
242 delete $self->{arch};
243 $self->update_view;
244
245 } elsif ($change =~ /attr_edit!attribute_edit/) {
246 # nop, skip update_view, WE changed!
247
248 } else {
249 $self->update_view;
250 }
251 });
252 }
253
254 $self->update_attrs;
279 255
280 $ar 256 $ar
281} 257}
282 258
283sub add_section_edit_widgets { 259sub add_section_edit_widgets {
346 my $al_arch = $ar->archetype; 322 my $al_arch = $ar->archetype;
347 323
348 if ($type eq 'bool') { 324 if ($type eq 'bool') {
349 my $boolval = def ($edspec->{value}, [0, 1]); 325 my $boolval = def ($edspec->{value}, [0, 1]);
350 326
351
352 $self->label_set_color_default ($lbl, $ar, $key, $ar->get_or_default ($key)); 327 $self->label_set_color_default ($lbl, $ar, $key, $ar->attr_or_arch ($key));
353 328
354 my $chk = new Gtk2::CheckButton (def ($edspec->{name}, $key)); 329 my $chk = new Gtk2::CheckButton (def ($edspec->{name}, $key));
355 $chk->set_active ($ar->get_or_default ($key) == $boolval->[1]); 330 $chk->set_active ($ar->attr_or_arch ($key) == $boolval->[1]);
356 $chk->signal_connect (clicked => sub { 331 $chk->signal_connect (clicked => sub {
357 my ($chk) = @_; 332 my ($chk) = @_;
358 333
359 $ar->set ($key, $boolval->[$chk->get_active * 1], $type); 334 $ar->attr_set ($key, $boolval->[$chk->get_active * 1], $type, 'attr_edit');
360 335
361 $self->label_set_color_default ($lbl, $ar, $key, $boolval->[$chk->get_active * 1]); 336 $self->label_set_color_default ($lbl, $ar, $key, $boolval->[$chk->get_active * 1]);
362 }); 337 });
363 338
364 $self->{ttip}->set_tip ($chk, $al_arch->{$key} * 1); 339 $self->{ttip}->set_tip ($chk, $al_arch->{$key} * 1);
365 340
366 return $chk 341 return $chk
367 342
368 } elsif (grep { $type eq $_ } qw/string int treasurelist float/) { 343 } elsif (grep { $type eq $_ } qw/string int treasurelist float/) {
369 $self->label_set_color_default ($lbl, $ar, $key, $ar->get_or_default ($key)); 344 $self->label_set_color_default ($lbl, $ar, $key, $ar->attr_or_arch ($key));
370 345
371 my $entry = new Gtk2::Entry; 346 my $entry = new Gtk2::Entry;
372 $entry->set_text ($ar->get_or_default ($key)); 347 $entry->set_text ($ar->attr_or_arch ($key));
373 $entry->signal_connect (changed => sub { 348 $entry->signal_connect (changed => sub {
374 my ($entry) = @_; 349 my ($entry) = @_;
375 $self->label_set_color_default ($lbl, $ar, $key, $entry->get_text); 350 $self->label_set_color_default ($lbl, $ar, $key, $entry->get_text);
376 $ar->set ($key, $entry->get_text); 351 $ar->attr_set ($key, $entry->get_text, $type, 'attr_edit');
377 1 352 1
378 }); 353 });
379 354
380 $self->{ttip}->set_tip ($entry, $ar->archetype->{$key}); 355 $self->{ttip}->set_tip ($entry, $ar->archetype->{$key});
381 356
396 371
397 $comb->append_text ($sp->{$_}); 372 $comb->append_text ($sp->{$_});
398 } 373 }
399 #XXX: FIXME: $self->{ttip}->set_tip ($comb, $sp->{$al_arch->{$key}}); 374 #XXX: FIXME: $self->{ttip}->set_tip ($comb, $sp->{$al_arch->{$key}});
400 375
401 $comb->set_active ($spells_idx->{$ar->get_or_default ($key)}); 376 $comb->set_active ($spells_idx->{$ar->attr_or_arch ($key)});
402 $self->label_set_color_default ($lbl, $ar, $key, $ar->get_or_default ($key)); 377 $self->label_set_color_default ($lbl, $ar, $key, $ar->attr_or_arch ($key));
403 378
404 $comb->signal_connect (changed => sub { 379 $comb->signal_connect (changed => sub {
405 my ($comb) = @_; 380 my ($comb) = @_;
406 $self->label_set_color_default ($lbl, $ar, $key, $spells_cmd_idx->{$comb->get_active}); 381 $self->label_set_color_default ($lbl, $ar, $key, $spells_cmd_idx->{$comb->get_active});
407 $ar->set ($key, $spells_cmd_idx->{$comb->get_active}); 382 $ar->attr_set ($key, $spells_cmd_idx->{$comb->get_active}, $type, 'attr_edit');
408 }); 383 });
409 return $comb 384 return $comb
410 385
411 } elsif ($type eq 'bitmask') { 386 } elsif ($type eq 'bitmask') {
412 my $chval = $ar->get_or_default ($key); 387 my $chval = $ar->attr_or_arch ($key);
413 my $btn = Gtk2::Button->new; 388 my $btn = Gtk2::Button->new;
414 $btn->add (my $lblb = Gtk2::Label->new ("bitmask: " . ($chval * 1))); 389 $btn->add (my $lblb = Gtk2::Label->new ("bitmask: " . ($chval * 1)));
415 $self->{ttip}->set_tip ($btn, $al_arch->{$key}); 390 $self->{ttip}->set_tip ($btn, $al_arch->{$key});
416 391
417 my $menu = $self->create_bitmask_menu ($edspec->{value}, $lbl, $lblb, $ar, $key, \$chval); 392 my $menu = $self->create_bitmask_menu ($edspec->{value}, $lbl, $lblb, $ar, $key, \$chval);
424 }); 399 });
425 400
426 return $btn; 401 return $btn;
427 402
428 } elsif ($type eq 'list') { 403 } elsif ($type eq 'list') {
429 my $lblb = Gtk2::Label->new ($edspec->{value}->{$ar->get_or_default ($key) * 1}); 404 my $lblb = Gtk2::Label->new ($edspec->{value}->{$ar->attr_or_arch ($key) * 1});
430 my $btn = Gtk2::Button->new; 405 my $btn = Gtk2::Button->new;
431 $self->{ttip}->set_tip ($btn, $edspec->{value}->{$al_arch->{$key}}); 406 $self->{ttip}->set_tip ($btn, $edspec->{value}->{$al_arch->{$key}});
432 $btn->add ($lblb); 407 $btn->add ($lblb);
433 my $menu = $self->create_list_menu ($edspec->{value}, $lbl, $lblb, $ar, $key); 408 my $menu = $self->create_list_menu ($edspec->{value}, $lbl, $lblb, $ar, $key);
434 409
435 $self->label_set_color_default ($lbl, $ar, $key, $ar->get_or_default ($key)); 410 $self->label_set_color_default ($lbl, $ar, $key, $ar->attr_or_arch ($key));
436 411
437 $btn->signal_connect (button_press_event => sub { 412 $btn->signal_connect (button_press_event => sub {
438 my ($btn, $ev) = @_; 413 my ($btn, $ev) = @_;
439 $menu->popup (undef, undef, undef, undef, $ev->button, 0); 414 $menu->popup (undef, undef, undef, undef, $ev->button, 0);
440 }); 415 });
462 my $calc_lbl = sub { # update callback for the buttons 437 my $calc_lbl = sub { # update callback for the buttons
463 for (@lblbtns) { 438 for (@lblbtns) {
464 my $btn = $_->[0]; 439 my $btn = $_->[0];
465 my $lbl = $_->[1]; 440 my $lbl = $_->[1];
466 441
467 if (defined $ar->get ($key)) { 442 if (defined $ar->attr ($key)) {
468 my $res = $ar->get ($key) >= $lbl; 443 my $res = $ar->attr ($key) >= $lbl;
469 444
470 if (defined $res) { 445 if (defined $res) {
471 $self->label_set_color ($btn, 0); 446 $self->label_set_color ($btn, 0);
472 $lbl = ($res ? "+" : "-") . $lbl; 447 $lbl = ($res ? "+" : "-") . $lbl;
473 448
482 457
483 $btn->set_label ($lbl); 458 $btn->set_label ($lbl);
484 } 459 }
485 }; 460 };
486 461
487 $self->label_set_color_default ($lbl, $ar, $key, $ar->get_or_default ($key)); 462 $self->label_set_color_default ($lbl, $ar, $key, $ar->attr_or_arch ($key));
488 463
489 my $mid = (scalar @Deliantra::MOVE_TYPE) / 2; 464 my $mid = (scalar @Deliantra::MOVE_TYPE) / 2;
490 my $cnt = 0; 465 my $cnt = 0;
491 my $box = $btns1; 466 my $box = $btns1;
492 467
494 $box->pack_start (my $btn = Gtk2::Button->new ($calc_lbl->()), 0, 1, 0); 469 $box->pack_start (my $btn = Gtk2::Button->new ($calc_lbl->()), 0, 1, 0);
495 push @lblbtns, [$btn, $mty]; 470 push @lblbtns, [$btn, $mty];
496 471
497 $self->{ttip}->set_tip ($btn, $ar->archetype->{$key}); 472 $self->{ttip}->set_tip ($btn, $ar->archetype->{$key});
498 $btn->signal_connect (clicked => sub { 473 $btn->signal_connect (clicked => sub {
499 my $v = $ar->get ($key) || Deliantra::MoveType->new; 474 my $v = $ar->attr ($key) || Deliantra::MoveType->new;
500 475
501 $v x= $mty; 476 $v x= $mty;
502 $v = $v eq '' ? undef : $v; 477 $v = $v eq '' ? undef : $v;
503 $ar->set ($key, $v); 478 $ar->attr_set ($key, $v, $type, 'attr_edit');
504 479
505 $self->label_set_color_default ($lbl, $ar, $key, $v); 480 $self->label_set_color_default ($lbl, $ar, $key, $v);
506 $calc_lbl->(); 481 $calc_lbl->();
507 }); 482 });
508 483
540 my $menuitem = Gtk2::MenuItem->new_with_label ($lbltxt); 515 my $menuitem = Gtk2::MenuItem->new_with_label ($lbltxt);
541 $menuitem->signal_connect (activate => sub { 516 $menuitem->signal_connect (activate => sub {
542 my ($menuitem) = @_; 517 my ($menuitem) = @_;
543 $lbl->set_text ($list->{$item}); 518 $lbl->set_text ($list->{$item});
544 $self->label_set_color_default ($clbl, $ar, $key, $item); 519 $self->label_set_color_default ($clbl, $ar, $key, $item);
545 $ar->set ($key, $item); 520 $ar->attr_set ($key, $item, undef, 'attr_edit');
546 }); 521 });
547 $menu->append ($menuitem); 522 $menu->append ($menuitem);
548 $menuitem->show; 523 $menuitem->show;
549 } 524 }
550 525
562 if ($$rval & (1 << $bit)) { 537 if ($$rval & (1 << $bit)) {
563 $menuitem->set_active (1);#$arch->{$key} & (1 << $bit)); 538 $menuitem->set_active (1);#$arch->{$key} & (1 << $bit));
564 } 539 }
565 $menuitem->signal_connect (toggled => sub { 540 $menuitem->signal_connect (toggled => sub {
566 my ($menuitem) = @_; 541 my ($menuitem) = @_;
567 my $newval = $ar->get ($key); 542 my $newval = $ar->attr ($key);
568 $$rval &= ~(1 << $bit); 543 $$rval &= ~(1 << $bit);
569 $$rval |= (1 << $bit) if $menuitem->get_active; 544 $$rval |= (1 << $bit) if $menuitem->get_active;
570 $lbl->set_text ("bitmask: " . ($$rval * 1)); 545 $lbl->set_text ("bitmask: " . ($$rval * 1));
571 $self->label_set_color_default ($clbl, $ar, $key, $$rval); 546 $self->label_set_color_default ($clbl, $ar, $key, $$rval);
572 $ar->set ($key, $$rval); 547 $ar->attr_set ($key, $$rval, undef, 'attr_edit');
573 }); 548 });
574 $menu->append ($menuitem); 549 $menu->append ($menuitem);
575 $menuitem->show; 550 $menuitem->show;
576 } 551 }
577 552

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines