ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/MainWindow.pm
Revision: 1.16
Committed: Sun Feb 12 04:50:29 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.15: +1 -2 lines
Log Message:
*** empty log message ***

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
20 use GCE::AttrTypemap;
21
22 use Glib::Object::Subclass
23 Gtk2::Window;
24
25 use strict;
26
27 our $MAINWIN;
28
29 sub test_stack_view {
30 my ($self) = @_;
31
32 return if defined $self->{sv};
33
34 my $w = Gtk2::Window->new ('toplevel');
35 $w->set_title ('gce - stack view');
36 $w->signal_connect ('delete-event' => sub { $self->{sv} = undef; });
37 $w->add ($self->{sv} = GCE::StackView->new);
38 $w->show_all;
39 }
40
41 sub show_attr_editor {
42 my ($self) = @_;
43
44 my $w = $self->{attr_edit_win} = Gtk2::Window->new;
45 $w->set_title ("gce - edit attrs");
46 $w->add ($self->{attr_edit} = GCE::AttrEdit->new);
47 $w->signal_connect ('delete-event' => sub { delete $self->{attr_edit}; 0 });
48 $w->show_all;
49 }
50
51 sub update_attr_editor {
52 my ($self, $arch, $ro) = @_;
53
54 return unless $self->{attr_edit};
55
56 $self->{attr_edit}->set_arch ($arch, $ro);
57 $self->{attr_edit_win}->set_title ("gce - edit $arch->{_name}");
58 }
59
60 sub update_stack_view {
61 my ($self, $mapedit, $stack, $x, $y) = @_;
62
63 return unless $self->{sv};
64
65 $self->{sv}->set_stack ($mapedit, $stack, $x, $y);
66 }
67
68 #XXX: Soon we want to handle multiple maps!
69 #XXX: Refactor this to MapEditor??
70 sub change_map_tile {
71 my ($self, $mapedit, $x, $y, $newstack, $oldstack) = @_;
72
73 $mapedit->{map}->set ($x, $y, $newstack);
74 }
75
76 sub open_pick_window {
77 my ($self) = @_;
78
79 my $p = GCE::PickWindow->new (
80 set_sel_cb => sub {
81
82 $self->{mapedit}->update_pick ($_[0])
83 },
84 arch_edit_cb => sub {
85
86 $self->update_attr_editor ($_[0], 1)
87 }
88 );
89 $p->init;
90 }
91
92 sub build_menu {
93 my ($self) = @_;
94
95 my $menu_tree = [
96 _File => {
97 item_type => '<Branch>',
98 children => [
99 _New => {
100 callback => sub { $self->new_cb },
101 accelerator => '<ctrl>N'
102 },
103 _Open => {
104 callback => sub { $self->open_cb },
105 accelerator => '<ctrl>O'
106 },
107 _Quit => {
108 callback => sub { Gtk2->main_quit },
109 accelerator => '<ctrl>Q'
110 }
111 ]
112 },
113 _Edit => {
114 item_type => '<Branch>',
115 children => [
116 _Fill => {
117 callback => sub { die "NO IMPL" },
118 accelerator => "<ctrl>F"
119 },
120 "Clear _Top" => {
121 callback => sub { die "NO IMPL" },
122 accelerator => "<ctrl>T"
123 },
124 "_Clear All" => {
125 callback => sub { die "NO IMPL" },
126 accelerator => "<ctrl>X"
127 },
128 "Open _Attr Editor" => {
129 callback => sub { $self->show_attr_editor },
130 accelerator => "<ctrl>A"
131 },
132 "Open _Picker" => {
133 callback => sub { $self->open_pick_window },
134 accelerator => "<ctrl>P"
135 },
136 "Open _Stack View" => {
137 callback => sub { $self->test_stack_view },
138 accelerator => "<ctrl>V"
139 },
140
141 ]
142 }
143 ];
144
145 my $men =
146 Gtk2::SimpleMenu->new (
147 menu_tree => $menu_tree,
148 default_callback => \&default_cb,
149 );
150
151 $self->add_accel_group ($men->{accel_group});
152
153 return $men->{widget};
154 }
155
156
157
158 sub INIT_INSTANCE {
159 my ($self) = @_;
160
161 $MAINWIN = $self;
162
163 $self->set_title ("gce - main window");
164
165 $self->add (my $vb = Gtk2::VBox->new);
166 $vb->pack_start ($self->build_menu, 0, 1, 0);
167
168 $vb->pack_start (my $mapedit = $self->{mapedit} = new GCE::MapEditor, 1, 1, 0);
169
170 # XXX:load $ARGV _cleanly_?
171 $mapedit->open_map ($ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3");
172
173 $self->signal_connect ('delete-event' => sub {
174 Gtk2->main_quit;
175 });
176 }
177
178 sub new_cb {
179 my ($self) = @_;
180 die "NOT IMPLEMENTED YET";
181 }
182
183 sub open_cb {
184 my ($self) = @_;
185
186 my $fc =
187 Gtk2::FileChooserDialog->new (
188 'gce - open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
189 );
190
191 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
192 $fc->add_shortcut_folder ($_) for keys %{$self->{fc_last_folders}};
193 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
194
195 if ('ok' eq $fc->run) {
196
197 $self->{fc_last_folder} = $fc->get_current_folder;
198 $self->{fc_last_folders}->{$self->{fc_last_folder}}++;
199 $self->{mapedit}->open_map ($fc->get_filename);
200 }
201
202 $fc->destroy;
203 }
204
205 =head1 AUTHOR
206
207 Marc Lehmann <schmorp@schmorp.de>
208 http://home.schmorp.de/
209
210 Robin Redeker <elmex@ta-sa.org>
211 http://www.ta-sa.org/
212
213 =cut
214 1;
215