[PD-dev] much better scrolling algorithm (pd-extended 0.42.5)

Ivica Ico Bukvic ico at vt.edu
Sat Oct 31 20:34:06 CET 2009


Below is relevant excerpt that IMHO is much better scrolling algorithm.
It has been tested only on Linux so far but there is no reason why it
should not work on other platforms. Basically, now the whole canvas
translates as necessary. Therefore,

1) dragging a single object away from 0 0 coordinates will never spawn a
scrollbar (since we don't care how far someone goes away from
center--theoretically their whole patch could be at -30000 to -29800 (x1
x2). That said, I am not sure if the thing will crash if you go beyond
1.0e30 either direction but I suspect it will take a long while before
you get there :-)
2) scrollbars appear/disappear logically, (e.g. only when two or more
objects are far enough from each other not to fit on the visible portion
of the canvas)
3) and perhaps most importantly since text (particularly larger text
commonly used for iemlib gui elements) generates incorrect reports from
the "bbox all" call (e.g. try creating a number2 with a height 80 and
notice how you are never able to drag it all the way to the top of the
canvas without invoking the Y-axis scrollbar even though your text might
be font 10; larger font sizes make things even worse). So now finally I
can create compact windows without scrollbars using iemlib objects.

Optionally, if you wish to use hacked pd.tk version (made for
pd-extended 0.42.5). You will also have an option to disable scrollbars,
menu, alter background color, toggle ontop, and disable resize, *per
patcher*. I found this to be also rather useful for GUI creation.
Attached with the new pd.tk are supporting abstractions.

Below is relevant code for points 1-3 from the current pd.tk in hope it
will find its way into 0.43 gui rewrite.

proc pdtk_canvas_getscroll {name} {
    global pdtk_canvas_mouseup_name
    global pdtk_canvas_mouseup_xminval
    global pdtk_canvas_mouseup_xmaxval
    global pdtk_canvas_mouseup_yminval
    global pdtk_canvas_mouseup_ymaxval

	#bbox all is not accurate enough
	#particularly when using large iemlib objects
	#so we calculate canvas size manually
    #set size [$name bbox all]

	#borrowed from http://wiki.tcl.tk/4844
	set x1 1.0e30; set x2 -1.0e30 ;
	set y1 1.0e30; set y2 -1.0e30 ;
	foreach item [$name find all] {
	    switch -exact [$name type $item] {
			"arc" -
			"line" -
			"oval" -
			"polygon" -
			"rectangle" {
				set coords [$name coords $item]
				foreach {x y} $coords {
					if { $x < $x1 } {set x1 $x}
					if { $x > $x2 } {set x2 $x}
					if { $y < $y1 } {set y1 $y}
					if { $y > $y2 } {set y2 $y}
				}
			}
	    }
	}
	
	if {$x1 != 1.0e30} {

		set xminval 0
		set yminval 0
		set xmaxval 100
		set ymaxval 20
		#set x1 [lindex $size 0]
		#set x2 [lindex $size 2]
		#set y1 [lindex $size 1]
		#set y2 [lindex $size 3]

		#pdtk_post "bbox all: $x1 $x2 $y1 $y2\n"
		#pdtk_post "new bbox all: $xbox1 $xbox2 $ybox1 $ybox2\n"

		#these work much better than the ones below
		#they allow for intelligent translation of the canvas
		#rather than introducing redundant scrollbars
		set xminval $x1
		set yminval $y1

		set xmaxval [expr $x1+($x2-$x1)]
		set ymaxval [expr $y1+($y2-$y1)]

		#if {$x1 < $xminval} {set xminval $x1}
		#if {$y1 < $yminval} {set yminval $y1}

		#if {$x2 > $xmaxval} {set xmaxval $x2}
		#if {$y2 > $ymaxval} {set ymaxval $y2}

		#pdtk_post "$xminval $xmaxval $yminval $ymaxval\n"

		set parentname [winfo parent $name]
		set winwidth [winfo width $parentname]
		set winheight [winfo height $parentname]

		set canvaswidth [ expr {abs($xmaxval-$xminval)} ]
		set canvasheight [ expr {abs($ymaxval-$yminval)} ]
		#set canvaswidth [ expr {abs($xminval)+$xmaxval} ]
		#set canvasheight [ expr {abs($yminval)+$ymaxval} ]

		#pdtk_post "$canvaswidth $canvasheight\n"

		#pdtk_post "$parentname [$parentname.scroll cget -state]\n"
		if {$::scroll($parentname) == 1} {
			#pdtk_post "scroll=yes $winwidth $canvaswidth\n"
			if {$winwidth > $canvaswidth} {pack forget $parentname.scrollhort}
			if {$winheight > $canvasheight} {pack forget $parentname.scrollvert}
			if {$winwidth < $canvaswidth} {pack $parentname.scrollhort -fill x \
					                           -side bottom -before $parentname.c}
			if {$winheight < $canvasheight} {pack $parentname.scrollvert -fill y
\
					                             -side right -before $parentname.c}
		}
	
		if {$pdtk_canvas_mouseup_name != $name || \
				$pdtk_canvas_mouseup_xminval != $xminval || \
				$pdtk_canvas_mouseup_xmaxval != $xmaxval || \
				$pdtk_canvas_mouseup_yminval != $yminval || \
				$pdtk_canvas_mouseup_ymaxval != $ymaxval } {
		
			set newsize "$xminval $yminval $xmaxval $ymaxval"
			$name configure -scrollregion $newsize
			set pdtk_canvas_mouseup_name $name
			set pdtk_canvas_mouseup_xminval $xminval
			set pdtk_canvas_mouseup_xmaxval $xmaxval
			set pdtk_canvas_mouseup_yminval $yminval
			set pdtk_canvas_mouseup_ymaxval $ymaxval
		}
	}
    pdtk_canvas_checkgeometry [canvastosym $name]
}

Best wishes,

Ico
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pd.tk_and_abstractions.tar.gz
Type: application/x-compressed-tar
Size: 44433 bytes
Desc: not available
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20091031/1fc0595f/attachment.bin>


More information about the Pd-dev mailing list