Goo-Canvas

 view release on metacpan or  search on metacpan

bin/perltetris.pl  view on Meta::CPAN

$window->show_all;

if ( defined $after_load_function
 && ref $after_load_function eq 'CODE' ) {
    $after_load_function->();
}

Gtk2->main;

sub END {
    write_history();
}

sub setting {
    return if $game_start;
    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 = Gtk2::Label->new(gettext("Start level"));
    my $but = Gtk2::SpinButton->new_with_range(0, 10, 1);
    $but->set_value($Config{start_level});
    $table->attach_defaults($label, 0, 1, 0, 1);
    $table->attach_defaults($but, 1, 2, 0, 1);
    $vbox->add($table);
    $vbox->show_all();
    score(0);
    my $response = $dia->run;
    if ( $response eq 'ok' ) {
        $Config{start_level} = $but->get_value;
        $level = $Config{start_level};
        update_label();
    }
    $dia->destroy;
}

sub about {
    return if $game_start;
    my $dia = Gtk2::AboutDialog->new();
    $dia->set_authors(gettext('Ye Wenbin'));
    $dia->run;
    $dia->destroy;
}

sub stop_game {
    if ( $timer ) {
        Glib::Source->remove($timer);
    }
    remove_heading();
    ($score, $lines, $level) = (0, 0, $Config{start_level});
    update_label();
    $canvas->{table}->clear;
    $canvas->{preview}->clear;
    $game_start = 0;
}

sub create_menu {
    my $menu_bar = Gtk2::MenuBar->new;
    # File
    my $file_menu = Gtk2::Menu->new;
    # |- New
    my $new_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-new', undef);
    $new_menuitem->signal_connect('activate' => \&new_game);
    $file_menu->append($new_menuitem);
    # |- Stop
    my $stop_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-close', undef);
    $stop_menuitem->signal_connect('activate' => \&stop_game);
    $file_menu->append($stop_menuitem);
    # |- Rank
    my $rank_menuitem = Gtk2::MenuItem->new_with_mnemonic(gettext('_Rank'));
    $rank_menuitem->signal_connect( 'activate' => sub { rank_dia() } );
    $file_menu->append($rank_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 create_canvas {
    my $canvas = Goo::Canvas->new;
    $canvas->set_size_request(330, 400);
    my $root = $canvas->get_root_item;
    my ($rows, $cols) = ($Config{rows}, $Config{cols});
    my $offset = [ 10, 10 ];
    my $border = 1;
    my $padding = 16;
    
    $canvas->{table} = Tetris::Table->new(
        $root, $offset->[0], $offset->[1],
        -columns => $cols,
        -rows => $rows,
        -border => $border,
    );
    my $px = $offset->[0]+($cols+( $border ? 2 : 0) )*Tetris::Cell::SIZE + $padding;
    $canvas->{preview} = Tetris::Table->new(
        $root, $px, $offset->[1],
        -columns => 4,
        -rows => 4,
        -border => $border,
    );
    use_keymap( $window, $Config{keybindings} );
    my $text_group = Goo::Canvas::Group->new($root);
    $text_group->translate( $px, $offset->[1] + 7 * Tetris::Cell::SIZE );
    my $text_spacing = 20;
    my @label = (
        Gtk2::Label->new(make_string('Scores', $score)),
        Gtk2::Label->new(make_string('Lines', $lines)),
        Gtk2::Label->new(make_string('Level', $level)),
    );
    foreach ( 0..$#label ) {
        $label[$_]->set_alignment(0, 0);
        Goo::Canvas::Widget->new(
            $text_group, $label[$_], 0, $text_spacing*$_,
            100, 20,
        );
    }
    $canvas->{labels} = \@label;
    # $canvas->{labels} = [
    #     Goo::Canvas::Text->new(
    #         $text_group, make_string('Scores', $score), 0, 0, -1, 'nw',
    #     ),
    #     Goo::Canvas::Text->new(
    #         $text_group, make_string("Lines", $lines), 0, $text_spacing, -1, 'nw',
    #     ),
    #     Goo::Canvas::Text->new(
    #         $text_group, make_string("Level", $level), 0, $text_spacing*2, -1, 'nw',
    #     )
    #     ];
    return $canvas;
}

sub make_string {
    my ($text, $num) = @_;



( run in 0.963 second using v1.01-cache-2.11-cpan-f56aa216473 )