Goo-Canvas
view release on metacpan or search on metacpan
bin/perlmine.pl view on Meta::CPAN
if ( $@ ) {
print STDERR "Error when load config file: $@!\n";
}
}
else {
eval { require Mine::Config; };
$config_file = $INC{'Mine/Config.pm'};
}
if ( !$config_file ) {
$config_file = "$home/$default_conf_file";
}
our $game_status;
our $elapse_time = 0;
our $timer;
$Data::Dumper::Indent = 1;
$| = 1;
our %image = (
'smile' => catfile($Config{image_directory}, 'face-smile.png'),
'win' => catfile($Config{image_directory}, 'face-win.png'),
'sad' => catfile($Config{image_directory}, 'face-sad.png'),
'mine' => catfile($Config{image_directory}, 'mine.svg'),
'flag' => catfile($Config{image_directory}, 'flag.svg'),
);
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
my $vbox = Gtk2::VBox->new();
my $menu = create_menu();
# box for buttons and labels
my $btab = Gtk2::Table->new(1, 3, FALSE);
my $timer_label = Gtk2::Label->new();
$btab->attach_defaults($timer_label, 0, 1, 0, 1);
my $image_but = Gtk2::Button->new;
$image_but->signal_connect(
'clicked' => \&start_game
);
$image_but->set('relief' => 'none');
$btab->attach_defaults($image_but, 1, 2, 0, 1);
my $count_label = Gtk2::Label->new();
$btab->attach_defaults($count_label, 2, 3, 0, 1);
my $canvas = Goo::Canvas->new;
setup_canvas();
for ( $menu, $btab, $canvas ) {
$vbox->pack_start($_, FALSE, FALSE, 0);
}
$window->add($vbox);
$window->show_all;
start_game();
Gtk2->main;
sub END {
write_history();
}
#}}}
#{{{ create menu and canvas
sub create_menu {
my $menu_bar = Gtk2::MenuBar->new;
# File
my $file_menu = Gtk2::Menu->new;
# |- junior
my $junior_menuitem = Gtk2::MenuItem->new_with_label( gettext('_Junior') );
$junior_menuitem->signal_connect('activate' => \&set_level,
$Config{level}{junior} );
$file_menu->append($junior_menuitem);
# |- senior
my $senior_menuitem = Gtk2::MenuItem->new_with_label( gettext('_Senior') );
$senior_menuitem->signal_connect('activate' => \&set_level,
$Config{level}{senior} );
$file_menu->append($senior_menuitem);
# |- advance
my $advance_menuitem = Gtk2::MenuItem->new_with_label( gettext('_Advance') );
$advance_menuitem->signal_connect('activate' => \&set_level,
$Config{level}{advance} );
$file_menu->append($advance_menuitem);
# |- Exit
my $exit_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-quit', undef);
$exit_menuitem->signal_connect('activate' => sub { Gtk2->main_quit });
$file_menu->append($exit_menuitem);
# Setting
my $setting_menu = Gtk2::Menu->new;
# |- Settings
my $setting_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-preferences', undef);
$setting_menuitem->signal_connect('activate' => \&setting);
$setting_menu->append($setting_menuitem);
# Help
my $help_menu = Gtk2::Menu->new;
# |- About
my $about_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-about', undef);
$about_menuitem->signal_connect('activate' => \&about);
$help_menu->append($about_menuitem);
my $file_menuitem = Gtk2::MenuItem->new(gettext("_File"));
$file_menuitem->set_submenu($file_menu);
$menu_bar->append( $file_menuitem );
my $setting_menuitem2 = Gtk2::MenuItem->new(gettext("_Setting"));
$setting_menuitem2->set_submenu($setting_menu);
$menu_bar->append($setting_menuitem2);
my $help_menuitem = Gtk2::MenuItem->new(gettext("_Help"));
$help_menuitem->set_submenu($help_menu);
$menu_bar->append($help_menuitem);
return $menu_bar;
}
sub about {
my $dia = Gtk2::AboutDialog->new();
$dia->set_authors(gettext('Ye Wenbin'));
$dia->run;
$dia->destroy;
}
sub setup_canvas {
my $root = Goo::Canvas::Group->new;
my ($rows, $cols) = ($Config{rows}, $Config{cols});
my ($xpad, $ypad) = ( 10, 10 );
my $border = 1;
$canvas->{table} = Mine::Table->new(
$root, $xpad, $ypad,
-columns => $cols,
-rows => $rows,
-border => $border,
-mines => $Config{mines},
-question => $Config{use_question_flag},
);
foreach ( @{$canvas->{table}{table}} ) {
foreach ( @{$_} ) {
$_->signal_connect(
'button-press-event' => \&open_cell
);
}
}
$canvas->set_root_item($root);
$canvas->set_size_request( $xpad * 2 + Mine::Table::SIZE * $cols,
$ypad * 2 + Mine::Table::SIZE * $rows);
}
sub setting {
my $dia = Gtk2::Dialog->new(
gettext('Setting'), $window,
'modal', 'gtk-ok' => 'ok',
'gtk-cancel' => 'cancel',
);
my $vbox = $dia->vbox;
my $table = Gtk2::Table->new(2, 2);
my ($label, $row_but, $col_but, $mines_but);
$label = Gtk2::Label->new(gettext("Rows"));
$row_but = Gtk2::SpinButton->new_with_range(1, MAXROWS, 1);
$row_but->set_value($Config{rows});
$table->attach_defaults($label, 0, 1, 0, 1);
$table->attach_defaults($row_but, 1, 2, 0, 1);
$label = Gtk2::Label->new(gettext("Columns"));
$col_but = Gtk2::SpinButton->new_with_range(1, MAXROWS, 1);
$col_but->set_value($Config{cols});
$table->attach_defaults($label, 0, 1, 1, 2);
$table->attach_defaults($col_but, 1, 2, 1, 2);
( run in 3.226 seconds using v1.01-cache-2.11-cpan-f56aa216473 )