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

Comparing deliantra/gde/GCE/InventoryEditor.pm (file contents):
Revision 1.8 by elmex, Tue Apr 4 13:05:51 2006 UTC vs.
Revision 1.9 by elmex, Tue Apr 4 21:12:08 2006 UTC

15use Storable qw/dclone/; 15use Storable qw/dclone/;
16 16
17use Glib::Object::Subclass Gtk2::VBox; 17use Glib::Object::Subclass Gtk2::VBox;
18use GCE::Util; 18use GCE::Util;
19use GCE::DragHelper; 19use GCE::DragHelper;
20use GCE::ArchRef;
20 21
21use strict; 22use strict;
22 23
23sub INIT_INSTANCE { 24sub INIT_INSTANCE {
24 my ($self) = @_; 25 my ($self) = @_;
41 my ($self) = @_; 42 my ($self) = @_;
42 delete $self->{inv_hist}; 43 delete $self->{inv_hist};
43} 44}
44 45
45sub set_arch { 46sub set_arch {
46 my ($self, $arch, $cb) = @_; 47 my ($self, $ar) = @_;
48
49 if ((defined $self->{cur_arch}) && ($self->{cur_arch} != $ar)) {
50 $self->{cur_arch}->remove_on_change ('invedit')
51 if defined $self->{cur_arch};
52 $ar->add_on_change (invedit => sub { $self->set_arch ($_[0]) });
53
54 } elsif (not defined $self->{cur_arch}) {
55 $ar->add_on_change (invedit => sub { $self->set_arch ($_[0]) });
56 }
57
58 $self->{cur_arch} = $ar;
47 59
48 $self->{invarch}->remove ($_) for $self->{invarch}->get_children; 60 $self->{invarch}->remove ($_) for $self->{invarch}->get_children;
49 61
62 if (($self->{inv_hist} || [])->[-1] != $ar) {
50 unless (@{$self->{inv_hist} || []}) { 63# unless (@{$self->{inv_hist} || []}) {
51 push @{$self->{inv_hist}}, [$arch, $cb]; 64 push @{$self->{inv_hist}}, $ar;
52 } 65 }
53 66
54 for my $invar (@{$self->{inv_hist}}) { 67 for my $invar (@{$self->{inv_hist}}) {
55 my $pba = new_arch_pb; 68 my $pba = new_arch_pb;
56 fill_pb_from_arch ($pba, $invar->[0]); 69 fill_pb_from_arch ($pba, $invar->getarch);
57 my $hb = Gtk2::HBox->new; 70 my $hb = Gtk2::HBox->new;
58 $hb->pack_start ((new_from_pixbuf Gtk2::Image $pba), 0, 0, 0); 71 $hb->pack_start ((new_from_pixbuf Gtk2::Image $pba), 0, 0, 0);
59 $hb->pack_start (my $elemhdl = Gtk2::Button->new ($invar->[0]->{_name}), 0, 1, 0); 72 $hb->pack_start (my $elemhdl = Gtk2::Button->new ($invar->get ('_name')), 0, 1, 0);
60 $elemhdl->signal_connect (clicked => sub { 73 $elemhdl->signal_connect (clicked => sub {
61 while (pop @{$self->{inv_hist}} != $invar) { 1 } 74 while (pop @{$self->{inv_hist}} != $invar) { 1 }
62 push @{$self->{inv_hist}}, $invar; 75 push @{$self->{inv_hist}}, $invar;
63 $::MAINWIN->{attr_edit}->update ($invar->[0]); 76 $::MAINWIN->{attr_edit}->set_arch ($invar);
64 }); 77 });
65 GCE::DragHelper::set_drag_source ( 78 GCE::DragHelper::set_drag_source (
66 $elemhdl, arch => sub { { arch => $invar->[0] } } 79 $elemhdl, arch => sub { { arch => $invar } }
67 ); 80 );
68 81
69 GCE::DragHelper::set_drag_sink ( 82 GCE::DragHelper::set_drag_sink (
70 $elemhdl, arch => sub { 83 $elemhdl, arch => sub {
71 return unless $_[0]->{arch}; 84 return unless $_[0]->{arch};
72 push @{$invar->[0]->{inventory}}, dclone $_[0]->{arch}; 85 $invar->add_inv (dclone ($_[0]->{arch}->getarch));
73 $cb->() if $cb;
74 $self->set_arch ($invar, $cb) 86 $self->set_arch ($invar) #XXX: untested yet
75 } 87 }
76 ); 88 );
77 89
78 $self->{invarch}->add ($hb); 90 $self->{invarch}->add ($hb);
79 } 91 }
80 92
81 $self->{stackbox}->remove ($_) for $self->{stackbox}->get_children; 93 $self->{stackbox}->remove ($_) for $self->{stackbox}->get_children;
82 94
83 my $inv = $arch->{inventory}; 95 my $inv = $ar->get_inv_refs;
84 my $idx = 0; 96 my $idx = 0;
85 97
86 for my $ia (@$inv) { 98 for my $ia (@$inv) {
87 my $pb = new_arch_pb; 99 my $pb = new_arch_pb;
88 my $ownidx = $idx; 100 my $ownidx = $idx;
89 101
90 my $a = $Crossfire::ARCH{$ia->{_name}}; 102 my $a = $ia->archetype;
91 fill_pb_from_arch ($pb, $ia); 103 fill_pb_from_arch ($pb, $ia->getarch);
92 104
93 $self->{stackbox}->pack_start (my $hb = Gtk2::HBox->new, 0, 0, 0); 105 $self->{stackbox}->pack_start (my $hb = Gtk2::HBox->new, 0, 0, 0);
94 $hb->pack_start (my $delbtn = Gtk2::Button->new_with_label ('del'), 0, 0, 0); 106 $hb->pack_start (my $delbtn = Gtk2::Button->new_with_label ('del'), 0, 0, 0);
95 $delbtn->signal_connect (clicked => sub { 107 $delbtn->signal_connect (clicked => sub {
96 108
97 #my $oldstack = [ @$stack ]; 109 #my $oldstack = [ @$stack ];
98 splice @$inv, $ownidx, 1; 110 $ar->remove_inv ($ownidx); #splice @$inv, $ownidx, 1;
99
100 $cb->() if $cb;
101 $self->set_arch ($arch, $cb); 111 $self->set_arch ($ar);
102 }); 112 });
103 113
104 $hb->pack_start (my $elemhdl = new Gtk2::Button, 0, 0, 0); 114 $hb->pack_start (my $elemhdl = new Gtk2::Button, 0, 0, 0);
105 $elemhdl->add (my $hb2 = Gtk2::HBox->new); 115 $elemhdl->add (my $hb2 = Gtk2::HBox->new);
106 $elemhdl->signal_connect (clicked => sub { 116 $elemhdl->signal_connect (clicked => sub {
107 push @{$self->{inv_hist}}, [$ia, $cb]; 117 push @{$self->{inv_hist}}, $ia;
108 $::MAINWIN->{attr_edit}->update ($ia); 118 $::MAINWIN->{attr_edit}->set_arch ($ia);
109 }); 119 });
110 120
111 $hb2->pack_start (my $img = (new_from_pixbuf Gtk2::Image $pb), 0, 0, 0); 121 $hb2->pack_start (my $img = (new_from_pixbuf Gtk2::Image $pb), 0, 0, 0);
112 $img->set_alignment (0, 0.5); 122 $img->set_alignment (0, 0.5);
113 123
124 $elemhdl, arch => sub { 134 $elemhdl, arch => sub {
125 my ($darch) = @_; 135 my ($darch) = @_;
126 136
127 if (defined $darch->{inv_idx} && $darch->{inv} == $inv) { 137 if (defined $darch->{inv_idx} && $darch->{inv} == $inv) {
128 my $swapidx = $darch->{inv_idx}; 138 my $swapidx = $darch->{inv_idx};
129 ($inv->[$swapidx], $inv->[$ownidx]) 139 $ar->{arch}->swap_inv ($swapidx, $ownidx);
130 = ($inv->[$ownidx], $inv->[$swapidx]);
131 } else { 140 } else {
132 splice @$inv, $ownidx, 1, (dclone $darch->{arch}); 141 $darch->{arch}->replace_inv ($ownidx, dclone $darch->{arch});
133 } 142 }
134 143
135 $cb->() if $cb;
136 $self->set_arch ($arch, $cb); 144 $self->set_arch ($ar);
137 } 145 }
138 ); 146 );
139 $idx++; 147 $idx++;
140 } 148 }
141 $self->show_all; 149 $self->show_all;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines