pixmapscroll.tcl

来自「Linux下的MSN聊天程序源码」· TCL 代码 · 共 728 行 · 第 1/2 页

TCL
728
字号
#Pixmapscroll 0.9 by Arieh Schneier and Tom Jenkins#A scrollbar widget that uses pixmaps so you can have pretty-fied tk scrollbars!package require snitpackage provide pixmapscroll 0.9interp alias {} scrollbar {} pixmapscrollbarsnit::widgetadaptor pixmapscrollbar {	typevariable scrollbarlist {}	foreach orientation {horizontal vertical} {		foreach pic {arrow1 arrow2 slidertop sliderbody sliderbottom slidergrip} {			foreach hov {{} _hover _pressed _disabled} {				typecomponent ${orientation}_${pic}image${hov}			}		}		typecomponent ${orientation}_troughsrcimage		typevariable ${orientation}_arrow1width		typevariable ${orientation}_arrow1height		typevariable ${orientation}_arrow2width		typevariable ${orientation}_arrow2height	}	foreach pic {arrow1 arrow2 slidertop sliderbody sliderbottom slidergrip slider} {		foreach hov {{} _hover _pressed _disabled} {			component ${pic}image${hov}		}	}	component troughsrcimage	component troughimage	variable arrow1width	variable arrow1height	variable arrow2width	variable arrow2height	variable canvas	variable visible 1	variable first 0	variable last 1	variable newsize 1	variable active_element ""	variable hidden 0	variable greyed 0	variable packinfo ""	variable packlist {}	option -activebackground -default #ffffff	option -background -default #eae7e4	option -bg -default #eae7e4	option -borderwidth -default 0	option -bd -default 0	option -cursor -default {}	option -highlightbackground -default #eae7e4	option -highlightcolor -default black	option -highlightthickness -default 0	option -jump -default 0	option -orient -default "vertical" -readonly yes	option -relief -default sunken	option -repeatdelay -default 300	option -repeatinterval -default 100	option -takefocus -default {}	option -troughcolor -default #d3d0ce	option -activerelief -default raised	option -command -default {}	option -elementborderwidth -default -1	option -width -default 14 -configuremethod SetWidth	option -height -default 200 -configuremethod SetHeight		option -autohide -default 0 -configuremethod ChangeHide	typeconstructor {		reloadimages "" 1	}	constructor {args} {		installhull using canvas -bg white -bd 0 -highlightthickness 0		set canvas $hull		$self configurelist $args		#add abbreviations		if { ($options(-orient) == "v") || ($options(-orient) == "vert") } {			set options(-orient) "vertical"		}		if { $options(-orient) == "vertical" } {			set orientation "vertical"		} else {			set orientation "horizontal"		}		foreach pic {arrow1 arrow2 slidertop sliderbody sliderbottom slidergrip} {			foreach hov {{} _hover _pressed _disabled} {				set ${pic}image${hov} [set ${orientation}_${pic}image${hov}]			}		}		set troughsrcimage [set ${orientation}_troughsrcimage]		set arrow1width [set ${orientation}_arrow1width]		set arrow1height [set ${orientation}_arrow1height]		set arrow2width [set ${orientation}_arrow2width]		set arrow2height [set ${orientation}_arrow2height]		set troughimage [image create photo ${self}through]		set sliderimage [image create photo ${self}slider]		set sliderimage_hover [image create photo ${self}slidhov]		set sliderimage_pressed [image create photo ${self}slidpres]		set sliderimage_disabled [image create photo ${self}sliddisab]		$canvas create image 0 0 -anchor nw -image $troughimage -tag $troughimage		$canvas create image 0 0 -anchor nw -image $sliderimage -activeimage $sliderimage_hover -disabledimage $sliderimage_disabled -tag $sliderimage		$canvas create image 0 0 -anchor nw -image $arrow1image -activeimage $arrow1image_hover -disabledimage $arrow1image_disabled -tag $arrow1image		if { $options(-orient) == "vertical" } {			$canvas create image 0 $newsize -anchor sw -image $arrow2image -activeimage $arrow2image_hover -disabledimage $arrow2image_disabled -tag $arrow2image		} else {			$canvas create image $newsize 0 -anchor ne -image $arrow2image -activeimage $arrow2image_hover -disabledimage $arrow2image_disabled -tag $arrow2image		}		# Set width / height		if { $options(-orient) == "vertical" } {			$self configure -width $arrow1width		} else {			$self configure -width $arrow1height		}		# Set configure bindings:		if { $options(-orient) == "vertical" } {			bind $self <Configure> {				%W Setnewsize %h				%W DrawScrollbar			}		} else {			bind $self <Configure> {				%W Setnewsize %w				%W DrawScrollbar			}		}		bindtags $self "Pixmapscroll $self all"				bind $self <Button-1> "$self PressedImage %x %y"		bind $self <ButtonRelease-1> "$self ReleasedImage %x %y"				lappend scrollbarlist $self	}	destructor {		set ndx [lsearch $scrollbarlist $self]		if {$ndx != -1} {			set scrollbarlist [lreplace $scrollbarlist $ndx $ndx]		}		image delete ${self}through		image delete ${self}slider		image delete ${self}slidhov		image delete ${self}slidpres		image delete ${self}sliddisab	}	method Setnewsize { news } {		set newsize $news	}	method SetWidth {option value} {		set options($option) $value		if { $options(-orient) == "vertical" } {			$canvas configure -width $value		} else {			$canvas configure -height $value		}	}	method SetHeight {option value} {		set options($option) $value		if { $options(-orient) == "vertical" } {			$canvas configure -height $value		} else {			$canvas configure -width $value		}	}	method ChangeHide {option value} {		set options($option) $value		$self HideUnhide	}	method Hide { } {		if { ![catch { set packinfo [pack info $self] }] } {			set packlist [pack slaves [winfo parent $self]]			set packlist [lrange $packlist [expr {[lsearch $packlist $self] + 1}] end]			pack forget $self			set hidden 1		}		}	method UnHide {} {		#only pack if isn't currently packed		if { [catch { pack info $self }] } {			foreach child $packlist {				if { ![catch { pack info $child } ] } {					append packinfo " -before $child"					break				}			}			eval pack $self $packinfo		}				set hidden 0	}	method Grey { } {		#$self ChangePalette 32 2		$self SetState disabled		set greyed 1		#bind $self <Button-1> ""		#bind $self <ButtonRelease-1> ""	}	method UnGrey { } {		#$self ChangePalette 256/256/256 1		$self SetState normal		set greyed 0		#bind $self <Button-1> "$self PressedImage %x %y"		#bind $self <ButtonRelease-1> "$self ReleasedImage %x %y"	}	method SetState { value } {		$canvas configure -state $value	}	#	method ChangePalette { palette gamma } {#		#		foreach pic {arrow1 arrow2 slidertop sliderbody sliderbottom slidergrip slider} {#			foreach hov {{} _hover _pressed _disabled} {#				catch {[set ${pic}image${hov}] configure -palette $palette -gamma $gamma} res#			}#		}#		catch { $troughsrcimage configure -palette $palette -gamma $gamma}#		catch { $troughimage configure -palette $palette -gamma $gamma}#	}	method HideUnhide { } {			# hide it or grey it out		if { $visible == 1} {			if {$options(-autohide)} {				# Hide it				if {$hidden == 0} {					$self Hide				}			} else {				# grey it				if {$hidden == 1 } {					# Unhide it first					$self UnHide				}				if {$greyed == 0 } {					$self Grey				}			}		} else {			# Unhide or ungrey			if { $hidden == 1 } {				$self UnHide			}					if { $greyed == 1 } {				$self UnGrey			}			}	}	method PressedImage { x y } {		set element [$self identify $x $y]		switch $element {			"slider" { $canvas itemconfigure $sliderimage -image $sliderimage_pressed -activeimage $sliderimage_pressed }			"arrow1" { $canvas itemconfigure $arrow1image -image $arrow1image_pressed -activeimage $arrow1image_pressed }			"arrow2" { $canvas itemconfigure $arrow2image -image $arrow2image_pressed -activeimage $arrow2image_pressed }			default { return }		}	}		method ReleasedImage { x y } {		$canvas itemconfigure $sliderimage -image $sliderimage -activeimage $sliderimage_hover		$canvas itemconfigure $arrow1image -image $arrow1image -activeimage $arrow1image_hover		$canvas itemconfigure $arrow2image -image $arrow2image -activeimage $arrow2image_hover	}	#Draw or redraw the scrollbar	method DrawScrollbar { } {		#Drawing Arrows:		if { $options(-orient) == "vertical" } {			$canvas coords $arrow2image 0 $newsize		} else {			$canvas coords $arrow2image $newsize 0		}		#Drawing Trough		if { $options(-orient) == "vertical" } {			$troughimage blank			$troughimage copy $troughsrcimage -to 0 0 [image width $troughsrcimage] $newsize		} else {			$troughimage blank			$troughimage copy $troughsrcimage -to 0 0 $newsize [image height $troughsrcimage]		}		#Drawing Slider		if { $options(-orient) == "vertical" } {			set slidersize [lindex [split [expr {$visible * ($newsize - ($arrow1height + $arrow2height))}] .] 0]			#Make sure slider doesn't get negative size			if { [image height $sliderbodyimage] < [image height $slidergripimage] } {				set minsize [expr {[image height $slidertopimage] + [image height $sliderbottomimage] + [image height $slidergripimage]}]			} else {				set minsize [expr {[image height $slidertopimage] + [image height $sliderbottomimage] + [image height $sliderbodyimage]}]			}					if { $slidersize < $minsize } {				set slidersize $minsize			}			set gripPos [expr {($slidersize/2) - ([image height $slidergripimage]/2)}]			if {$gripPos < 0} {set gripPos 1}			$sliderimage blank			$sliderimage copy $slidertopimage			$sliderimage copy $sliderbodyimage -to 0 [image height $slidertopimage] [image width $sliderbodyimage] [expr {$slidersize - [image height $sliderbottomimage] }]			$sliderimage copy $sliderbottomimage -to 0 [expr {$slidersize - [image height $sliderbottomimage]}] -shrink			if  {[expr {$slidersize - [image height $sliderbottomimage] }] >= [image height $slidergripimage]} {				$sliderimage copy $slidergripimage -to 0 $gripPos			}			$sliderimage_hover blank			$sliderimage_hover copy $slidertopimage_hover			$sliderimage_hover copy $sliderbodyimage_hover -to 0 [image height $slidertopimage_hover] [image width $sliderbodyimage_hover] [expr {$slidersize - [image height $sliderbottomimage_hover] }]			$sliderimage_hover copy $sliderbottomimage_hover -to 0 [expr {$slidersize - [image height $sliderbottomimage_hover]}] -shrink			if  {[expr {$slidersize - [image height $sliderbottomimage_hover] }] >= [image height $slidergripimage_hover]} {				$sliderimage_hover copy $slidergripimage_hover -to 0 $gripPos			}						$sliderimage_pressed blank			$sliderimage_pressed copy $slidertopimage_pressed			$sliderimage_pressed copy $sliderbodyimage_pressed -to 0 [image height $slidertopimage_pressed] [image width $sliderbodyimage_pressed] [expr {$slidersize - [image height $sliderbottomimage_pressed] }]			$sliderimage_pressed copy $sliderbottomimage_pressed -to 0 [expr {$slidersize - [image height $sliderbottomimage_pressed]}] -shrink			if  {[expr {$slidersize - [image height $sliderbottomimage_pressed] }] >= [image height $slidergripimage_pressed]} {				$sliderimage_pressed copy $slidergripimage_pressed -to 0 $gripPos			}						$sliderimage_disabled blank			$sliderimage_disabled copy $slidertopimage_disabled			$sliderimage_disabled copy $sliderbodyimage_disabled -to 0 [image height $slidertopimage_disabled] [image width $sliderbodyimage_disabled] [expr {$slidersize - [image height $sliderbottomimage_disabled] }]			$sliderimage_disabled copy $sliderbottomimage_disabled -to 0 [expr {$slidersize - [image height $sliderbottomimage_disabled]}] -shrink			if  {[expr {$slidersize - [image height $sliderbottomimage_disabled] }] >= [image height $slidergripimage_disabled]} {				$sliderimage_disabled copy $slidergripimage_disabled -to 0 $gripPos

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?