ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/MainWindow.pm
Revision: 1.15
Committed: Sat Feb 11 01:23:07 2006 UTC (18 years, 4 months ago) by elmex
Branch: MAIN
Changes since 1.14: +64 -1 lines
Log Message:
implemented the stackview

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}{map}{map}[$x][$y] = $newstack;
74 $mapedit->{map}->update_map ($x, $y, 1, 1);
75 }
76
77 sub open_pick_window {
78 my ($self) = @_;
79
80 my $p = GCE::PickWindow->new (
81 set_sel_cb => sub {
82
83 $self->{mapedit}->update_pick ($_[0])
84 },
85 arch_edit_cb => sub {
86
87 $self->update_attr_editor ($_[0], 1)
88 }
89 );
90 $p->init;
91 }
92
93 sub build_menu {
94 my ($self) = @_;
95
96 my $menu_tree = [
97 _File => {
98 item_type => '<Branch>',
99 children => [
100 _New => {
101 callback => sub { $self->new_cb },
102 accelerator => '<ctrl>N'
103 },
104 _Open => {
105 callback => sub { $self->open_cb },
106 accelerator => '<ctrl>O'
107 },
108 _Quit => {
109 callback => sub { Gtk2->main_quit },
110 accelerator => '<ctrl>Q'
111 }
112 ]
113 },
114 _Edit => {
115 item_type => '<Branch>',
116 children => [
117 _Fill => {
118 callback => sub { die "NO IMPL" },
119 accelerator => "<ctrl>F"
120 },
121 "Clear _Top" => {
122 callback => sub { die "NO IMPL" },
123 accelerator => "<ctrl>T"
124 },
125 "_Clear All" => {
126 callback => sub { die "NO IMPL" },
127 accelerator => "<ctrl>X"
128 },
129 "Open _Attr Editor" => {
130 callback => sub { $self->show_attr_editor },
131 accelerator => "<ctrl>A"
132 },
133 "Open _Picker" => {
134 callback => sub { $self->open_pick_window },
135 accelerator => "<ctrl>P"
136 },
137 "Open _Stack View" => {
138 callback => sub { $self->test_stack_view },
139 accelerator => "<ctrl>V"
140 },
141
142 ]
143 }
144 ];
145
146 my $men =
147 Gtk2::SimpleMenu->new (
148 menu_tree => $menu_tree,
149 default_callback => \&default_cb,
150 );
151
152 $self->add_accel_group ($men->{accel_group});
153
154 return $men->{widget};
155 }
156
157
158
159 sub INIT_INSTANCE {
160 my ($self) = @_;
161
162 $MAINWIN = $self;
163
164 $self->set_title ("gce - main window");
165
166 $self->add (my $vb = Gtk2::VBox->new);
167 $vb->pack_start ($self->build_menu, 0, 1, 0);
168
169 $vb->pack_start (my $mapedit = $self->{mapedit} = new GCE::MapEditor, 1, 1, 0);
170
171 # XXX:load $ARGV _cleanly_?
172 $mapedit->open_map ($ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3");
173
174 $self->signal_connect ('delete-event' => sub {
175 Gtk2->main_quit;
176 });
177 }
178
179 sub new_cb {
180 my ($self) = @_;
181 die "NOT IMPLEMENTED YET";
182 }
183
184 sub open_cb {
185 my ($self) = @_;
186
187 my $fc =
188 Gtk2::FileChooserDialog->new (
189 'gce - open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
190 );
191
192 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
193 $fc->add_shortcut_folder ($_) for keys %{$self->{fc_last_folders}};
194 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
195
196 if ('ok' eq $fc->run) {
197
198 $self->{fc_last_folder} = $fc->get_current_folder;
199 $self->{fc_last_folders}->{$self->{fc_last_folder}}++;
200 $self->{mapedit}->open_map ($fc->get_filename);
201 }
202
203 $fc->destroy;
204 }
205
206 =head1 AUTHOR
207
208 Marc Lehmann <schmorp@schmorp.de>
209 http://home.schmorp.de/
210
211 Robin Redeker <elmex@ta-sa.org>
212 http://www.ta-sa.org/
213
214 =cut
215 1;
216