toolbar

TCL/TK UseCase2



Abstract : Sets up the floating tool bar window. Comments : New tools can be added to the tool bar without much effect at all. All you'll need to do is update the tools list variable with the tool type, button color, bitmap name, and description. (Bitmaps are stored in the /bitmaps folder of the code directory and you 'll have to create one there ....note: optional edge bitmaps are already there but aren't in use at this time.) Everything is then placed into the window and event bindings are automagically created and changed when the tool is selected and deselected. The program is runable....but the tool won't function. To add functionality to the new tool, make action procedures in the bindings.tcl file. Pay close attention to procedure names and how they are are callled. Action event procedures are called by testing to see if a procedure exists with a name relating to the event that took place (like mouse click) and which tool was selected at the time (mouse click with vertex tool.) If the procedure doesn't exist nothing happens. This is pretty slick and will allow you to add functionally to your new tool easily and quickly.
set INCLUDE "bitmaps" set style flat # # Array for all tools on the tool bar # Fields are { } set tools { \ { Select black select.xbm } \ { Constr blue constr.xbm } \ { Alter blue alter.xbm } \ { Req_Constr_Edge blue edgereq.xbm } \ { Req_Alter_Edge blue edgealtreq.xbm } \ { Rename red rename.xbm } \ { Delete red trash.xbm } \ } # { Opt_Constr_Edge blue edgeopt.xbm } \ # { Opt_Alter_Edge blue edgealtopt.xbm } \ # # Set initial value here set tool_type Select # # createButton # Procedure to create a tool button # Parameters: createButton proc createButton {name color file} { global style global INCLUDE global tool_type radiobutton .toolwin.toolframe.b_$name \ -relief $style \ -variable tool_type \ -value $name \ -foreground $color \ -bitmap "@$INCLUDE/$file" \ -command "set tool_type $name" } proc toolChanged {name} { puts "ToolChanged called '$name'" global tool_type set tool_type $name if {[info procs onBtn1Down_Node_$name] != ""} { .area bind node "onBtn1Down_Node_$name %x %y" } else { .area bind node {} } if {[info procs onBtn1Up_Node_$name] != ""} { .area bind node "onBtn1Up_Node_$name %x %y" } else { .area bind node {} } if {[info procs onBtn1Move_Node_$name] != ""} { .area bind node "onBtn1Move_Node_$name %x %y" } else { .area bind node {} } if {[info procs onBtn1Down_Canvas_$name] != ""} { bind .area "onBtn1Down_Canvas_$name %x %y" } else { bind .area {} } if {[info procs onBtn1Up_Canvas_$name] != ""} { bind .area "onBtn1Up_Canvas_$name %x %y" } else { bind .area {} } if {[info procs onBtn1Move_Canvas_$name] != ""} { bind .area "onBtn1Move_Canvas_$name %x %y" } else { bind .area {} } if {[info procs onMoving_Canvas_$name] != ""} { bind .area "onMoving_Canvas_$name %x %y" } else { bind .area {} } } # # bindButton # Procedure to set up appropriate bindings for the radio buttons # Parameters: bindButton proc bindButton {name} { bind .toolwin.toolframe.b_$name \ "shoutit $name" bind .toolwin.toolframe.b_$name \ "toolChanged $name" } # # setup_tools # Procedure to set up the tool bar proc init_tools {} { global tool_type global tools global style # Make toplevel toplevel .toolwin wm transient .toolwin . frame .toolwin.toolframe # Make the buttons foreach i $tools { createButton [lindex $i 0] [lindex $i 1] [lindex $i 2] } # Setup the binding foreach i $tools { bindButton [lindex $i 0] } #Testing stuff #button .toolwin.toolframe.test1 -text "Tool?" -command shoutit #button .toolwin.toolframe.test2 -text "Quit!" -command exit text .toolwin.toolframe.text -height 3 -width 15 -background white # Pack the buttons pack .toolwin.toolframe foreach i $tools { set name [lindex $i 0] pack .toolwin.toolframe.b_$name -fill x } pack .toolwin.toolframe.text -fill x } proc flashy { speed } { global tool_type global tools foreach i $tools { set tool_type [lindex $i 0] after $speed update } for {set i [expr [llength $tools] - 2 ]} \ {$i >= 0} {incr i -1} { set j [lindex $tools $i] set tool_type [lindex $j 0] after $speed update } } proc shoutit {passing} { .toolwin.toolframe.text delete 1.0 end .toolwin.toolframe.text insert end "This is the\n$passing\ntOOl." } proc setup_tools {} { init_tools update flashy 50 bind .toolwin { shoutit $tool_type } }