ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/AttrEdit.pm
Revision: 1.10
Committed: Sun Mar 12 14:39:19 2006 UTC (18 years, 2 months ago) by elmex
Branch: MAIN
Changes since 1.9: +2 -1 lines
Log Message:
implemented map propertie editing and map resizing

File Contents

# Content
1 package GCE::AttrEdit;
2
3 =head1 NAME
4
5 GCE::AttrEdit - an edit wiget for attributes
6
7 =cut
8
9 use Gtk2;
10 use Gtk2::Gdk::Keysyms;
11 use Gtk2::SimpleList;
12
13 use Glib::Object::Subclass Gtk2::ScrolledWindow;
14
15 use Crossfire;
16
17 sub INIT_INSTANCE {
18 my ($self) = @_;
19
20 $self->add_with_viewport (my $vb = new Gtk2::VBox);
21 $self->set_policy ('automatic', 'automatic');
22
23 $vb->pack_start (my $lbl = $self->{arch_name_lbl} = Gtk2::Label->new, 0, 1, 0);
24 $vb->pack_start (my $ntbook = $self->{ntbook} = Gtk2::Notebook->new, 1, 1, 0);
25 }
26
27 sub update_arch {
28 my ($self, $arch, $key, $value) = @_;
29
30 if ($value ne '') {
31
32 my $al_arch = $Crossfire::ARCH{$arch->{_name}};
33 print "**********************> SET $key = $value\n";
34 if (ref $value) {
35 $arch->{$key} = $value;
36
37 } else {
38 if (not defined $al_arch->{$key}) {
39 if (not $value) {
40 # try to normalize
41 print ">>>>>>>>>>>>>>>>>>>>>> DEL $key\n";
42 delete $arch->{$key};
43 } else {
44 # try to normalize
45 print ">>>>>>>>>>>>>>>>>>>>>> SET $key = $value\n";
46 $arch->{$key} = $value;
47 }
48 } else {
49 if ($al_arch->{$key} ne $value) {
50 print ">>>>>>>>>>>>>>>>>>>>>>> SET $key = $value\n";
51 $arch->{$key} = $value;
52 } else {
53 # try to normalize
54 print ">>>>>>>>>>>>>>>>>>>>>> DEL $key\n";
55 delete $arch->{$key};
56 }
57 }
58 }
59
60 } else {
61
62 delete $arch->{$key};
63 }
64
65 $self->{change_cb}->($arch)
66 if defined $self->{change_cb};
67 }
68
69 sub set_attr {
70 my ($self, $key, $value) = @_;
71
72 my $attr = $self->{arch}->{$key};
73
74 unless (ref $attr) {
75
76 $self->update_arch ($self->{arch}, $key, $value);
77 }
78 }
79
80 sub set_arch {
81 my ($self, $arch, $change_cb) = @_;
82
83 $self->{change_cb} = $change_cb;
84
85 $self->{arch} = $arch;
86
87 $self->{arch_name_lbl}->set_text (
88 $arch->{_name} . ($arch->{name} ? " - $arch->{name}" : "")
89 );
90
91 if (not defined $change_cb) {
92
93 } else {
94
95 }
96
97 my $al_arch = $Crossfire::ARCH{$arch->{_name}};
98
99 if ($al_arch) {
100 $self->hide;
101 $self->{ntbook}->remove ($_)
102 for $self->{ntbook}->get_children;
103
104 my $ar = Crossfire::arch_attr $al_arch;
105 # warn "FO1:" . Data::Dumper::Dumper ($al_arch) . ">\n";
106 # warn "FO2:" . Data::Dumper::Dumper ($ar) . ">\n";
107 # warn "REAL: " . Data::Dumper::Dumper ($arch) . "\n";
108
109 $self->{ttip} = Gtk2::Tooltips->new;
110
111 $self->add_section_edit_widgets ($self->{ntbook}, 'general', $arch, $ar->{attr});
112
113 my %sects = map { @$_ } @{$ar->{section}};
114
115
116 for my $sec (keys %sects) {
117 my $cnt = scalar keys %{$sects{$sec}};
118 $self->add_section_edit_widgets ($self->{ntbook}, $sec, $arch, $sects{$sec});
119 }
120
121 for my $key (qw/lore msg/) {
122 $self->{ntbook}->append_page (my $v = Gtk2::VBox->new, $key);
123 $v->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0);
124 $sw->set_policy ('automatic', 'automatic');
125 $sw->add (my $tb = $self->{"${key}_txt"} = Gtk2::TextView->new);
126 my $buf = $tb->get_buffer->set_text ($arch->{$key});
127
128 $v->pack_start (my $b = Gtk2::Button->new_with_label ("save"), 0, 1, 0);
129 $b->signal_connect (clicked => sub {
130 my $buf = $tb->get_buffer;
131 $self->update_arch ($arch, $key,
132 $buf->get_text ($buf->get_start_iter, $buf->get_end_iter, 0)
133 );
134 });
135 }
136
137 $self->{ttip}->enable;
138
139 $self->show_all;
140
141 } else {
142 print "NOARCH FOR: $arch->{_name}\n";
143 }
144 }
145
146 sub add_section_edit_widgets {
147 my ($self, $ntbook, $name, $arch, $section) = @_;
148
149
150 $self->{ntbook}->append_page (my $vb = Gtk2::VBox->new, $name);
151 $vb->pack_start (my $table = new Gtk2::Table (2, $cnt), 0, 1, 0);
152
153 my $i = 0;
154 for my $key (keys %{$section}) {
155 my $bwid;
156 if ($section->{$key}->{desc} =~ m/^\s*$/s) {
157 $bwid = Gtk2::Label->new ($section->{$key}->{name} || $key);
158 } else {
159 $bwid = Gtk2::Button->new_with_label ($section->{$key}->{name} || $key);
160 $self->{ttip}->set_tip ($bwid, $section->{$key}->{desc});
161 $bwid->signal_connect (clicked => sub { $self->description_popup ($section->{$key}->{desc}) });
162 }
163 $table->attach_defaults ($bwid, 0, 1, $i, $i + 1);
164 $table->attach_defaults (
165 $self->get_edit_widget ($key, $section->{$key}, $arch),
166 1, 2, $i, $i + 1
167 );
168 $i++;
169 }
170 }
171
172 sub description_popup {
173 my ($self, $desc) = @_;
174
175 my $w = Gtk2::Window->new ('toplevel');
176 $w->set_default_size (300, 200);
177 $w->add (my $v = Gtk2::VBox->new);
178 $v->pack_start (my $sw = Gtk2::ScrolledWindow->new, 1, 1, 0);
179 $sw->set_policy ('automatic', 'automatic');
180 $sw->add (my $txtv = Gtk2::TextView->new);
181 $txtv->set_wrap_mode ('word');
182 $txtv->get_buffer->set_text ($desc);
183 $v->pack_start (my $b = Gtk2::Button->new_with_label ("close"), 0, 1, 0);
184 $b->signal_connect (clicked => sub {
185 $w->destroy;
186 $w = undef;
187 });
188 $w->show_all;
189 }
190
191 sub get_edit_widget {
192 my ($self, $key, $edspec, $arch) = @_;
193
194 my $type = $edspec->{type};
195 my $al_arch = $Crossfire::ARCH{$arch->{_name}};
196
197 if ($type eq 'bool') {
198 my $chk = new Gtk2::CheckButton ($edspec->{name} || $key);
199 $chk->set_active ($arch->{$key} || $al_arch->{$key});
200 $chk->signal_connect (clicked => sub {
201 my ($chk) = @_;
202 $self->update_arch ($arch, $key, $chk->get_active * 1);
203 print "SET $attr :" . $chk->get_active . "\n";
204 });
205 return $chk
206
207 } elsif (grep { $type eq $_ } qw/string int treasurelist float/) {
208 my $entry = new Gtk2::Entry;
209 $entry->set_text ($arch->{$key} || $al_arch->{$key});
210 $entry->signal_connect (changed => sub {
211 my ($entry) = @_;
212 $self->update_arch ($arch, $key, $entry->get_text);
213 });
214 return $entry
215
216 # } elsif ($type eq 'bitmask') {
217 } elsif ($type eq 'spell' or $type eq 'nz_spell') { # XXX: nz_spell bug in datafiles?
218 my $comb = Gtk2::ComboBox->new_text;
219 my $spells_idx = {};
220 my $spells_cmb_idx = {};
221 my $sp = \%Crossfire::Data::SPELL;
222
223 $comb->append_text ("<none>");
224
225 my $idx = 1; # XXX: replace this idx with a more save/correct method?
226 for (sort { $sp->{$a} cmp $sp->{$b} } keys %$sp) {
227 $spells_cmd_idx{$idx} = $_;
228 $spells_idx{$_} = $idx++;
229
230 $comb->append_text ($sp->{$_});
231 }
232 $comb->set_active ($spells_idx{$arch->{$key} || $al_arch->{$key}});
233
234 $comb->signal_connect (changed => sub {
235 my ($comb) = @_;
236 $self->update_arch ($arch, $key, $spells_cmd_idx{$comb->get_active});
237 });
238 return $comb
239
240 } elsif ($type eq 'fixed') {
241 return Gtk2::Label->new ("$edspec->{name} = $edspec->{value}");
242
243 } elsif ($type eq 'text') {
244 my $b = $arch->{$key};
245 $b =~ s/\n\r?//gs;
246 if (length $b > 20) {
247 $b = (substr $b, 0, 20) . "...";
248 }
249 return Gtk2::Label->new ($b);
250
251
252 } else {
253 return Gtk2::Label->new ("$key => $edspec->{name} ($type)");
254
255 }
256 }
257
258
259 =head1 AUTHOR
260
261 Marc Lehmann <schmorp@schmorp.de>
262 http://home.schmorp.de/
263
264 Robin Redeker <elmex@ta-sa.org>
265 http://www.ta-sa.org/
266
267 =cut
268 1;