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

Hans-Christoph Steiner hans at at.or.at
Wed Nov 18 19:29:40 CET 2009


Could you post the full pd.tk and the version of Pd its it supposed to  
work with?  Also:

- I attached a quick stab at turning your scrollbar logic into a 0.43  
GUI plugin.  It doesn't work because your code relies on Pd-extended  
0.42 things, but if you make your algorithm into a plugin using this  
framework, then people can just drop the file into the pd/startup  
folder to use your algorithm.

- I created a wiki page to document this whole process, please add any  
tests that you can think of here:
http://puredata.info/dev/ScrollBarLogic

.hc

-------------- next part --------------
A non-text attachment was scrubbed...
Name: icoscroll-plugin.tcl
Type: application/octet-stream
Size: 4010 bytes
Desc: not available
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20091118/0d87decb/attachment.obj>
-------------- next part --------------


On Nov 18, 2009, at 10:37 AM, Ivica Ico Bukvic wrote:

> OK, try the one below instead (with ::scroll call removed). Also,  
> plase
> don't forget to do the followign test with large graphics objects and
> test scrollbar behavior:
>
> 1) create iemlib's number2
> 2) adjust its height to 60 and its font size to 50
> 3) drag it as far to the top as possible and what you will likely
> discover is that it fails to reach the top corner *or* creates
> scrollbars even though the object fits comfortably within the window.
> This is not the case AFAIK with the version below.
>
> Ico
>
>
> 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"
>
> 			#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]
> }
>
>



----------------------------------------------------------------------------

"Making boring techno music is really easy with modern tools," he
says, "but with live coding, boring techno is much harder." - Chris  
McCormick






More information about the Pd-dev mailing list