[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