All pastes #368926 Raw Edit

pianoroll

public text v1 · immutable
#368926 ·published 2007-02-23 13:36 UTC
rendered paste body
# see http://wiki.tcl.tk/11198
console show
namespace eval ::xt {
    variable grid_oh
	variable grid_ow
	variable notes
	variable k
	set k 0
	array set notes {}
	array set grid_oh {}
	array set grid_ow {}
	
    proc proll_draw {w target x y type div size {cmd ""}} {
	variable grid_oh
	variable grid_ow
	variable notes
	variable k
    set x [$w canvasx $x]
    set y [$w canvasy $y]
    switch -- $type {
	left {
	for {set i 0} {$i <= [expr $div - 1]} {incr i} {
	    set j [expr $i + 1]
	    if {$grid_oh($i) <=$x && $x <=$grid_oh($j)} {
		set x1 $grid_oh($i)
		set x2 $grid_oh($j)
		}
	    if {$grid_ow($i) <=$y && $y <=$grid_ow($j)} {
		set y1 $grid_ow($i)
		set y2 $grid_ow($j)
		}
		}
	$w create rectangle $x1 $y1 $x2 $y2 -fill red -tags $x1$y1
	set k [expr $k + 1]
	set notes($k) $x$y
	pd "$target.rp _cb [array size notes] $notes($k);"
        }
	right {
	for {set i 0} {$i <= [expr $div - 1]} {incr i} {
	    set j [expr $i + 1]
	    if {$grid_oh($i) <=$x && $x <=$grid_oh($j)} {
		set x1 $grid_oh($i)
		set x2 $grid_oh($j)
		}
	    if {$grid_ow($i) <=$y && $y <=$grid_ow($j)} {
		set y1 $grid_ow($i)
		set y2 $grid_ow($j)
		}
		}
	    $w delete $x1$y1
		unset notes($k)
	}
	motion {
	    set item [$w find withtag rect]
	    foreach {x0 y0 x1 y1} [$w coords $item] break
	    $w coords $item $x0 $y0 $x $y
	}
	release {
	    uplevel \#0 [lappend cmd [$w coords [$w find withtag rect]]]
	}
    }
#	set rs [expr $size / 2]
#	$w coords ${target}sqr [expr $x - $rs] [expr $y - $rs] [expr $x + $rs] [expr $y + $rs]
	
 }

    proc proll_new {path target w h bg fg ln div shape size} {
	variable grid_oh
	variable grid_ow

	if {[winfo exists $path.proll] != 1} {
	    canvas $path.proll -bg $bg
	    $path configure -width $w -height $h
	    place $path.proll -anchor nw -relwidth 1 -relheight 1
#	    $path.proll create $shape 0 0 0 0 -fill $fg -tags ${target}sqr
#	    proll_click $path.proll $target 1 0.5 0.5 $h $w $size
	    proll_lines $path.proll $target $div $w $h $ln
	    bind $path.proll <Double-1> "::xt::proll_draw %W $target %x %y left  $div $size"
	    bind $path.proll <3> "::xt::proll_draw %W $target %x %y right $div $size"
#	    bind $path.proll <B1-Motion> "::xt::proll_draw %W $target %x %y motion $div $size"
#		bind $path.proll <ButtonRelease-1> "::xt::proll_draw %W $target %x %y release $size $ln {xt::proll_diag %W $target} "
	}
    }
    proc proll_lines {w target lines ww hw color} {
	variable grid_oh
	variable grid_ow
	set grid_oh(0) 0
	set grid_ow(0) 0
	$w delete prolllines
	for {set x 1} {$x <= $lines} {incr x} {
	    if {$lines < 64} {
		set oh [expr $hw.0 * $x.0 / $lines.0]
		set ow [expr $ww.0 * $x.0 / $lines.0]
		set grid_oh($x) $oh
		set grid_ow($x) $ow

	      	$w create line $ow 0 $ow $hw -fill $color -tags prolllines
	      	$w create line 0 $oh $ww $oh -fill $color -tags prolllines
	    }
	}
	$w raise ${target}sqr
    }
}

#> proll frame
#. -bd 3
#. #w 128 #h 128 #x 0.5 #y 0.5
#. #fg red #bg blue #ln yellow
#. #shape rectangle #size 12 #div 12
#. @list ::xt::proll_draw .-.proll .| .#x .#y .#h .#w .#size

::xt::proll_new .- .| .#w .#h .#bg .#fg .#ln .#div .#shape .#size