Add files via upload
This commit is contained in:
83
windowsAgent/dist/tk/ttk/button.tcl
vendored
Normal file
83
windowsAgent/dist/tk/ttk/button.tcl
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
#
|
||||
# Bindings for Buttons, Checkbuttons, and Radiobuttons.
|
||||
#
|
||||
# Notes: <Button1-Leave>, <Button1-Enter> only control the "pressed"
|
||||
# state; widgets remain "active" if the pointer is dragged out.
|
||||
# This doesn't seem to be conventional, but it's a nice way
|
||||
# to provide extra feedback while the grab is active.
|
||||
# (If the button is released off the widget, the grab deactivates and
|
||||
# we get a <Leave> event then, which turns off the "active" state)
|
||||
#
|
||||
# Normally, <ButtonRelease> and <ButtonN-Enter/Leave> events are
|
||||
# delivered to the widget which received the initial <ButtonPress>
|
||||
# event. However, Tk [grab]s (#1223103) and menu interactions
|
||||
# (#1222605) can interfere with this. To guard against spurious
|
||||
# <Button1-Enter> events, the <Button1-Enter> binding only sets
|
||||
# the pressed state if the button is currently active.
|
||||
#
|
||||
|
||||
namespace eval ttk::button {}
|
||||
|
||||
bind TButton <Enter> { %W instate !disabled {%W state active} }
|
||||
bind TButton <Leave> { %W state !active }
|
||||
bind TButton <Key-space> { ttk::button::activate %W }
|
||||
bind TButton <<Invoke>> { ttk::button::activate %W }
|
||||
|
||||
bind TButton <ButtonPress-1> \
|
||||
{ %W instate !disabled { ttk::clickToFocus %W; %W state pressed } }
|
||||
bind TButton <ButtonRelease-1> \
|
||||
{ %W instate pressed { %W state !pressed; %W instate !disabled { %W invoke } } }
|
||||
bind TButton <Button1-Leave> \
|
||||
{ %W state !pressed }
|
||||
bind TButton <Button1-Enter> \
|
||||
{ %W instate {active !disabled} { %W state pressed } }
|
||||
|
||||
# Checkbuttons and Radiobuttons have the same bindings as Buttons:
|
||||
#
|
||||
ttk::copyBindings TButton TCheckbutton
|
||||
ttk::copyBindings TButton TRadiobutton
|
||||
|
||||
# ...plus a few more:
|
||||
|
||||
bind TRadiobutton <KeyPress-Up> { ttk::button::RadioTraverse %W -1 }
|
||||
bind TRadiobutton <KeyPress-Down> { ttk::button::RadioTraverse %W +1 }
|
||||
|
||||
# bind TCheckbutton <KeyPress-plus> { %W select }
|
||||
# bind TCheckbutton <KeyPress-minus> { %W deselect }
|
||||
|
||||
# activate --
|
||||
# Simulate a button press: temporarily set the state to 'pressed',
|
||||
# then invoke the button.
|
||||
#
|
||||
proc ttk::button::activate {w} {
|
||||
$w instate disabled { return }
|
||||
set oldState [$w state pressed]
|
||||
update idletasks; after 100 ;# block event loop to avoid reentrancy
|
||||
$w state $oldState
|
||||
$w invoke
|
||||
}
|
||||
|
||||
# RadioTraverse -- up/down keyboard traversal for radiobutton groups.
|
||||
# Set focus to previous/next radiobutton in a group.
|
||||
# A radiobutton group consists of all the radiobuttons with
|
||||
# the same parent and -variable; this is a pretty good heuristic
|
||||
# that works most of the time.
|
||||
#
|
||||
proc ttk::button::RadioTraverse {w dir} {
|
||||
set group [list]
|
||||
foreach sibling [winfo children [winfo parent $w]] {
|
||||
if { [winfo class $sibling] eq "TRadiobutton"
|
||||
&& [$sibling cget -variable] eq [$w cget -variable]
|
||||
&& ![$sibling instate disabled]
|
||||
} {
|
||||
lappend group $sibling
|
||||
}
|
||||
}
|
||||
|
||||
if {![llength $group]} { # Shouldn't happen, but can.
|
||||
return
|
||||
}
|
||||
|
||||
set pos [expr {([lsearch -exact $group $w] + $dir) % [llength $group]}]
|
||||
tk::TabToWindow [lindex $group $pos]
|
||||
}
|
Reference in New Issue
Block a user