use strict; use warnings; package SuKoDo; our $VERSION = 0.05; our $NAME = "SoKuDo"; our $icon = 'wxwin.ico'; our $frame; our %temp; use Wx qw( wxTOP wxLEFT wxALIGN_CENTRE wxALIGN_CENTER_VERTICAL wxGROW wxVERTICAL wxHORIZONTAL wxLI_VERTICAL wxLI_HORIZONTAL wxST_NO_AUTORESIZE wxNO_FULL_REPAINT_ON_RESIZE wxSYSTEM_MENU wxCAPTION wxMINIMIZE_BOX wxCLOSE_BOX wxBITMAP_TYPE_ICO ); use base qw(Wx::App); use Wx::Event qw( EVT_MENU EVT_LEFT_DOWN EVT_RIGHT_DOWN ); sub OnInit { $frame = Wx::Frame->new ( undef, -1, " $NAME ", [-1,-1],[-1,-1], wxNO_FULL_REPAINT_ON_RESIZE | wxSYSTEM_MENU | wxCAPTION | wxMINIMIZE_BOX | wxCLOSE_BOX ); # set icon Wx::InitAllImageHandlers(); $frame->SetIcon( Wx::Icon->new($icon, wxBITMAP_TYPE_ICO) ) if -e $icon; # menubar my $bar = Wx::MenuBar->new(1); my $menu_game = Wx::Menu->new(); $menu_game->Append(1000,'New',' random new game'); $menu_game->Append(1001,'Open'); $menu_game->Append(1003,'Save'); $menu_game->Append(1004,'Exit'); my $menu_rules = Wx::Menu->new(); $menu_rules->AppendCheckItem(2000,'Hints allowed'); my $menu_help = Wx::Menu->new(); $menu_help->Append(3000,'Hint'); $menu_help->Append(3001,'How To ...'); $menu_help->Append(3002,'Info ...'); $bar->Append($menu_game, 'Game'); $bar->Append($menu_rules,'Rules'); $bar->Append($menu_help, 'Help'); $frame->SetMenuBar($bar); # context menu my $num_selector = Wx::Menu->new(); my $num_menu_id = 10000; for (0..9){ $num_selector->Append($num_menu_id+$_,$_); eval 'EVT_MENU($frame, '.($num_menu_id+$_).", sub{set_current_value($_)})"; } $num_selector->Append(10010,'?'); EVT_MENU($frame, 10010, sub{ set_current_value('?') } ); # statusbar my $sb = $frame->CreateStatusBar(1); $sb->SetFieldsCount(1); $sb->SetStatusWidths( -1 ); $frame->SetStatusBarPane(0); #$sb->SetStatusText(' welcome',0); my $panel = Wx::Panel->new( $frame, -1); my (@cf, $cf, $sl, @h_sizer, $hs); #char field, current field my $v_sizer = Wx::BoxSizer->new(wxVERTICAL); $v_sizer->Add(Wx::StaticLine->new($panel, -1,[-1,-1], [-1,3]), 0, wxTOP|wxGROW, 0); for my $y (1..9){ $hs = $h_sizer[$y] = Wx::BoxSizer->new(wxHORIZONTAL); $hs->Add(Wx::StaticLine->new($panel, -1,[-1,-1], [3,-1]), 0, wxLEFT|wxGROW, 0); for my $x (1..9){ $cf = $cf[$x][$y] = Wx::StaticText->new ($panel, -1, '?', [-1,-1], [16,16], wxALIGN_CENTRE|wxST_NO_AUTORESIZE); EVT_LEFT_DOWN ( $cf[$x][$y], sub{ my ($widget, $event) = @_; set_current_field($x, $y); $widget->PopupMenu($num_selector, $event->GetX, $event->GetY); } ); EVT_RIGHT_DOWN( $cf, sub { status_msg($x.$y) } ); $hs->Add($cf, 0, wxLEFT, 0); if ($x % 3) {$sl = Wx::StaticLine->new($panel, -1,[-1,-1],[1,-1]) } else {$sl = Wx::StaticLine->new($panel, -1,[-1,-1],[3,-1]) } $hs->Add($sl, 0, wxLEFT|wxGROW, 0); } $v_sizer->Add($hs, 0, wxTOP, 0); if ($y % 3) {$sl = Wx::StaticLine->new($panel, -1, [-1,-1], [-1,1]) } else {$sl = Wx::StaticLine->new($panel, -1, [-1,-1], [-1,3]) } $v_sizer->Add($sl, 0, wxTOP|wxGROW, 0); } $frame->{'num_field'} = \@cf; $panel->SetSizer($v_sizer); my $m_sizer = Wx::BoxSizer->new(wxHORIZONTAL); $m_sizer->Add($panel, 0, wxTOP|wxGROW, 0); $frame->SetSizer($m_sizer); $frame->SetAutoLayout(1); $frame->Fit(); status_msg('welcome to version '.$VERSION); $frame->Show(1); } sub status_msg { my $msg = shift; $frame->SetStatusText( " $msg", 0); } sub set_current_field{ my $x = shift; my $y = shift; $temp{'current_field'}{'x'} = $x; $temp{'current_field'}{'y'} = $y; $temp{'current_field'}{'ref'} = $frame->{'num_field'}[$x][$y]; } sub set_current_value{ my $new = shift; my $c = $temp{'current_field'}; my $old = $c->{'ref'}->GetLabel; $c->{'ref'}->SetLabel($new); status_msg("field [$c->{y},$c->{x}] set from $old to $new"); } package main; SuKoDo->new->MainLoop;