… | |
… | |
16 | use GCE::AttrEdit; |
16 | use GCE::AttrEdit; |
17 | |
17 | |
18 | use Glib::Object::Subclass |
18 | use Glib::Object::Subclass |
19 | Gtk2::Window, |
19 | Gtk2::Window, |
20 | signals => { |
20 | signals => { |
21 | open_pick => { return_type => undef, param_types => [Glib::String] } |
21 | open_pick => { return_type => undef, param_types => [Glib::String] }, |
|
|
22 | update_stack_view => { return_type => undef, param_types => [Glib::Int, Glib::Int, Glib::Scalar] }, |
22 | }; |
23 | }; |
23 | |
24 | |
24 | use strict; |
25 | use strict; |
25 | |
26 | |
26 | sub get_picks { |
27 | sub get_picks { |
… | |
… | |
28 | or die "Can't open editor picks: $main::pickdir: $!"; |
29 | or die "Can't open editor picks: $main::pickdir: $!"; |
29 | |
30 | |
30 | grep { !m/^(\.|\.\.)$/ && -f "$main::PICKDIR/$_" } readdir PICKS |
31 | grep { !m/^(\.|\.\.)$/ && -f "$main::PICKDIR/$_" } readdir PICKS |
31 | } |
32 | } |
32 | |
33 | |
|
|
34 | sub get_tile_stack { |
|
|
35 | my ($self, $x, $y) = @_; |
|
|
36 | my $as; |
|
|
37 | |
|
|
38 | if ($x > 0 || $x < $self->{map}{width} |
|
|
39 | || $y > 0 || $y < $self->{map}{height}) { |
|
|
40 | |
|
|
41 | $as = $self->{map}{map}{map}[$x][$y] || []; |
|
|
42 | } |
|
|
43 | |
|
|
44 | return $as; |
|
|
45 | } |
|
|
46 | |
33 | sub INIT_INSTANCE { |
47 | sub INIT_INSTANCE { |
34 | my ($self) = @_; |
48 | my ($self) = @_; |
35 | |
49 | |
|
|
50 | $self->signal_connect (button_release_event => sub { |
|
|
51 | my ($self, $event) = @_; |
|
|
52 | return unless defined $self->{map}; |
|
|
53 | |
|
|
54 | my ($mx, $my) = $self->{map}->coord ($event->x, $event->y); |
|
|
55 | my $s = $self->get_tile_stack ($mx, $my); |
|
|
56 | $self->signal_emit (update_stack_view => $mx, $my, $s); |
|
|
57 | }); |
36 | $self->set_title ("gce - main window"); |
58 | $self->set_title ("gce - main window"); |
37 | |
59 | |
38 | my @pick; |
60 | my @pick; |
39 | for (get_picks ()) { |
61 | for (get_picks ()) { |
40 | push @pick, $_ => { |
62 | push @pick, $_ => { |
… | |
… | |
99 | |
121 | |
100 | my $map = new Crossfire::MapWidget; |
122 | my $map = new Crossfire::MapWidget; |
101 | # XXX:load $ARGV _cleanly_? |
123 | # XXX:load $ARGV _cleanly_? |
102 | my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3"; |
124 | my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3"; |
103 | $map->set_map (arch2map read_arch $path); |
125 | $map->set_map (arch2map read_arch $path); |
104 | $self->{_map} = $map; |
126 | $self->{map} = $map; |
105 | |
127 | |
106 | $vb->pack_start ($map, 1, 1, 0); |
128 | $vb->pack_start ($map, 1, 1, 0); |
107 | } |
129 | } |
108 | |
130 | |
109 | sub new_cb { |
131 | sub new_cb { |
… | |
… | |
119 | ); |
141 | ); |
120 | $fc->add_shortcut_folder ("$Crossfire::LIB/maps"); |
142 | $fc->add_shortcut_folder ("$Crossfire::LIB/maps"); |
121 | |
143 | |
122 | if ('ok' eq $fc->run) { |
144 | if ('ok' eq $fc->run) { |
123 | my $map = arch2map read_arch $fc->get_filename; |
145 | my $map = arch2map read_arch $fc->get_filename; |
124 | $self->{_map}->set_map ($map); |
146 | $self->{map}->set_map ($map); |
125 | $self->{_map}->hide; |
147 | $self->{map}->hide; |
126 | $self->{_map}->show_all; |
148 | $self->{map}->show_all; |
127 | } |
149 | } |
128 | |
150 | |
129 | $fc->destroy; |
151 | $fc->destroy; |
130 | } |
152 | } |
131 | |
153 | |