ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/MainWindow.pm
Revision: 1.18
Committed: Mon Feb 20 18:21:04 2006 UTC (18 years, 3 months ago) by elmex
Branch: MAIN
Changes since 1.17: +1 -0 lines
Log Message:
implemented layer insertion

File Contents

# Content
1 package GCE::MainWindow;
2
3 =head1 NAME
4
5 GCE::MainWindow - the main window class for gce
6
7 =cut
8
9 use Gtk2;
10 use Gtk2::Gdk::Keysyms;
11 use Gtk2::SimpleMenu;
12
13 use Crossfire;
14 use Crossfire::MapWidget;
15
16 use GCE::AttrEdit;
17 use GCE::MapEditor;
18 use GCE::StackView;
19 use GCE::EditAction;
20 use GCE::PickWindow;
21
22 use GCE::AttrTypemap;
23
24 use Glib::Object::Subclass
25 Gtk2::Window;
26
27 use strict;
28
29 our $MAINWIN;
30
31 # XXX: make a recursive call from save_layout to all (interesting) sub-widgets
32 sub save_layout {
33 my ($self) = @_;
34
35 $main::CFG->{attr_edit_on} = exists $self->{attr_edit} ? 1 : 0;
36 $main::CFG->{stack_view_on} = exists $self->{sv} ? 1 : 0;
37 $main::CFG->{picker_on} = exists $self->{last_pick_window} ? 1 : 0;
38 $main::CFG->{main_window} = main::get_pos_and_size ($self);
39 $main::CFG->{map_window} = main::get_pos_and_size ($self->{last_map_window}) if $self->{last_map_window};
40 $main::CFG->{stack_view} = main::get_pos_and_size ($self->{sv_win}) if $self->{sv_win};
41 $main::CFG->{attr_view} = main::get_pos_and_size ($self->{attr_edit_win}) if $self->{attr_edit_win};
42
43 $main::CFG->{open_pickers} = [];
44
45 for (@{$self->{open_pick_windows}}) {
46
47 next unless defined $_;
48
49 push @{$main::CFG->{open_pickers}}, {
50 p_and_s => main::get_pos_and_size ($_),
51 selection => $_->{last_selection}
52 };
53 }
54
55 main::write_cfg ($main::VARDIR . '/config');
56 }
57
58 sub load_layout {
59 my ($self) = @_;
60
61 $main::CFG->{attr_edit_on}
62 and $self->show_attr_editor;
63
64 $main::CFG->{stack_view_on}
65 and $self->show_stack_view;
66
67 for (@{$main::CFG->{open_pickers}}) {
68 $self->open_pick_window ($_);
69 }
70 }
71
72 sub open_map_editor {
73 my ($self, $mapfile) = @_;
74
75 # XXX: last_map_window is a dirty trick to get the position and size
76 # for save layout
77
78 my $w = $self->{last_map_window} = GCE::MapEditor->new;
79 $self->{mapedit} = $w->{mapedit};
80 $w->open_map ($mapfile);
81
82 main::set_pos_and_size ($w, $main::CFG->{map_window});
83
84 $w->show_all;
85 # my $w = $self->{last_map_window} = Gtk2::Window->new ('toplevel');
86 # $w->set_title ('gce - map editor');
87 # $w->add (my $mapedit = $self->{mapedit} = new GCE::MapEditor);
88 # $mapedit->open_map ($mapfile);
89 #
90 #
91 # $w->show_all;
92 }
93
94 sub show_stack_view {
95 my ($self) = @_;
96
97 return if defined $self->{sv};
98
99 my $w = $self->{sv_win} = Gtk2::Window->new ('toplevel');
100 $w->set_title ('gce - stack view');
101 $w->signal_connect ('delete-event' => sub { delete $self->{sv}; 0 });
102 $w->add ($self->{sv} = GCE::StackView->new);
103
104 main::set_pos_and_size ($w, $main::CFG->{stack_view});
105
106 $w->show_all;
107 }
108
109 sub show_attr_editor {
110 my ($self) = @_;
111
112 return if $self->{attr_edit};
113
114 my $w = $self->{attr_edit_win} = Gtk2::Window->new;
115 $w->set_title ("gce - edit attrs");
116 $w->add ($self->{attr_edit} = GCE::AttrEdit->new);
117 $w->signal_connect ('delete-event' => sub { delete $self->{attr_edit}; 0 });
118
119 main::set_pos_and_size ($w, $main::CFG->{attr_view});
120
121 $w->show_all;
122 }
123
124 sub update_attr_editor {
125 my ($self, $arch, $cb) = @_;
126
127 return unless $self->{attr_edit};
128
129 $self->{attr_edit}->set_arch ($arch, $cb);
130 $self->{attr_edit_win}->set_title ("gce - edit $arch->{_name}");
131 }
132
133 sub update_stack_view {
134 my ($self, $mapedit, $x, $y) = @_;
135
136 return unless $self->{sv};
137
138 $self->{sv}->set_stack ($mapedit, $x, $y);
139 }
140
141 sub open_pick_window {
142 my ($self, $layout) = @_;
143
144 # XXX: Yes, also fix this, save _every_ pick window and their posistions and their
145 # selection
146 my $p = GCE::PickWindow->new ();
147
148 push @{$self->{open_pick_windows}}, $p;
149
150 my $idx = (@{$self->{open_pick_windows}}) - 1;
151
152 $p->signal_connect ('delete-event' => sub {
153 $self->{open_pick_windows}->[$idx] = undef;
154 });
155
156 if ($layout) {
157 main::set_pos_and_size ($p, $layout->{p_and_s});
158 }
159
160 $p->show_all;
161
162 $p->set_selection ($layout->{selection});
163 }
164
165 sub build_menu {
166 my ($self) = @_;
167
168 my $menu_tree = [
169 _File => {
170 item_type => '<Branch>',
171 children => [
172 _New => {
173 callback => sub { $self->new_cb },
174 accelerator => '<ctrl>N'
175 },
176 _Open => {
177 callback => sub { $self->open_cb },
178 accelerator => '<ctrl>O'
179 },
180 "_Save Layout" => {
181 callback => sub { $self->save_layout },
182 accelerator => '<ctrl>L'
183 },
184 _Quit => {
185 callback => sub { Gtk2->main_quit },
186 accelerator => '<ctrl>Q'
187 }
188 ]
189 },
190 _Edit => {
191 item_type => '<Branch>',
192 children => [
193 "_Attr Editor" => {
194 callback => sub { $self->show_attr_editor },
195 accelerator => "<ctrl>A"
196 },
197 "_Picker" => {
198 callback => sub { $self->open_pick_window },
199 accelerator => "<ctrl>P"
200 },
201 "_Stack View" => {
202 callback => sub { $self->show_stack_view },
203 accelerator => "<ctrl>V"
204 },
205
206 ]
207 },
208 _View => {
209 item_type => '<Branch>',
210 children => [
211 "Open _Attr Editor" => {
212 callback => sub { $self->show_attr_editor },
213 accelerator => "<ctrl>A"
214 },
215 "Open _Picker" => {
216 callback => sub { $self->open_pick_window },
217 accelerator => "<ctrl>P"
218 },
219 "Open _Stack View" => {
220 callback => sub { $self->show_stack_view },
221 accelerator => "<ctrl>V"
222 },
223
224 ]
225 }
226
227 ];
228
229 my $men =
230 Gtk2::SimpleMenu->new (
231 menu_tree => $menu_tree,
232 default_callback => \&default_cb,
233 );
234
235 $self->add_accel_group ($men->{accel_group});
236
237 return $men->{widget};
238 }
239
240 sub add_button {
241 my ($self, $table, $plcinfo, $lbl, $cb) = @_;
242
243 my ($lx, $ly) = @{$plcinfo->{next}};
244
245 unless ($lx < $plcinfo->{width}) {
246
247 $ly++;
248 $lx = 0;
249 }
250
251 $ly < $plcinfo->{height}
252 or die "too many buttons, make table bigger!";
253
254 $table->attach_defaults (my $btn = Gtk2::Button->new_with_label ($lbl), $lx, $lx + 1, $ly, $ly + 1);
255 $btn->signal_connect (clicked => $cb);
256
257 $plcinfo->{next} = [$lx + 1, $ly];
258 }
259
260 sub build_buttons {
261 my ($self) = @_;
262
263 my $tbl = Gtk2::Table->new (2, 2);
264 my $plcinfo = { width => 1, height => 3, next => [0, 0] };
265
266 $self->{edit_collection}{pick} = GCE::EditAction::Pick->new;
267 $self->{edit_collection}{place} = GCE::EditAction::Place->new;
268 $self->{edit_collection}{erase} = GCE::EditAction::Erase->new;
269
270 $self->add_button ($tbl, $plcinfo, "Pick", sub {
271 $self->{sel_editaction} = $self->{edit_collection}{pick};
272 $self->{edit_tool}->set_text ("Pick");
273 });
274 $self->add_button ($tbl, $plcinfo, "Place", sub {
275 $self->{sel_editaction} = $self->{edit_collection}{place};
276 $self->{edit_tool}->set_text ("Place");
277 });
278 $self->add_button ($tbl, $plcinfo, "Erase", sub {
279 $self->{sel_editaction} = $self->{edit_collection}{erase};
280 $self->{edit_tool}->set_text ("Erase");
281 });
282
283 return $tbl;
284 }
285
286
287 sub INIT_INSTANCE {
288 my ($self) = @_;
289
290 $MAINWIN = $self;
291
292 $self->set_title ("gce - main window");
293
294 $self->add (my $vb = Gtk2::VBox->new);
295 $vb->pack_start ($self->build_menu, 0, 1, 0);
296 $vb->pack_start (my $tbl = $self->build_buttons, 1, 1, 0);
297 $vb->pack_start ($self->{edit_tool} = Gtk2::Label->new, 0, 1, 0);
298 $vb->pack_start ($self->{pick_view} = Gtk2::Label->new, 0, 1, 0);
299
300 # XXX:load $ARGV _cleanly_?
301 $self->open_map_editor ($ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3");
302
303 $self->signal_connect ('delete-event' => sub {
304 Gtk2->main_quit;
305 });
306
307 main::set_pos_and_size ($self, $main::CFG->{main_window});
308 }
309
310 sub new_cb {
311 my ($self) = @_;
312 die "NOT IMPLEMENTED YET";
313 }
314
315 sub open_cb {
316 my ($self) = @_;
317
318 my $fc =
319 Gtk2::FileChooserDialog->new (
320 'gce - open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
321 );
322
323 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
324 $fc->add_shortcut_folder ($_) for keys %{$self->{fc_last_folders}};
325 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
326
327 if ('ok' eq $fc->run) {
328
329 $self->{fc_last_folder} = $fc->get_current_folder;
330 $self->{fc_last_folders}->{$self->{fc_last_folder}}++;
331
332 $self->open_map_editor ($fc->get_filename);
333 }
334
335 $fc->destroy;
336 }
337
338 sub set_pick {
339 my ($self, $arch) = @_;
340
341 $self->{pick_arch} = $arch;
342 $self->{pick_view}->set_text ($arch->{_name});
343 }
344
345 sub get_pick {
346 my ($self) = @_;
347
348 # XXX: This is just to make sure that this function always returns something
349 return $self->{pick_arch} || { _name => 'platinacoin' };
350 }
351
352 =head1 AUTHOR
353
354 Marc Lehmann <schmorp@schmorp.de>
355 http://home.schmorp.de/
356
357 Robin Redeker <elmex@ta-sa.org>
358 http://www.ta-sa.org/
359
360 =cut
361 1;
362