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

# User Rev Content
1 elmex 1.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 elmex 1.2 use Gtk2::SimpleMenu;
12 root 1.7
13     use Crossfire;
14     use Crossfire::MapWidget;
15    
16 elmex 1.2 use GCE::AttrEdit;
17 elmex 1.13 use GCE::MapEditor;
18 elmex 1.15 use GCE::StackView;
19 elmex 1.17 use GCE::EditAction;
20     use GCE::PickWindow;
21 elmex 1.2
22 elmex 1.14 use GCE::AttrTypemap;
23    
24 elmex 1.2 use Glib::Object::Subclass
25 elmex 1.13 Gtk2::Window;
26 elmex 1.2
27     use strict;
28    
29 elmex 1.15 our $MAINWIN;
30    
31 elmex 1.18 # XXX: make a recursive call from save_layout to all (interesting) sub-widgets
32 elmex 1.17 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 elmex 1.15 my ($self) = @_;
96    
97     return if defined $self->{sv};
98    
99 elmex 1.17 my $w = $self->{sv_win} = Gtk2::Window->new ('toplevel');
100 elmex 1.15 $w->set_title ('gce - stack view');
101 elmex 1.17 $w->signal_connect ('delete-event' => sub { delete $self->{sv}; 0 });
102 elmex 1.15 $w->add ($self->{sv} = GCE::StackView->new);
103 elmex 1.17
104     main::set_pos_and_size ($w, $main::CFG->{stack_view});
105    
106 elmex 1.15 $w->show_all;
107     }
108    
109     sub show_attr_editor {
110     my ($self) = @_;
111    
112 elmex 1.17 return if $self->{attr_edit};
113    
114 elmex 1.15 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 elmex 1.17
119     main::set_pos_and_size ($w, $main::CFG->{attr_view});
120    
121 elmex 1.15 $w->show_all;
122     }
123    
124     sub update_attr_editor {
125 elmex 1.17 my ($self, $arch, $cb) = @_;
126 elmex 1.15
127     return unless $self->{attr_edit};
128    
129 elmex 1.17 $self->{attr_edit}->set_arch ($arch, $cb);
130 elmex 1.15 $self->{attr_edit_win}->set_title ("gce - edit $arch->{_name}");
131     }
132    
133     sub update_stack_view {
134 elmex 1.17 my ($self, $mapedit, $x, $y) = @_;
135 elmex 1.15
136     return unless $self->{sv};
137    
138 elmex 1.17 $self->{sv}->set_stack ($mapedit, $x, $y);
139 elmex 1.15 }
140    
141 elmex 1.17 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 elmex 1.15
148 elmex 1.17 push @{$self->{open_pick_windows}}, $p;
149    
150     my $idx = (@{$self->{open_pick_windows}}) - 1;
151 elmex 1.15
152 elmex 1.17 $p->signal_connect ('delete-event' => sub {
153     $self->{open_pick_windows}->[$idx] = undef;
154     });
155 elmex 1.10
156 elmex 1.17 if ($layout) {
157     main::set_pos_and_size ($p, $layout->{p_and_s});
158     }
159 elmex 1.10
160 elmex 1.17 $p->show_all;
161 elmex 1.10
162 elmex 1.17 $p->set_selection ($layout->{selection});
163 elmex 1.10 }
164    
165 elmex 1.13 sub build_menu {
166 elmex 1.1 my ($self) = @_;
167    
168 elmex 1.2 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 elmex 1.17 "_Save Layout" => {
181     callback => sub { $self->save_layout },
182     accelerator => '<ctrl>L'
183     },
184 elmex 1.2 _Quit => {
185     callback => sub { Gtk2->main_quit },
186     accelerator => '<ctrl>Q'
187     }
188     ]
189     },
190     _Edit => {
191     item_type => '<Branch>',
192     children => [
193 elmex 1.17 "_Attr Editor" => {
194     callback => sub { $self->show_attr_editor },
195     accelerator => "<ctrl>A"
196 elmex 1.2 },
197 elmex 1.17 "_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 elmex 1.15 "Open _Attr Editor" => {
212     callback => sub { $self->show_attr_editor },
213     accelerator => "<ctrl>A"
214     },
215 elmex 1.9 "Open _Picker" => {
216 elmex 1.13 callback => sub { $self->open_pick_window },
217     accelerator => "<ctrl>P"
218 elmex 1.9 },
219 elmex 1.15 "Open _Stack View" => {
220 elmex 1.17 callback => sub { $self->show_stack_view },
221 elmex 1.15 accelerator => "<ctrl>V"
222     },
223    
224 elmex 1.2 ]
225 elmex 1.9 }
226 elmex 1.17
227 elmex 1.2 ];
228    
229 elmex 1.13 my $men =
230     Gtk2::SimpleMenu->new (
231     menu_tree => $menu_tree,
232     default_callback => \&default_cb,
233     );
234 elmex 1.10
235 elmex 1.2 $self->add_accel_group ($men->{accel_group});
236    
237 elmex 1.13 return $men->{widget};
238     }
239 elmex 1.10
240 elmex 1.17 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 elmex 1.10
286 root 1.11
287 elmex 1.13 sub INIT_INSTANCE {
288     my ($self) = @_;
289 elmex 1.10
290 elmex 1.15 $MAINWIN = $self;
291    
292 elmex 1.13 $self->set_title ("gce - main window");
293 elmex 1.10
294 elmex 1.13 $self->add (my $vb = Gtk2::VBox->new);
295     $vb->pack_start ($self->build_menu, 0, 1, 0);
296 elmex 1.17 $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 elmex 1.10
300 elmex 1.13 # XXX:load $ARGV _cleanly_?
301 elmex 1.17 $self->open_map_editor ($ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3");
302 root 1.11
303 elmex 1.13 $self->signal_connect ('delete-event' => sub {
304     Gtk2->main_quit;
305 elmex 1.10 });
306 elmex 1.17
307     main::set_pos_and_size ($self, $main::CFG->{main_window});
308 elmex 1.2 }
309    
310     sub new_cb {
311     my ($self) = @_;
312     die "NOT IMPLEMENTED YET";
313     }
314    
315     sub open_cb {
316     my ($self) = @_;
317    
318 elmex 1.13 my $fc =
319     Gtk2::FileChooserDialog->new (
320     'gce - open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
321     );
322    
323 elmex 1.2 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
324 elmex 1.13 $fc->add_shortcut_folder ($_) for keys %{$self->{fc_last_folders}};
325 elmex 1.10 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
326 elmex 1.2
327     if ('ok' eq $fc->run) {
328 elmex 1.13
329 elmex 1.10 $self->{fc_last_folder} = $fc->get_current_folder;
330 elmex 1.13 $self->{fc_last_folders}->{$self->{fc_last_folder}}++;
331 elmex 1.17
332     $self->open_map_editor ($fc->get_filename);
333 elmex 1.2 }
334    
335     $fc->destroy;
336     }
337    
338 elmex 1.17 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 elmex 1.1 =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