# first the setup stuff (is this the right place for it?) # LATER ask for adding something of the sort to pd.tk: bind Canvas <1> {+focus %W} proc ::toxy::itemleave {path target varname} { if {[catch {$path get} ::toxy::itemvalue] == 0} { set $varname $::toxy::itemvalue # LATER try sending only if changed pd $target.rp _value $::toxy::itemvalue \; } } proc ::toxy::itemvis {tkclass path target name varname cvpath px py} { set ::toxy::itemfailure [catch {$tkclass $path} ::toxy::itemerrmess] if {$::toxy::itemfailure} { pd $target.rp _failure $::toxy::itemerrmess \; } else { if {[info exists ::toxy::itemoptions]} { catch {eval $path config $::toxy::itemoptions} unset ::toxy::itemoptions } $cvpath create window $px $py \ -anchor nw -window $path -tags [concat toxy$name $target] if {[info exists ::toxy::masterinits]} { catch {eval $::toxy::masterinits} unset ::toxy::masterinits } if {[info exists ::toxy::typeinits]} { catch {eval $::toxy::typeinits} unset ::toxy::typeinits } if {[info exists ::toxy::iteminits]} { catch {eval $::toxy::iteminits} unset ::toxy::iteminits } pd $target.rp _config $target.rp [$path cget -bg] \ [winfo reqwidth $path] [winfo reqheight $path] \ [catch {$path config -state normal}]\; # LATER think where to plug this in bind $path [concat ::toxy::itemleave $path $target $varname] if {[info exists $varname]} { catch {eval $path set $$varname} unset $varname } } } proc ::toxy::popup {path target remote entries args} { eval {menu $path.pop} $args set i 1 foreach e $entries { $path.pop add command -label [lindex $e 0] \ -command [concat ::toxy::callback $target \ -text [lindex $e [expr {[llength $e] > 1}]] \; \ ::toxy::callback $remote $i] incr i } } proc ::toxy::kb {path target remote noctaves size} { set lft [expr {round(5 * $size)}] set top [expr {5 * $size}] set bot [expr {100 * $size}] set dx [expr {round(17 * $size)}] set wid [expr {$dx - $size * .5}] set blbot [expr {$bot * .65}] $path config -height [expr {$bot + $top}] \ -width [expr {$dx * ($noctaves * 7 + 1) + $lft * 2 - 1}] for {set octave 0} {$octave <= $noctaves} {incr octave} { set prevkey 0 foreach key {0 2 4 5 7 9 11} { set ndx [expr $octave * 12 + $key] set id [$path create rect $lft $top \ [expr {$lft + $wid}] $bot -fill white -tags $path.$ndx] $path bind $id <1> [concat ::toxy::kbset \ $path $target $remote $ndx] if {$key - $prevkey > 1} { incr ndx -1 set x [expr {$lft - $wid * .22}] set id [$path create rect $x $top [expr {$x + $wid * .44}] \ $blbot -fill black -tags $path.$ndx] $path bind $id <1> [concat ::toxy::kbset \ $path $target $remote $ndx] } set prevkey $key incr lft $dx if {$octave == $noctaves && $key == 0} break } } set ::toxy::kbval($target) 0 set ::toxy::kbcol($target) white $path itemconfig $path.0 -fill grey } proc ::toxy::kbout {path target remote} { ::toxy::callback $target _cb $::toxy::kbval($target) if {$remote != "."} {::toxy::callback $remote $::toxy::kbval($target)} } proc ::toxy::kbset {path target remote value} { $path itemconfig $path.$::toxy::kbval($target) \ -fill $::toxy::kbcol($target) set ::toxy::kbval($target) $value set ::toxy::kbcol($target) [lindex [$path itemconfig $path.$value -fill] 4] $path itemconfig $path.$value -fill grey ::toxy::kbout $path $target $remote } # the default initializer #> default # pdtk_canvas_mouseup is a hack, which we must call anyway bind .- { eval .<|_inout 1.> pdtk_canvas_mouseup .^.c [expr %x + [winfo x %W]] [expr %y + [winfo y %W]] %b } bind .- <1> .<|_click %x %y %b 0.> bind .- <3> .<|_click %x %y %b 8.> bind .- .<|_motion %x %y.> bind .- .<|_inout 1.> bind .- .<|_inout 0.> #> bang button #. -image ::toxy::img::empty -command .<.> #. -bg pink -activebackground red -width 50 -height 50 #. @bang .- flash .: .- invoke #> float scale #. -command .<.> -bg pink -activebackground red -length 200 #. @float .- set .#1 #> symbol entry #. -bg pink -font .(helvetica 24.) -width 16 #. @symbol .- delete 0 end .: .- insert 0 .#1 bind .- {eval .<[.- get].>; focus .^.c} #> kb canvas #. -bg yellow -cursor hand1 #. #oct 4 #size .75 #. @bang ::toxy::kbout .- .| . #. @float ::toxy::kbset .- .| . .#1 ::toxy::kb .- .| . .#oct .#size # undo the "bind Canvas <1> {+focus %W}" in the setup part above bind .- {focus .^.c}