Code Search for Developers
 
 
  

radiobutton.tcl from aMSN at Krugle


Show radiobutton.tcl syntax highlighted

package require snit

snit::widgetadaptor pixmapradiobutton {

	typevariable widgetlist
	typevariable loadimagecommand
	
	typevariable normal
	typevariable hover
	typevariable disabled

	typevariable normalpress
	typevariable hoverpress
	typevariable disabledpress

	typevariable selected

	option -activeforeground -configuremethod SetActiveForeground
	option -activefg -configuremethod SetActiveForeground
	option -command
	option -font -configuremethod SetFont
	option -foreground -configuremethod SetForeground
	option -fg -configuremethod SetForeground
	option -indicatoron -default 1 -configuremethod SetIndicatorOn
	option -offvalue
	option -onvalue
	option -state -default normal -configuremethod SetState
	option -takefocus -default 1
	option -text -configuremethod SetText
	option -variable


	typeconstructor {
		$type SetImageCommand "$type loadimage"
		$type reloadimages 1
	}

	constructor { args } {
		lappend widgetlist $self

		installhull using canvas -bg white -relief flat -highlightthickness 0

		$hull create image 0 0 -image $normal -disabledimage $disabled -anchor nw -tag button
		$hull create text 0 0 -anchor w -tag label
		$hull coords label [image width $normal] [expr [image height $normal] / 2]

		$self configure -variable [lindex $args [expr [lsearch $args -variable] + 1]]
		set selected($options(-variable)) ""

		$self configurelist $args
		$self UpdateVariable 0
		
		$hull configure -width [expr [$self MeasureText $options(-text) w] + [image width $normal]]
		
		set ih [image height $normal]
		set th [$self MeasureText $options(-text) h]
		if { $ih > $th } {
			$hull configure -height $ih
		} else {
			$hull configure -height $th
		}
			
		bind $self <Enter> "$self ButtonHovered"
		bind $self <Leave> "$self ButtonUnhovered"
		bind $self <Button-1> "$self select"
		bind $self <KeyPress-space> "$self select"
		bind $self <KeyPress-plus> "$self select"
		bind $self <KeyPress-equal> "$self select"
	}

	#////////////////////////////////////////////////////////////////
	# PUBLIC COMMANDS						/
	# deselect							/
	# flash								/
	# invoke								/
	# select								/
	# toggle								/
	#////////////////////////////////////////////////////////////////
	method invoke { } {
		if { $options(-state) != "disabled" } {
			eval $options(-command)
		}
	}

	method flash { } {
		if { $options(-state) != "disabled" } {
			after 250 $self toggle
			after 500 $self toggle
			after 750 $self toggle
			after 1000 $self toggle
		}
	}

	method select { } {
		if { $selected($options(-variable)) != $self } {
			if { $selected($options(-variable)) != "" } {
				$selected($options(-variable)) deselect
			}
			set selected($options(-variable)) $self
		}
		if { $options(-state) != "disabled" } {
			if { $options(-variable) != "" } {
				$self UpdateVariable $options(-onvalue)
			}
			$hull itemconfigure button -image $normalpress -disabledimage $disabledpress
			$self invoke
		}
	}

	method deselect { } {
		if { $options(-state) != "disabled" } {
			if { $options(-variable) != "" } {
				$self UpdateVariable $options(-offvalue)
			}
			$hull itemconfigure button -image $normal -disabledimage $disabled
		}
	}

	#////////////////////////////////////////////////////////
	# PRIVATE COMMANDS					/
	#////////////////////////////////////////////////////////
	method ButtonHovered { } {
		if { $options(-state) != "disabled" } {
			$self configure -state active
		}
	}
	
	method ButtonUnhovered { } {
		if { $options(-state) != "disabled" } {
			$self configure -state normal
		}
	}
	
	method SetActiveForeground { option value } {
		set options(-activeforeground) $value
		set options(-activefg) $value
		$hull itemconfigure label -activefill $value
	}
	
	method SetForeground { option value } {
		set options(-foreground) $value
		set options(-fg) $value
		$hull itemconfigure label -fill $value
	}
		
	method SetFont { option value } {
		set options(-font) $value
		$hull itemconfigure label -font $value
	}
	
	method SetIndicatorOn { option value } {
		set options(-indicatoron) $value
		if { !$value } {
			$hull delete button
			$hull coords label 0 [expr [image height $normal] / 2]
		} else {
			switch $selected($options(-variable)) {
				$self {
					$hull create image 0 0 -image $normalpress -disabledimage $disabledpress -anchor nw -tag button
				}
				default {
					$hull create image 0 0 -image $normal -disabledimage $disabled -anchor nw -tag button
				}
			}
			$hull coords label [image width $normal] [expr [image height $normal] / 2]
			switch $options(-state) {
				disabled { $hull itemconfigure button -state disabled }
				default { $hull itemconfigure button -state normal }
			}
		}
	}
	
	method SetState { option value } {
		set options(-state) $value
		switch $value {
			normal {
				if { $selected($options(-variable)) == $self } {
					$hull itemconfigure button -image $normalpress
				} else {
					$hull itemconfigure button -image $normal
				}
			}
			active {
				if { $selected($options(-variable)) == $self } {
					$hull itemconfigure button -image $hoverpress
				} else {
					$hull itemconfigure button -image $hover
				}
			}
			disabled {
				$hull itemconfigure button -state disabled
			}
		}
		
	}
	
	method SetText { option value } {
		set options(-text) $value
		$hull itemconfigure label -text $value
	}

	method UpdateVariable { value } {
		uplevel #0 "set $options(-variable) $value"
	}

	method MeasureText { text dimension } {
		if { $dimension == "w" } {
			if { $options(-font) != "" } {
				set idx [expr [string first "\n" $text] - 1] 
				if { $idx < 0 } { set idx end }
				set m [font measure $options(-font) -displayof $self [string range $text \
					0 $idx]]
				return $m
			} else {
				set idx [expr [string first "\n" $text] - 1] 
				if { $idx < 0 } { set idx end }
				set f [font create -family helvetica -size 12 -weight normal]
				set m [font measure $f -displayof $self [string range $text \
					0 $idx]]
				font delete $f
				return $m
			}
		} elseif { $dimension == "h" } {
			if { $options(-font) != "" } {
				#Get number of lines
				set n [$self NumberLines $text]
				#Multiply font size by no. lines and add gap between lines * (no. lines - 1).
				return [expr $n * [font configure $options(-font) -size] + (($n - 1) * 7)]
			} else {
				#Get number of lines
				set n [$self NumberLines $text]
				#Multiply font size by no. lines and add gap between lines * (no. lines - 1).
				return [expr ($n * 12) + (($n - 1) * 7)]
			}
		}
	}

	method NumberLines { string } {
		for { set n 0; set idx 0 } { [string first "\n" $string $idx] != -1} { incr n 1 } {
					set idx [expr [string first "\n" $string $idx] +1]
				}
		if { $n < 1 } { set n 1 }
		return $n
	}


	#/////////////////////////////////////////////////////

	#/////////////////////////////////////////////////////
	# Image (re)loading methods
	# 
	# 
	# 
	#/////////////////////////////////////////////////////
	
	typemethod loadimage { imagename } {
		return [image create photo -file $imagename.gif]
	}
	
	typemethod SetImageCommand { command } {
		set loadimagecommand $command
	}
	
	typemethod reloadimages { init } {
		if { !$init } {
			image delete $normal
			image delete $hover
			image delete $disabled
			image delete $normalpress
			image delete $hoverpress
			image delete $disabledpress
		}
	
		set normal [eval "$loadimagecommand radio"]
		set hover [eval "$loadimagecommand radiohover"]
		set disabled [eval "$loadimagecommand radiodisabled"]

		set normalpress [eval "$loadimagecommand radiopress"]
		set hoverpress [eval "$loadimagecommand radiohoverpress"]
		set disabledpress [eval "$loadimagecommand radiodisabledpress"]

		if { !$init } {
			foreach widget $widgetlist {
				if { $selected([$widget cget -variable]) == $widget } {
					::hull1$widget itemconfigure button -image $normalpress -disabledimage $disabledpress
				} else {
					::hull1$widget itemconfigure button -image $normal -disabledimage $disabled
				}
			$widget configure -width [expr [$widget MeasureText [$widget cget -text] w] + [image width $normal]]
			set ih [image height $normal]
			set th [$self MeasureText $options(-text) h]
			if { $ih > $th } {
				$hull configure -height $ih
			} else {
				$hull configure -height $th
			}
			}
		}
	}
}



See more files for this project here

aMSN

A very nice MSN compatible messenger application, aMSN Messenger is a multiplatform MSN messenger clone. Works pretty much like its Windows based counterpart. Perfect for keeping in touch with those friends who have not yet seen the light. Works on linux

Project homepage: http://sourceforge.net/projects/amsn
Programming language(s): C,C++,PHP,Tcl,XML
License: other

  button.gif
  button.tcl
  button_disabled.gif
  button_focus.gif
  button_hover.gif
  button_pressed.gif
  check.gif
  checkbutton.tcl
  checkdisabled.gif
  checkdisabledpress.gif
  checkhover.gif
  checkhoverpress.gif
  checkpress.gif
  icon.gif
  icon2.gif
  pkgIndex.tcl
  radio.gif
  radiobutton.tcl
  radiodisabled.gif
  radiodisabledpress.gif
  radiohover.gif
  radiohoverpress.gif
  radiopress.gif
  test.tcl