… | |
… | |
6 | |
6 | |
7 | =cut |
7 | =cut |
8 | |
8 | |
9 | use Gtk2; |
9 | use Gtk2; |
10 | use Gtk2::Gdk::Keysyms; |
10 | use Gtk2::Gdk::Keysyms; |
|
|
11 | use Gtk2::SimpleMenu; |
|
|
12 | use GCE::Map; |
|
|
13 | use GCE::AttrEdit; |
|
|
14 | use Crossfire; |
|
|
15 | use Crossfire::Gtk2; |
11 | |
16 | |
12 | use Glib::Object::Subclass Gtk2::Window; |
17 | use Glib::Object::Subclass |
|
|
18 | Gtk2::Window, |
|
|
19 | signals => { |
|
|
20 | open_pick => { return_type => undef, param_types => [Glib::String] } |
|
|
21 | }; |
|
|
22 | |
|
|
23 | use strict; |
|
|
24 | |
|
|
25 | sub get_picks { |
|
|
26 | opendir PICKS, $main::PICKDIR |
|
|
27 | or die "Can't open editor picks: $main::pickdir: $!"; |
|
|
28 | |
|
|
29 | grep { !m/^(\.|\.\.)$/ && -f "$main::PICKDIR/$_" } readdir PICKS |
|
|
30 | } |
13 | |
31 | |
14 | sub INIT_INSTANCE { |
32 | sub INIT_INSTANCE { |
15 | my ($self) = @_; |
33 | my ($self) = @_; |
16 | |
34 | |
17 | $self->add (my $b = Gtk2::Label->new ("<stuff here>")); |
35 | $self->set_title ("gce - main window"); |
|
|
36 | |
|
|
37 | my @pick; |
|
|
38 | for (get_picks ()) { |
|
|
39 | push @pick, $_ => { |
|
|
40 | callback => sub { $self->signal_emit (open_pick => $_) } |
|
|
41 | }; |
|
|
42 | } |
|
|
43 | |
|
|
44 | my $menu_tree = [ |
|
|
45 | _File => { |
|
|
46 | item_type => '<Branch>', |
|
|
47 | children => [ |
|
|
48 | _New => { |
|
|
49 | callback => sub { $self->new_cb }, |
|
|
50 | accelerator => '<ctrl>N' |
|
|
51 | }, |
|
|
52 | _Open => { |
|
|
53 | callback => sub { $self->open_cb }, |
|
|
54 | accelerator => '<ctrl>O' |
|
|
55 | }, |
|
|
56 | _Quit => { |
|
|
57 | callback => sub { Gtk2->main_quit }, |
|
|
58 | accelerator => '<ctrl>Q' |
|
|
59 | } |
|
|
60 | ] |
|
|
61 | }, |
|
|
62 | _Edit => { |
|
|
63 | item_type => '<Branch>', |
|
|
64 | children => [ |
|
|
65 | _Fill => { |
|
|
66 | callback => sub { die "NO IMPL" }, accelerator => "<ctrl>F" |
|
|
67 | }, |
|
|
68 | "Clear _Top" => { |
|
|
69 | callback => sub { die "NO IMPL" }, accelerator => "<ctrl>T" |
|
|
70 | }, |
|
|
71 | "_Clear All" => { |
|
|
72 | callback => sub { die "NO IMPL" }, accelerator => "<ctrl>C" |
|
|
73 | }, |
|
|
74 | "_Attributes" => { |
|
|
75 | callback => sub { |
|
|
76 | my $w = Gtk2::Window->new; |
|
|
77 | $w->set_title ("Edit attrs"); |
|
|
78 | $w->add (GCE::AttrEdit->new); |
|
|
79 | $w->show_all; |
|
|
80 | }, |
|
|
81 | accelerator => "<ctrl>A" |
|
|
82 | }, |
|
|
83 | ] |
|
|
84 | }, |
|
|
85 | _Pick => { |
|
|
86 | item_type => '<Branch>', |
|
|
87 | children => \@pick |
|
|
88 | }, |
|
|
89 | ]; |
|
|
90 | my $men = Gtk2::SimpleMenu->new ( |
|
|
91 | menu_tree => $menu_tree, |
|
|
92 | default_callback => \&default_cb, |
|
|
93 | ); |
|
|
94 | |
|
|
95 | $self->add (my $vb = Gtk2::VBox->new); |
|
|
96 | $vb->pack_start ($men->{widget}, 0, 1, 0); |
|
|
97 | $self->add_accel_group ($men->{accel_group}); |
|
|
98 | |
|
|
99 | my $map = new GCE::Map; |
|
|
100 | # XXX:load $ARGV? |
|
|
101 | $map->{map} = arch2map read_arch "$Crossfire::LIB/maps/mlab/university1"; |
|
|
102 | $self->{_map} = $map; |
|
|
103 | |
|
|
104 | $vb->pack_start ($map, 1, 1, 0); |
|
|
105 | } |
|
|
106 | |
|
|
107 | sub new_cb { |
|
|
108 | my ($self) = @_; |
|
|
109 | die "NOT IMPLEMENTED YET"; |
|
|
110 | } |
|
|
111 | |
|
|
112 | sub open_cb { |
|
|
113 | my ($self) = @_; |
|
|
114 | |
|
|
115 | my $fc = Gtk2::FileChooserDialog->new ( |
|
|
116 | 'Open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok' |
|
|
117 | ); |
|
|
118 | $fc->add_shortcut_folder ("$Crossfire::LIB/maps"); |
|
|
119 | |
|
|
120 | if ('ok' eq $fc->run) { |
|
|
121 | my $map = arch2map read_arch $fc->get_filename; |
|
|
122 | # XXX: $self->{_map}->set_map ($map) ... |
|
|
123 | $self->{_map}->{map} = $map; |
|
|
124 | $self->{_map}->hide; |
|
|
125 | $self->{_map}->show; |
|
|
126 | } |
|
|
127 | |
|
|
128 | $fc->destroy; |
|
|
129 | } |
|
|
130 | |
|
|
131 | sub open_pick_cb { |
|
|
132 | my ($self, $pick) = @_; |
18 | } |
133 | } |
19 | |
134 | |
20 | =head1 AUTHOR |
135 | =head1 AUTHOR |
21 | |
136 | |
22 | Marc Lehmann <schmorp@schmorp.de> |
137 | Marc Lehmann <schmorp@schmorp.de> |