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

# 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.2
20 elmex 1.14 use GCE::AttrTypemap;
21    
22 elmex 1.2 use Glib::Object::Subclass
23 elmex 1.13 Gtk2::Window;
24 elmex 1.2
25     use strict;
26    
27 elmex 1.15 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 elmex 1.13 sub open_pick_window {
78     my ($self) = @_;
79 elmex 1.10
80 elmex 1.13 my $p = GCE::PickWindow->new (
81     set_sel_cb => sub {
82 elmex 1.10
83 elmex 1.13 $self->{mapedit}->update_pick ($_[0])
84     },
85     arch_edit_cb => sub {
86 elmex 1.10
87 elmex 1.15 $self->update_attr_editor ($_[0], 1)
88 elmex 1.13 }
89     );
90     $p->init;
91 elmex 1.10 }
92    
93 elmex 1.13 sub build_menu {
94 elmex 1.1 my ($self) = @_;
95    
96 elmex 1.2 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 elmex 1.13 _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 elmex 1.2 },
125     "_Clear All" => {
126 elmex 1.13 callback => sub { die "NO IMPL" },
127     accelerator => "<ctrl>X"
128 elmex 1.2 },
129 elmex 1.15 "Open _Attr Editor" => {
130     callback => sub { $self->show_attr_editor },
131     accelerator => "<ctrl>A"
132     },
133 elmex 1.9 "Open _Picker" => {
134 elmex 1.13 callback => sub { $self->open_pick_window },
135     accelerator => "<ctrl>P"
136 elmex 1.9 },
137 elmex 1.15 "Open _Stack View" => {
138     callback => sub { $self->test_stack_view },
139     accelerator => "<ctrl>V"
140     },
141    
142 elmex 1.2 ]
143 elmex 1.9 }
144 elmex 1.2 ];
145    
146 elmex 1.13 my $men =
147     Gtk2::SimpleMenu->new (
148     menu_tree => $menu_tree,
149     default_callback => \&default_cb,
150     );
151 elmex 1.10
152 elmex 1.2 $self->add_accel_group ($men->{accel_group});
153    
154 elmex 1.13 return $men->{widget};
155     }
156 elmex 1.10
157    
158 root 1.11
159 elmex 1.13 sub INIT_INSTANCE {
160     my ($self) = @_;
161 elmex 1.10
162 elmex 1.15 $MAINWIN = $self;
163    
164 elmex 1.13 $self->set_title ("gce - main window");
165 elmex 1.10
166 elmex 1.13 $self->add (my $vb = Gtk2::VBox->new);
167     $vb->pack_start ($self->build_menu, 0, 1, 0);
168 elmex 1.15
169 elmex 1.13 $vb->pack_start (my $mapedit = $self->{mapedit} = new GCE::MapEditor, 1, 1, 0);
170 elmex 1.10
171 elmex 1.13 # XXX:load $ARGV _cleanly_?
172     $mapedit->open_map ($ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3");
173 root 1.11
174 elmex 1.13 $self->signal_connect ('delete-event' => sub {
175     Gtk2->main_quit;
176 elmex 1.10 });
177 elmex 1.2 }
178    
179     sub new_cb {
180     my ($self) = @_;
181     die "NOT IMPLEMENTED YET";
182     }
183    
184     sub open_cb {
185     my ($self) = @_;
186    
187 elmex 1.13 my $fc =
188     Gtk2::FileChooserDialog->new (
189     'gce - open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
190     );
191    
192 elmex 1.2 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
193 elmex 1.13 $fc->add_shortcut_folder ($_) for keys %{$self->{fc_last_folders}};
194 elmex 1.10 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
195 elmex 1.2
196     if ('ok' eq $fc->run) {
197 elmex 1.13
198 elmex 1.10 $self->{fc_last_folder} = $fc->get_current_folder;
199 elmex 1.13 $self->{fc_last_folders}->{$self->{fc_last_folder}}++;
200     $self->{mapedit}->open_map ($fc->get_filename);
201 elmex 1.2 }
202    
203     $fc->destroy;
204     }
205    
206 elmex 1.1 =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