ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/cf.schmorp.de/gde/GCE/MainWindow.pm
Revision: 1.12
Committed: Tue Feb 7 17:33:40 2006 UTC (20 years, 8 months ago) by root
Branch: MAIN
Changes since 1.11: +15 -14 lines
Log Message:
*** empty log message ***

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    
18     use Glib::Object::Subclass
19     Gtk2::Window,
20     signals => {
21 elmex 1.8 update_stack_view => { return_type => undef, param_types => [Glib::Int, Glib::Int, Glib::Scalar] },
22 elmex 1.2 };
23    
24     use strict;
25    
26 elmex 1.10 sub delete_arch {
27     my ($self, $x, $y) = @_;
28    
29     return 0 unless
30     defined $self->{map};
31    
32 root 1.11 my $s = map_pop_tile_stack ($self->{map}, $x, $y);
33     $self->{map}->update_map ($x, $y, 1, 1);
34 elmex 1.10 }
35    
36     sub get_top_arch {
37     my ($self, $x, $y) = @_;
38    
39     return 0 unless
40     defined $self->{map};
41    
42     map_get_tile_stack ($self->{map}, $self->{map}->coord ($x, $y))->[-1]
43     }
44    
45     sub place_pick {
46 elmex 1.8 my ($self, $x, $y) = @_;
47    
48 elmex 1.10 return 0 unless
49     defined $self->{map}
50     and defined $self->{pick_arch};
51    
52 root 1.11 my $s = map_get_tile_stack ($self->{map}, $x, $y);
53 elmex 1.10 my $top = $s->[-1];
54     my $arch = { _name => $self->{pick_arch}->{_name} };
55 elmex 1.8
56 elmex 1.10 if ($top->{_name} ne $arch->{_name}) {
57 root 1.11 map_push_tile_stack ($self->{map}, $x, $y, $arch);
58 elmex 1.8 }
59    
60 root 1.11 $self->{map}->update_map ($x, $y, 1, 1);
61 elmex 1.8 }
62    
63 elmex 1.1 sub INIT_INSTANCE {
64     my ($self) = @_;
65    
66 elmex 1.9 $self->signal_connect ('delete-event' => sub {
67     Gtk2->main_quit;
68     });
69 elmex 1.2 $self->set_title ("gce - main window");
70    
71     my $menu_tree = [
72     _File => {
73     item_type => '<Branch>',
74     children => [
75     _New => {
76     callback => sub { $self->new_cb },
77     accelerator => '<ctrl>N'
78     },
79     _Open => {
80     callback => sub { $self->open_cb },
81     accelerator => '<ctrl>O'
82     },
83     _Quit => {
84     callback => sub { Gtk2->main_quit },
85     accelerator => '<ctrl>Q'
86     }
87     ]
88     },
89     _Edit => {
90     item_type => '<Branch>',
91     children => [
92     _Fill => {
93     callback => sub { die "NO IMPL" }, accelerator => "<ctrl>F"
94     },
95     "Clear _Top" => {
96     callback => sub { die "NO IMPL" }, accelerator => "<ctrl>T"
97     },
98     "_Clear All" => {
99     callback => sub { die "NO IMPL" }, accelerator => "<ctrl>C"
100     },
101     "_Attributes" => {
102     callback => sub {
103 elmex 1.10 return if defined $self->{attr_edit};
104 elmex 1.2 my $w = Gtk2::Window->new;
105 elmex 1.10 $w->set_title ("gce - edit attrs");
106     $w->add ($self->{attr_edit} = GCE::AttrEdit->new);
107     $w->signal_connect ('delete-event' => sub { delete $self->{attr_edit} });
108 elmex 1.2 $w->show_all;
109     },
110     accelerator => "<ctrl>A"
111     },
112 elmex 1.9 "Open _Picker" => {
113     callback => sub {
114 elmex 1.10 my $p = GCE::PickWindow->new (
115     set_sel_cb => sub { $self->update_pick ($_[0]) },
116     arch_edit_cb => sub { $self->{attr_edit} and $self->{attr_edit}->set_arch ($_[0]) }
117     );
118     $p->init;
119 elmex 1.9 }, accelerator => "<ctrl>P"
120     },
121 elmex 1.2 ]
122 elmex 1.9 }
123 elmex 1.2 ];
124     my $men = Gtk2::SimpleMenu->new (
125     menu_tree => $menu_tree,
126     default_callback => \&default_cb,
127     );
128    
129     $self->add (my $vb = Gtk2::VBox->new);
130 elmex 1.10 $vb->pack_start ($men->{widget}, 0, 1, 0);
131     $vb->pack_start (my $lbl = Gtk2::Label->new ("no selection"), 0, 1, 0);
132     $self->{pick_view} = $lbl;
133    
134 elmex 1.2 $self->add_accel_group ($men->{accel_group});
135    
136 root 1.7 my $map = new Crossfire::MapWidget;
137 root 1.5 # XXX:load $ARGV _cleanly_?
138 root 1.6 my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3";
139 root 1.4 $map->set_map (arch2map read_arch $path);
140 elmex 1.8 $self->{map} = $map;
141 elmex 1.2
142 root 1.11 $map->signal_connect (button_press_event => sub {
143     my ($map, $event) = @_;
144 elmex 1.10
145 root 1.11 my ($x, $y) = $map->coord ($event->x, $event->y);
146 elmex 1.10
147     if ($event->button == 1) {
148 root 1.11 $map->disable_tooltip unless $self->{draw_mode};
149     $self->{draw_mode} = [1, $x, $y];
150     $self->place_pick ($x, $y);
151 elmex 1.10 return 1;
152    
153     } elsif ($event->button == 3) {
154 root 1.11 $map->disable_tooltip unless $self->{draw_mode};
155     $self->{draw_mode} = [2, $x, $y];
156     $self->delete_arch ($x, $y);
157 elmex 1.10 return 1;
158     }
159    
160     0
161     });
162    
163 root 1.11 $map->signal_connect_after (motion_notify_event => sub {
164     my ($map, $event) = @_;
165    
166     return unless $self->{draw_mode};
167 elmex 1.10
168 root 1.12 my ($X, $Y) = @{$self->{draw_mode}}[1,2];
169 root 1.11 my ($x, $y) = $map->coord ($map->get_pointer);
170 elmex 1.10
171 root 1.12 while ($x != $X || $y != $Y) {
172     $X++ if $X < $x;
173     $X-- if $X > $x;
174     $Y++ if $Y < $y;
175     $Y-- if $Y > $y;
176    
177     if ($self->{draw_mode}[0] == 1) {
178     $self->place_pick ($X, $Y);
179     } elsif ($self->{draw_mode}[0] == 2) {
180     $self->delete_arch ($X, $Y);
181     }
182     }
183 elmex 1.10
184 root 1.12 @{$self->{draw_mode}}[1,2] = ($X, $Y);
185 root 1.11
186 root 1.12 1
187 elmex 1.10 });
188    
189 root 1.11 $map->signal_connect (button_release_event => sub {
190     my ($map, $event) = @_;
191    
192     $map->enable_tooltip if delete $self->{draw_mode};
193    
194 elmex 1.10 if ($event->button == 1 && $event->state * "shift-mask") {
195     return 0 unless defined $self->{attr_edit};
196     $self->{attr_edit}->set_arch ($self->get_top_arch ($event->x, $event->y));
197     return 1;
198 root 1.11 }
199 elmex 1.10
200 root 1.11 0
201 elmex 1.10 });
202    
203 elmex 1.2 $vb->pack_start ($map, 1, 1, 0);
204     }
205    
206     sub new_cb {
207     my ($self) = @_;
208     die "NOT IMPLEMENTED YET";
209     }
210    
211     sub open_cb {
212     my ($self) = @_;
213    
214     my $fc = Gtk2::FileChooserDialog->new (
215     'Open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
216     );
217     $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
218 elmex 1.10 $fc->set_current_folder ($self->{fc_last_folder} || "$Crossfire::LIB/maps");
219 elmex 1.2
220     if ('ok' eq $fc->run) {
221     my $map = arch2map read_arch $fc->get_filename;
222 elmex 1.10 $self->{fc_last_folder} = $fc->get_current_folder;
223 elmex 1.8 $self->{map}->set_map ($map);
224     $self->{map}->hide;
225     $self->{map}->show_all;
226 elmex 1.2 }
227    
228     $fc->destroy;
229     }
230    
231 elmex 1.10 sub update_pick {
232     my ($self, $arch) = @_;
233    
234     $self->{pick_arch} = $arch;
235     $self->{pick_view}->set_text ($arch->{_name});
236     }
237    
238 elmex 1.1 =head1 AUTHOR
239    
240     Marc Lehmann <schmorp@schmorp.de>
241     http://home.schmorp.de/
242    
243     Robin Redeker <elmex@ta-sa.org>
244     http://www.ta-sa.org/
245    
246     =cut
247     1;
248