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 )