View file File name : scale.tcl Content :# scale.tcl -- # # This file defines the default bindings for Tk scale widgets and provides # procedures that help in implementing the bindings. # # Copyright (c) 1994 The Regents of the University of California. # Copyright (c) 1994-1995 Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # #------------------------------------------------------------------------- # The code below creates the default class bindings for entries. #------------------------------------------------------------------------- # Standard Motif bindings: bind Scale <Enter> { if {$tk_strictMotif} { set tk::Priv(activeBg) [%W cget -activebackground] %W configure -activebackground [%W cget -background] } tk::ScaleActivate %W %x %y } bind Scale <Motion> { tk::ScaleActivate %W %x %y } bind Scale <Leave> { if {$tk_strictMotif} { %W configure -activebackground $tk::Priv(activeBg) } if {[%W cget -state] eq "active"} { %W configure -state normal } } bind Scale <1> { tk::ScaleButtonDown %W %x %y } bind Scale <B1-Motion> { tk::ScaleDrag %W %x %y } bind Scale <B1-Leave> { } bind Scale <B1-Enter> { } bind Scale <ButtonRelease-1> { tk::CancelRepeat tk::ScaleEndDrag %W tk::ScaleActivate %W %x %y } bind Scale <2> { tk::ScaleButton2Down %W %x %y } bind Scale <B2-Motion> { tk::ScaleDrag %W %x %y } bind Scale <B2-Leave> { } bind Scale <B2-Enter> { } bind Scale <ButtonRelease-2> { tk::CancelRepeat tk::ScaleEndDrag %W tk::ScaleActivate %W %x %y } if {[tk windowingsystem] eq "win32"} { # On Windows do the same with button 3, as that is the right mouse button bind Scale <3> [bind Scale <2>] bind Scale <B3-Motion> [bind Scale <B2-Motion>] bind Scale <B3-Leave> [bind Scale <B2-Leave>] bind Scale <B3-Enter> [bind Scale <B2-Enter>] bind Scale <ButtonRelease-3> [bind Scale <ButtonRelease-2>] } bind Scale <Control-1> { tk::ScaleControlPress %W %x %y } bind Scale <<PrevLine>> { tk::ScaleIncrement %W up little noRepeat } bind Scale <<NextLine>> { tk::ScaleIncrement %W down little noRepeat } bind Scale <<PrevChar>> { tk::ScaleIncrement %W up little noRepeat } bind Scale <<NextChar>> { tk::ScaleIncrement %W down little noRepeat } bind Scale <<PrevPara>> { tk::ScaleIncrement %W up big noRepeat } bind Scale <<NextPara>> { tk::ScaleIncrement %W down big noRepeat } bind Scale <<PrevWord>> { tk::ScaleIncrement %W up big noRepeat } bind Scale <<NextWord>> { tk::ScaleIncrement %W down big noRepeat } bind Scale <<LineStart>> { %W set [%W cget -from] } bind Scale <<LineEnd>> { %W set [%W cget -to] } # ::tk::ScaleActivate -- # This procedure is invoked to check a given x-y position in the # scale and activate the slider if the x-y position falls within # the slider. # # Arguments: # w - The scale widget. # x, y - Mouse coordinates. proc ::tk::ScaleActivate {w x y} { if {[$w cget -state] eq "disabled"} { return } if {[$w identify $x $y] eq "slider"} { set state active } else { set state normal } if {[$w cget -state] ne $state} { $w configure -state $state } } # ::tk::ScaleButtonDown -- # This procedure is invoked when a button is pressed in a scale. It # takes different actions depending on where the button was pressed. # # Arguments: # w - The scale widget. # x, y - Mouse coordinates of button press. proc ::tk::ScaleButtonDown {w x y} { variable ::tk::Priv set Priv(dragging) 0 set el [$w identify $x $y] # save the relief set Priv($w,relief) [$w cget -sliderrelief] if {$el eq "trough1"} { ScaleIncrement $w up little initial } elseif {$el eq "trough2"} { ScaleIncrement $w down little initial } elseif {$el eq "slider"} { set Priv(dragging) 1 set Priv(initValue) [$w get] set coords [$w coords] set Priv(deltaX) [expr {$x - [lindex $coords 0]}] set Priv(deltaY) [expr {$y - [lindex $coords 1]}] switch -exact -- $Priv($w,relief) { "raised" { $w configure -sliderrelief sunken } "ridge" { $w configure -sliderrelief groove } } } } # ::tk::ScaleDrag -- # This procedure is called when the mouse is dragged with # mouse button 1 down. If the drag started inside the slider # (i.e. the scale is active) then the scale's value is adjusted # to reflect the mouse's position. # # Arguments: # w - The scale widget. # x, y - Mouse coordinates. proc ::tk::ScaleDrag {w x y} { variable ::tk::Priv if {!$Priv(dragging)} { return } $w set [$w get [expr {$x-$Priv(deltaX)}] [expr {$y-$Priv(deltaY)}]] } # ::tk::ScaleEndDrag -- # This procedure is called to end an interactive drag of the # slider. It just marks the drag as over. # # Arguments: # w - The scale widget. proc ::tk::ScaleEndDrag {w} { variable ::tk::Priv set Priv(dragging) 0 if {[info exists Priv($w,relief)]} { $w configure -sliderrelief $Priv($w,relief) unset Priv($w,relief) } } # ::tk::ScaleIncrement -- # This procedure is invoked to increment the value of a scale and # to set up auto-repeating of the action if that is desired. The # way the value is incremented depends on the "dir" and "big" # arguments. # # Arguments: # w - The scale widget. # dir - "up" means move value towards -from, "down" means # move towards -to. # big - Size of increments: "big" or "little". # repeat - Whether and how to auto-repeat the action: "noRepeat" # means don't auto-repeat, "initial" means this is the # first action in an auto-repeat sequence, and "again" # means this is the second repetition or later. proc ::tk::ScaleIncrement {w dir big repeat} { variable ::tk::Priv if {![winfo exists $w]} return if {$big eq "big"} { set inc [$w cget -bigincrement] if {$inc == 0} { set inc [expr {abs([$w cget -to] - [$w cget -from])/10.0}] } if {$inc < [$w cget -resolution]} { set inc [$w cget -resolution] } } else { set inc [$w cget -resolution] } if {([$w cget -from] > [$w cget -to]) ^ ($dir eq "up")} { if {$inc > 0} { set inc [expr {-$inc}] } } else { if {$inc < 0} { set inc [expr {-$inc}] } } $w set [expr {[$w get] + $inc}] if {$repeat eq "again"} { set Priv(afterId) [after [$w cget -repeatinterval] \ [list tk::ScaleIncrement $w $dir $big again]] } elseif {$repeat eq "initial"} { set delay [$w cget -repeatdelay] if {$delay > 0} { set Priv(afterId) [after $delay \ [list tk::ScaleIncrement $w $dir $big again]] } } } # ::tk::ScaleControlPress -- # This procedure handles button presses that are made with the Control # key down. Depending on the mouse position, it adjusts the scale # value to one end of the range or the other. # # Arguments: # w - The scale widget. # x, y - Mouse coordinates where the button was pressed. proc ::tk::ScaleControlPress {w x y} { set el [$w identify $x $y] if {$el eq "trough1"} { $w set [$w cget -from] } elseif {$el eq "trough2"} { $w set [$w cget -to] } } # ::tk::ScaleButton2Down # This procedure is invoked when button 2 is pressed over a scale. # It sets the value to correspond to the mouse position and starts # a slider drag. # # Arguments: # w - The scrollbar widget. # x, y - Mouse coordinates within the widget. proc ::tk::ScaleButton2Down {w x y} { variable ::tk::Priv if {[$w cget -state] eq "disabled"} { return } $w configure -state active $w set [$w get $x $y] set Priv(dragging) 1 set Priv(initValue) [$w get] set Priv($w,relief) [$w cget -sliderrelief] set coords "$x $y" set Priv(deltaX) 0 set Priv(deltaY) 0 }