ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/MainWindow.pm
Revision: 1.8
Committed: Mon Feb 6 09:21:33 2006 UTC (18 years, 4 months ago) by elmex
Branch: MAIN
Changes since 1.7: +27 -5 lines
Log Message:
minor changes

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
18 use Glib::Object::Subclass
19 Gtk2::Window,
20 signals => {
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] },
23 };
24
25 use strict;
26
27 sub get_picks {
28 opendir PICKS, $main::PICKDIR
29 or die "Can't open editor picks: $main::pickdir: $!";
30
31 grep { !m/^(\.|\.\.)$/ && -f "$main::PICKDIR/$_" } readdir PICKS
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
47 sub INIT_INSTANCE {
48 my ($self) = @_;
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 });
58 $self->set_title ("gce - main window");
59
60 my @pick;
61 for (get_picks ()) {
62 push @pick, $_ => {
63 callback => sub { $self->signal_emit (open_pick => $_) }
64 };
65 }
66
67 my $menu_tree = [
68 _File => {
69 item_type => '<Branch>',
70 children => [
71 _New => {
72 callback => sub { $self->new_cb },
73 accelerator => '<ctrl>N'
74 },
75 _Open => {
76 callback => sub { $self->open_cb },
77 accelerator => '<ctrl>O'
78 },
79 _Quit => {
80 callback => sub { Gtk2->main_quit },
81 accelerator => '<ctrl>Q'
82 }
83 ]
84 },
85 _Edit => {
86 item_type => '<Branch>',
87 children => [
88 _Fill => {
89 callback => sub { die "NO IMPL" }, accelerator => "<ctrl>F"
90 },
91 "Clear _Top" => {
92 callback => sub { die "NO IMPL" }, accelerator => "<ctrl>T"
93 },
94 "_Clear All" => {
95 callback => sub { die "NO IMPL" }, accelerator => "<ctrl>C"
96 },
97 "_Attributes" => {
98 callback => sub {
99 my $w = Gtk2::Window->new;
100 $w->set_title ("Edit attrs");
101 $w->add (GCE::AttrEdit->new);
102 $w->show_all;
103 },
104 accelerator => "<ctrl>A"
105 },
106 ]
107 },
108 _Pick => {
109 item_type => '<Branch>',
110 children => \@pick
111 },
112 ];
113 my $men = Gtk2::SimpleMenu->new (
114 menu_tree => $menu_tree,
115 default_callback => \&default_cb,
116 );
117
118 $self->add (my $vb = Gtk2::VBox->new);
119 $vb->pack_start ($men->{widget}, 0, 1, 0);
120 $self->add_accel_group ($men->{accel_group});
121
122 my $map = new Crossfire::MapWidget;
123 # XXX:load $ARGV _cleanly_?
124 my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3";
125 $map->set_map (arch2map read_arch $path);
126 $self->{map} = $map;
127
128 $vb->pack_start ($map, 1, 1, 0);
129 }
130
131 sub new_cb {
132 my ($self) = @_;
133 die "NOT IMPLEMENTED YET";
134 }
135
136 sub open_cb {
137 my ($self) = @_;
138
139 my $fc = Gtk2::FileChooserDialog->new (
140 'Open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok'
141 );
142 $fc->add_shortcut_folder ("$Crossfire::LIB/maps");
143
144 if ('ok' eq $fc->run) {
145 my $map = arch2map read_arch $fc->get_filename;
146 $self->{map}->set_map ($map);
147 $self->{map}->hide;
148 $self->{map}->show_all;
149 }
150
151 $fc->destroy;
152 }
153
154 sub open_pick_cb {
155 my ($self, $pick) = @_;
156 }
157
158 =head1 AUTHOR
159
160 Marc Lehmann <schmorp@schmorp.de>
161 http://home.schmorp.de/
162
163 Robin Redeker <elmex@ta-sa.org>
164 http://www.ta-sa.org/
165
166 =cut
167 1;
168