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
Please see attached. This one should work seamlessly on pd-extended 0.42.5 with Linux (it has *not* been tested with other platforms even though the basic premise of the redesign is that it should).
Ico
On Nov 18, 2009, at 10:47 AM, Ivica Ico Bukvic wrote:
Please see attached. This one should work seamlessly on pd-extended 0.42.5 with Linux (it has *not* been tested with other platforms even though the basic premise of the redesign is that it should).
Ico <pdtk.tar.gz>
FYI, it doesn't work on Mac OS X because it requires 8.5 and ttk, so this couldn't be included in vanilla since Miller wants to continue to support 8.3, and it couldn't be included in Pd-extended until 0.43 since 0.42 doesn't work on Mac OS X with 8.5
Error in startup script: invalid command name "ttk::style" while executing "ttk::style configure IOErrorOn.TButton -background "#dd2222"" (file "/Applications/Pd-0.42.5-extended-20091112.app/Contents/ Resources/Scripts/AppMain.tcl" line 416)
.hc
----------------------------------------------------------------------------
I hate it when they say, "He gave his life for his country." Nobody gives their life for anything. We steal the lives of these kids. - Admiral Gene LeRocque
On Fri, 27 Nov 2009, Hans-Christoph Steiner wrote:
FYI, it doesn't work on Mac OS X because it requires 8.5 and ttk, so this couldn't be included in vanilla since Miller wants to continue to support 8.3, and it couldn't be included in Pd-extended until 0.43 since 0.42 doesn't work on Mac OS X with 8.5
if {$::tk_version >= 8.5} ?
_ _ __ ___ _____ ________ _____________ _____________________ ... | Mathieu Bouchard, Montréal, Québec. téléphone: +1.514.383.3801
On Fri, 2009-11-27 at 22:15 -0500, Mathieu Bouchard wrote:
On Fri, 27 Nov 2009, Hans-Christoph Steiner wrote:
FYI, it doesn't work on Mac OS X because it requires 8.5 and ttk, so this couldn't be included in vanilla since Miller wants to continue to support 8.3, and it couldn't be included in Pd-extended until 0.43 since 0.42 doesn't work on Mac OS X with 8.5
if {$::tk_version >= 8.5} ?
Actually, it's even simpler than that. Most of the ttk calls in my version of pd.tk are ctually old tk calls that are run through match_linux_wm function which checks for proper pd_nt variable and tk version and if necessary renames the call to comparable ttk call and adds customization options. I used the term most instead of all due to errors Hans has reported which suggest that somewhere along the way I obviously forgot to do apply the wrapper to all ttk calls.
So, original line in pd.tk looking like: list frame $name.buttonframe
is converted to: match_linux_wm [list frame $name.buttonframe]
with the match_linux_wm being: proc match_linux_wm {list} { global pd_nt linux_wm_bgcolor linux_wm_hlcolor if { [info tclversion] >= 8.5 && $pd_nt == 0 } { if {[lsearch -regexp $list ::] == -1} { if {[lindex $list 0] != "button" \ && [lindex $list 0] != "checkbutton" \ && [lindex $list 0] != "radiobutton" \ && [lindex $list 0] != "entry" \ && [lindex $list 0] != "scrollbar"} { lappend list -bg $linux_wm_bgcolor } if {[lindex $list 0] == "listbox" \ || [lindex $list 0] == "text"} {
lappend list -bg white -highlightcolor $linux_wm_hlcolor } if {[lindex $list 0] == "menu"} { lappend list -activebackground $linux_wm_hlcolor -bd 0 } #convert non-ttk objects to ttk objects if {[lindex $list 0] == "button" \ || [lindex $list 0] == "checkbutton" \ || [lindex $list 0] == "radiobutton" \ || [lindex $list 0] == "entry" \ || [lindex $list 0] == "scrollbar"} { set newlist [lreplace $list 0 0 ttk::[lindex $list 0]] } } } if {[info exists newlist]} { eval $newlist } else { eval $list } }
So, theoretically once all calls are properly wrapped this is the only place that the checks need to be done properly and you're done. Consequently, the new pd.tk should in theory visually affect only linux users while making no difference whatsoever on other platforms (apart from scrolling algorithm and other logic-oriented fixes I've made along the way).
Ico