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
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:
- create iemlib's number2
- adjust its height to 60 and its font size to 50
- 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