package GCE::MainWindow; =head1 NAME GCE::MainWindow - the main window class for gce =cut use Gtk2; use Gtk2::Gdk::Keysyms; use Gtk2::SimpleMenu; use Crossfire; use Crossfire::MapWidget; use GCE::AttrEdit; use Glib::Object::Subclass Gtk2::Window, signals => { update_stack_view => { return_type => undef, param_types => [Glib::Int, Glib::Int, Glib::Scalar] }, }; use strict; sub get_tile_stack { my ($self, $x, $y) = @_; my $as; if ($x > 0 || $x < $self->{map}{width} || $y > 0 || $y < $self->{map}{height}) { $as = $self->{map}{map}{map}[$x][$y] || []; } return $as; } sub INIT_INSTANCE { my ($self) = @_; $self->signal_connect (button_release_event => sub { my ($self, $event) = @_; return unless defined $self->{map}; my ($mx, $my) = $self->{map}->coord ($event->x, $event->y); my $s = $self->get_tile_stack ($mx, $my); $self->signal_emit (update_stack_view => $mx, $my, $s); }); $self->signal_connect ('delete-event' => sub { Gtk2->main_quit; }); $self->set_title ("gce - main window"); my $menu_tree = [ _File => { item_type => '', children => [ _New => { callback => sub { $self->new_cb }, accelerator => 'N' }, _Open => { callback => sub { $self->open_cb }, accelerator => 'O' }, _Quit => { callback => sub { Gtk2->main_quit }, accelerator => 'Q' } ] }, _Edit => { item_type => '', children => [ _Fill => { callback => sub { die "NO IMPL" }, accelerator => "F" }, "Clear _Top" => { callback => sub { die "NO IMPL" }, accelerator => "T" }, "_Clear All" => { callback => sub { die "NO IMPL" }, accelerator => "C" }, "_Attributes" => { callback => sub { my $w = Gtk2::Window->new; $w->set_title ("Edit attrs"); $w->add (GCE::AttrEdit->new); $w->show_all; }, accelerator => "A" }, "Open _Picker" => { callback => sub { my $p = GCE::PickWindow->new; $p->init ($self); }, accelerator => "P" }, ] } ]; my $men = Gtk2::SimpleMenu->new ( menu_tree => $menu_tree, default_callback => \&default_cb, ); $self->add (my $vb = Gtk2::VBox->new); $vb->pack_start ($men->{widget}, 0, 1, 0); $self->add_accel_group ($men->{accel_group}); my $map = new Crossfire::MapWidget; # XXX:load $ARGV _cleanly_? my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3"; $map->set_map (arch2map read_arch $path); $self->{map} = $map; $vb->pack_start ($map, 1, 1, 0); } sub new_cb { my ($self) = @_; die "NOT IMPLEMENTED YET"; } sub open_cb { my ($self) = @_; my $fc = Gtk2::FileChooserDialog->new ( 'Open map', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'ok' ); $fc->add_shortcut_folder ("$Crossfire::LIB/maps"); if ('ok' eq $fc->run) { my $map = arch2map read_arch $fc->get_filename; $self->{map}->set_map ($map); $self->{map}->hide; $self->{map}->show_all; } $fc->destroy; } =head1 AUTHOR Marc Lehmann http://home.schmorp.de/ Robin Redeker http://www.ta-sa.org/ =cut 1;