Could you post the full 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:


Attachment: icoscroll-plugin.tcl
Description: Binary data

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.


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
        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 
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
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

Pd-dev mailing list

Reply via email to