… | |
… | |
15 | use Storable qw/dclone/; |
15 | use Storable qw/dclone/; |
16 | |
16 | |
17 | use Glib::Object::Subclass Gtk2::VBox; |
17 | use Glib::Object::Subclass Gtk2::VBox; |
18 | use GCE::Util; |
18 | use GCE::Util; |
19 | use GCE::DragHelper; |
19 | use GCE::DragHelper; |
|
|
20 | use GCE::ArchRef; |
20 | |
21 | |
21 | use strict; |
22 | use strict; |
22 | |
23 | |
23 | sub INIT_INSTANCE { |
24 | sub 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 | |
45 | sub set_arch { |
46 | sub 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; |