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;