… | |
… | |
8 | |
8 | |
9 | use Gtk2; |
9 | use Gtk2; |
10 | use Gtk2::Gdk::Keysyms; |
10 | use Gtk2::Gdk::Keysyms; |
11 | use Gtk2::SimpleList; |
11 | use Gtk2::SimpleList; |
12 | |
12 | |
|
|
13 | use GCE::Util; |
13 | use GCE::InventoryEditor; |
14 | use GCE::InventoryEditor; |
14 | |
15 | |
15 | use Glib::Object::Subclass Gtk2::VBox; |
16 | use Glib::Object::Subclass Gtk2::VBox; |
16 | |
17 | |
17 | use Crossfire; |
18 | use Crossfire; |
… | |
… | |
32 | if (ref $value) { |
33 | if (ref $value) { |
33 | $arch->{$key} = $value; |
34 | $arch->{$key} = $value; |
34 | |
35 | |
35 | } else { |
36 | } else { |
36 | if (not defined $al_arch->{$key}) { |
37 | if (not defined $al_arch->{$key}) { |
37 | if (not $value) { |
38 | if (not defined $value) { |
38 | # try to normalize |
39 | # try to normalize |
39 | delete $arch->{$key}; |
40 | delete $arch->{$key}; |
40 | } else { |
41 | } else { |
41 | # try to normalize |
42 | # try to normalize |
42 | $arch->{$key} = $value; |
43 | $arch->{$key} = $value; |
… | |
… | |
137 | for my $sec (@$section) { |
138 | for my $sec (@$section) { |
138 | my $bwid = Gtk2::EventBox->new; |
139 | my $bwid = Gtk2::EventBox->new; |
139 | my $al = Gtk2::Alignment->new (0.0, 0.5, 0, 1); |
140 | my $al = Gtk2::Alignment->new (0.0, 0.5, 0, 1); |
140 | my $key = $sec->[0]; |
141 | my $key = $sec->[0]; |
141 | $sec = $sec->[1]; |
142 | $sec = $sec->[1]; |
142 | $al->add (Gtk2::Label->new ($sec->{name} || $key)); |
143 | $al->add (Gtk2::Label->new (def ($sec->{name}, $key))); |
143 | $bwid->add ($al); |
144 | $bwid->add ($al); |
144 | if ($sec->{desc} !~ m/^\s*$/s) { |
145 | if ($sec->{desc} !~ m/^\s*$/s) { |
145 | $self->{ttip}->set_tip ($bwid, $sec->{desc}); |
146 | $self->{ttip}->set_tip ($bwid, $sec->{desc}); |
146 | } |
147 | } |
147 | $table->attach ($bwid, 0, 1, $i, $i + 1, ['shrink','fill'], 'fill', 5, 0); |
148 | $table->attach ($bwid, 0, 1, $i, $i + 1, ['shrink','fill'], 'fill', 5, 0); |
… | |
… | |
159 | |
160 | |
160 | # my $fgcolor = $lbl->get_default_style-> Gtk2::Gdk::Color->parse ("lightblue"); |
161 | # my $fgcolor = $lbl->get_default_style-> Gtk2::Gdk::Color->parse ("lightblue"); |
161 | # my $fgcolor2 = Gtk2::Gdk::Color->parse ("black");#grey"); |
162 | # my $fgcolor2 = Gtk2::Gdk::Color->parse ("black");#grey"); |
162 | |
163 | |
163 | if ( (defined $al_arch->{$key} and $al_arch->{$key} ne $val) |
164 | if ( (defined $al_arch->{$key} and $al_arch->{$key} ne $val) |
164 | or (not (defined $al_arch->{$key}) and $val)) |
165 | or (not (defined $al_arch->{$key}) and defined $val)) |
165 | { |
166 | { |
166 | for (qw/normal active prelight selected insensitive/) { |
167 | for (qw/normal active prelight selected insensitive/) { |
167 | $lbl->modify_bg ($_, $lbl->get_default_style->bg ('active')); |
168 | $lbl->modify_bg ($_, $lbl->get_default_style->bg ('active')); |
168 | $lbl->modify_fg ($_, $lbl->get_default_style->fg ('active')); |
169 | $lbl->modify_fg ($_, $lbl->get_default_style->fg ('active')); |
169 | } |
170 | } |
… | |
… | |
180 | |
181 | |
181 | my $type = $edspec->{type}; |
182 | my $type = $edspec->{type}; |
182 | my $al_arch = $Crossfire::ARCH{$arch->{_name}}; |
183 | my $al_arch = $Crossfire::ARCH{$arch->{_name}}; |
183 | |
184 | |
184 | if ($type eq 'bool') { |
185 | if ($type eq 'bool') { |
185 | my $boolval = $edspec->{value} || [0, 1]; |
186 | my $boolval = def ($edspec->{value}, [0, 1]); |
186 | |
187 | |
187 | my $chk = new Gtk2::CheckButton ($edspec->{name} || $key); |
188 | my $chk = new Gtk2::CheckButton (def ($edspec->{name}, $key)); |
188 | |
189 | |
189 | $self->{ttip}->set_tip ($chk, $al_arch->{$key} * 1); |
190 | $self->{ttip}->set_tip ($chk, $al_arch->{$key} * 1); |
190 | |
191 | |
191 | $chk->set_active (($arch->{$key} || $al_arch->{$key}) == $boolval->[1]); |
192 | $chk->set_active (def ($arch->{$key}, $al_arch->{$key}) == $boolval->[1]); |
192 | $self->label_set_color_default ($lbl, $arch, $key, $arch->{$key} || $al_arch->{$key}); |
193 | $self->label_set_color_default ($lbl, $arch, $key, def ($arch->{$key}, $al_arch->{$key})); |
193 | $chk->signal_connect (clicked => sub { |
194 | $chk->signal_connect (clicked => sub { |
194 | my ($chk) = @_; |
195 | my ($chk) = @_; |
195 | $self->label_set_color_default ($lbl, $arch, $key, $boolval->[$chk->get_active * 1]); |
196 | $self->label_set_color_default ($lbl, $arch, $key, $boolval->[$chk->get_active * 1]); |
196 | $self->update_arch ($arch, $key, $boolval->[$chk->get_active * 1]); |
197 | $self->update_arch ($arch, $key, $boolval->[$chk->get_active * 1]); |
197 | }); |
198 | }); |
198 | return $chk |
199 | return $chk |
199 | |
200 | |
200 | } elsif (grep { $type eq $_ } qw/string int treasurelist float/) { |
201 | } elsif (grep { $type eq $_ } qw/string int treasurelist float/) { |
201 | my $entry = new Gtk2::Entry; |
202 | my $entry = new Gtk2::Entry; |
202 | $self->{ttip}->set_tip ($entry, $al_arch->{$key}); |
203 | $self->{ttip}->set_tip ($entry, $al_arch->{$key}); |
203 | $entry->set_text ($arch->{$key} || $al_arch->{$key}); |
204 | $entry->set_text (def ($arch->{$key}, $al_arch->{$key})); |
204 | $self->label_set_color_default ($lbl, $arch, $key, $arch->{$key} || $al_arch->{$key}); |
205 | $self->label_set_color_default ($lbl, $arch, $key, def ($arch->{$key}, $al_arch->{$key})); |
205 | $entry->signal_connect (changed => sub { |
206 | $entry->signal_connect (changed => sub { |
206 | my ($entry) = @_; |
207 | my ($entry) = @_; |
207 | $self->label_set_color_default ($lbl, $arch, $key, $entry->get_text); |
208 | $self->label_set_color_default ($lbl, $arch, $key, $entry->get_text); |
208 | $self->update_arch ($arch, $key, $entry->get_text); |
209 | $self->update_arch ($arch, $key, $entry->get_text); |
209 | }); |
210 | }); |
… | |
… | |
223 | $spells_idx{$_} = $idx++; |
224 | $spells_idx{$_} = $idx++; |
224 | |
225 | |
225 | $comb->append_text ($sp->{$_}); |
226 | $comb->append_text ($sp->{$_}); |
226 | } |
227 | } |
227 | #XXX: FIXME: $self->{ttip}->set_tip ($comb, $sp->{$al_arch->{$key}}); |
228 | #XXX: FIXME: $self->{ttip}->set_tip ($comb, $sp->{$al_arch->{$key}}); |
228 | $comb->set_active ($spells_idx{$arch->{$key} || $al_arch->{$key}}); |
229 | $comb->set_active ($spells_idx{def ($arch->{$key}, $al_arch->{$key})}); |
229 | $self->label_set_color_default ($lbl, $arch, $key, $arch->{$key} || $al_arch->{$key}); |
230 | $self->label_set_color_default ($lbl, $arch, $key, def ($arch->{$key}, $al_arch->{$key})); |
230 | |
231 | |
231 | $comb->signal_connect (changed => sub { |
232 | $comb->signal_connect (changed => sub { |
232 | my ($comb) = @_; |
233 | my ($comb) = @_; |
233 | $self->label_set_color_default ($lbl, $arch, $key, $spells_cmd_idx{$comb->get_active}); |
234 | $self->label_set_color_default ($lbl, $arch, $key, $spells_cmd_idx{$comb->get_active}); |
234 | $self->update_arch ($arch, $key, $spells_cmd_idx{$comb->get_active}); |
235 | $self->update_arch ($arch, $key, $spells_cmd_idx{$comb->get_active}); |
235 | }); |
236 | }); |
236 | return $comb |
237 | return $comb |
237 | |
238 | |
238 | } elsif ($type eq 'bitmask') { |
239 | } elsif ($type eq 'bitmask') { |
239 | my $lblb = Gtk2::Label->new ("bitmask: " . ($arch->{$key} || $al_arch->{$key}) * 1); |
240 | my $lblb = Gtk2::Label->new ("bitmask: " . (def ($arch->{$key}, $al_arch->{$key})) * 1); |
240 | my $btn = Gtk2::Button->new; |
241 | my $btn = Gtk2::Button->new; |
241 | $self->{ttip}->set_tip ($btn, $al_arch->{$key}); |
242 | $self->{ttip}->set_tip ($btn, $al_arch->{$key}); |
242 | $btn->add ($lblb); |
243 | $btn->add ($lblb); |
243 | my $chval = $arch->{$key} || $al_arch->{$key}; |
244 | my $chval = def ($arch->{$key}, $al_arch->{$key}); |
244 | my $menu = $self->create_bitmask_menu ($edspec->{value}, $lbl, $lblb, $arch, $key, \$chval); |
245 | my $menu = $self->create_bitmask_menu ($edspec->{value}, $lbl, $lblb, $arch, $key, \$chval); |
245 | |
246 | |
246 | $self->label_set_color_default ($lbl, $arch, $key, $arch->{$key} || $al_arch->{$key}); |
247 | $self->label_set_color_default ($lbl, $arch, $key, def ($arch->{$key}, $al_arch->{$key})); |
247 | |
248 | |
248 | $btn->signal_connect (button_press_event => sub { |
249 | $btn->signal_connect (button_press_event => sub { |
249 | my ($btn, $ev) = @_; |
250 | my ($btn, $ev) = @_; |
250 | $menu->popup (undef, undef, undef, undef, $ev->button, 0); |
251 | $menu->popup (undef, undef, undef, undef, $ev->button, 0); |
251 | }); |
252 | }); |
252 | return $btn; |
253 | return $btn; |
253 | |
254 | |
254 | } elsif ($type eq 'list') { |
255 | } elsif ($type eq 'list') { |
255 | my $lblb = Gtk2::Label->new ($edspec->{value}->{($arch->{$key} || $al_arch->{$key}) * 1}); |
256 | my $lblb = Gtk2::Label->new ($edspec->{value}->{def($arch->{$key}, $al_arch->{$key}) * 1}); |
256 | my $btn = Gtk2::Button->new; |
257 | my $btn = Gtk2::Button->new; |
257 | $self->{ttip}->set_tip ($btn, $edspec->{value}->{$al_arch->{$key}}); |
258 | $self->{ttip}->set_tip ($btn, $edspec->{value}->{$al_arch->{$key}}); |
258 | $btn->add ($lblb); |
259 | $btn->add ($lblb); |
259 | my $menu = $self->create_list_menu ($edspec->{value}, $lbl, $lblb, $arch, $key); |
260 | my $menu = $self->create_list_menu ($edspec->{value}, $lbl, $lblb, $arch, $key); |
260 | |
261 | |
261 | $self->label_set_color_default ($lbl, $arch, $key, $arch->{$key} || $al_arch->{$key}); |
262 | $self->label_set_color_default ($lbl, $arch, $key, def ($arch->{$key}, $al_arch->{$key})); |
262 | |
263 | |
263 | $btn->signal_connect (button_press_event => sub { |
264 | $btn->signal_connect (button_press_event => sub { |
264 | my ($btn, $ev) = @_; |
265 | my ($btn, $ev) = @_; |
265 | $menu->popup (undef, undef, undef, undef, $ev->button, 0); |
266 | $menu->popup (undef, undef, undef, undef, $ev->button, 0); |
266 | }); |
267 | }); |