#!/usr/local/bin/wish

button .reset -text "reset" -command Reset
label .l1 -text "dimensions:" 
entry .he -width 3 -textvariable h
set h 6
label .l2 -text "x"
entry .wi -width 3 -textvariable w
set w 6
grid .reset -row 0 -column 0 -columnspan 2
grid .l1 -row 0 -column 2 -columnspan 3
grid .he -row 0 -column 5
grid .l2 -row 0 -column 6
grid .wi -row 0 -column 7

for {set i 1} {$i <= $h} {incr i} {
for {set j 1} {$j <= $w} {incr j} {
set v($i,$j) 0
}}

radiobutton .rec -text rectangle -variable s -value r
radiobutton .cyl -text cylinder -variable s -value c
radiobutton .tor -text torus -variable s -value t
radiobutton .mob -text moebius -variable s -value m
set s "r"
button .dismiss -text "dismiss" -command "destroy ."
grid .rec -row 1 -column 0 -columnspan 3
grid .cyl -row 1 -column 3 -columnspan 3
grid .tor -row 1 -column 6 -columnspan 3
grid .mob -row 1 -column 9 -columnspan 3
grid .dismiss -row 0 -column 8 -columnspan 3

proc Reset {} {
global h w v s
for {set i 1} {$i <= 20} {incr i} {
for {set j 1} {$j <= 20} {incr j} {
if {[winfo exists .b{$i}{$j}]} {
destroy .b{$i}{$j}
}
}}
for {set i 1} {$i <= $h} {incr i} {
for {set j 1} {$j <= $w} {incr j} {
button .b{$i}{$j} -textvariable v($i,$j) -command "Do $i $j"
set v($i,$j) 0
grid .b{$i}{$j} -row [expr $i + 1] -column [expr $j -1]
}}
}

proc Do {a b} {
global v h w s
set v($a,$b) [expr 1 - $v($a,$b)]
if {$a > 1} {
set v([expr $a - 1],$b) [expr 1 - $v([expr $a - 1],$b)]
} elseif {$s == "c" || $s == "t"} {
set v($h,$b) [expr 1 - $v($h,$b)]
} elseif {$s == "m"} {
set v($h,[expr $w - $b + 1]) [expr 1 - $v($h,[expr $w - $b + 1])]
}
if {$a < $h} {
set v([expr $a + 1],$b) [expr 1 - $v([expr $a + 1],$b)]
} elseif {$s == "c" || $s == "t"} {
set v(1,$b) [expr 1 - $v(1,$b)]
} elseif {$s == "m"} {
set v(1,[expr $w - $b + 1]) [expr 1 - $v(1,[expr $w - $b + 1])]
}
if {$b > 1} {
set v($a,[expr $b - 1]) [expr 1 - $v($a,[expr $b - 1])]
} elseif {$s == "t"} {
set v($a,$w)  [expr 1 - $v($a,$w)]
}
if {$b < $w} {
set v($a,[expr $b + 1]) [expr 1 - $v($a,[expr $b + 1])]
} elseif {$s == "t"} {
set v($a,1) [expr 1 -$v($a,1)]
}
}

Reset
