|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace eval ttk { |
|
namespace eval menubutton { |
|
variable State |
|
array set State { |
|
pulldown 0 |
|
oldcursor {} |
|
} |
|
} |
|
} |
|
|
|
bind TMenubutton <Enter> { %W instate !disabled {%W state active } } |
|
bind TMenubutton <Leave> { %W state !active } |
|
bind TMenubutton <space> { ttk::menubutton::Popdown %W } |
|
bind TMenubutton <<Invoke>> { ttk::menubutton::Popdown %W } |
|
|
|
if {[tk windowingsystem] eq "x11"} { |
|
bind TMenubutton <Button-1> { ttk::menubutton::Pulldown %W } |
|
bind TMenubutton <ButtonRelease-1> { ttk::menubutton::TransferGrab %W } |
|
bind TMenubutton <B1-Leave> { ttk::menubutton::TransferGrab %W } |
|
} else { |
|
bind TMenubutton <Button-1> \ |
|
{ %W state pressed ; ttk::menubutton::Popdown %W } |
|
bind TMenubutton <ButtonRelease-1> \ |
|
{ if {[winfo exists %W]} { %W state !pressed } } |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if {[tk windowingsystem] eq "aqua"} { |
|
proc ::ttk::menubutton::PostPosition {mb menu} { |
|
set menuPad 5 |
|
set buttonPad 1 |
|
set bevelPad 4 |
|
set mh [winfo reqheight $menu] |
|
set bh [expr {[winfo height $mb]} + $buttonPad] |
|
set bbh [expr {[winfo height $mb]} + $bevelPad] |
|
set mw [winfo reqwidth $menu] |
|
set bw [winfo width $mb] |
|
set dF [expr {[winfo width $mb] - [winfo reqwidth $menu] - $menuPad}] |
|
set entry [::tk::MenuFindName $menu [$mb cget -text]] |
|
if {$entry < 0} { |
|
set entry 0 |
|
} |
|
set x [winfo rootx $mb] |
|
set y [winfo rooty $mb] |
|
switch [$mb cget -direction] { |
|
above { |
|
set entry "" |
|
incr y [expr {-$mh + 2 * $menuPad}] |
|
} |
|
below { |
|
set entry "" |
|
incr y $bh |
|
} |
|
left { |
|
incr y $menuPad |
|
incr x -$mw |
|
} |
|
right { |
|
incr y $menuPad |
|
incr x $bw |
|
} |
|
default { |
|
incr y $bbh |
|
} |
|
} |
|
return [list $x $y $entry] |
|
} |
|
} else { |
|
proc ::ttk::menubutton::PostPosition {mb menu} { |
|
set mh [expr {[winfo reqheight $menu]}] |
|
set bh [expr {[winfo height $mb]}] |
|
set mw [expr {[winfo reqwidth $menu]}] |
|
set bw [expr {[winfo width $mb]}] |
|
set dF [expr {[winfo width $mb] - [winfo reqwidth $menu]}] |
|
if {[tk windowingsystem] eq "win32"} { |
|
incr mh 6 |
|
incr mw 16 |
|
} |
|
set entry [::tk::MenuFindName $menu [$mb cget -text]] |
|
if {$entry < 0} { |
|
set entry 0 |
|
} |
|
set x [winfo rootx $mb] |
|
set y [winfo rooty $mb] |
|
switch [$mb cget -direction] { |
|
above { |
|
set entry "" |
|
incr y -$mh |
|
|
|
if {$y < [winfo vrooty $mb]} { |
|
set y [expr {[winfo vrooty $mb] + [winfo rooty $mb]\ |
|
+ [winfo reqheight $mb]}] |
|
} |
|
} |
|
below { |
|
set entry "" |
|
incr y $bh |
|
|
|
if {($y + $mh) > ([winfo vrooty $mb] + [winfo vrootheight $mb])} { |
|
set y [expr {[winfo vrooty $mb] + [winfo vrootheight $mb] \ |
|
+ [winfo rooty $mb] - $mh}] |
|
} |
|
} |
|
left { |
|
incr x -$mw |
|
} |
|
right { |
|
incr x $bw |
|
} |
|
default { |
|
if {[$mb cget -style] eq ""} { |
|
incr x [expr {([winfo width $mb] - \ |
|
[winfo reqwidth $menu])/ 2}] |
|
} else { |
|
incr y $bh |
|
} |
|
} |
|
} |
|
return [list $x $y $entry] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
proc ttk::menubutton::Popdown {mb} { |
|
if {[$mb instate disabled] || [set menu [$mb cget -menu]] eq ""} { |
|
return |
|
} |
|
foreach {x y entry} [PostPosition $mb $menu] { break } |
|
tk_popup $menu $x $y $entry |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ttk::menubutton::Pulldown {mb} { |
|
variable State |
|
if {[$mb instate disabled] || [set menu [$mb cget -menu]] eq ""} { |
|
return |
|
} |
|
set State(pulldown) 1 |
|
set State(oldcursor) [$mb cget -cursor] |
|
|
|
$mb state pressed |
|
$mb configure -cursor [$menu cget -cursor] |
|
foreach {x y entry} [PostPosition $mb $menu] { break } |
|
if {$entry >= 0} { |
|
$menu post $x $y $entry |
|
} else { |
|
$menu post $x $y |
|
} |
|
tk_menuSetFocus $menu |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc ttk::menubutton::TransferGrab {mb} { |
|
variable State |
|
if {$State(pulldown)} { |
|
$mb configure -cursor $State(oldcursor) |
|
$mb state {!pressed !active} |
|
set State(pulldown) 0 |
|
|
|
set menu [$mb cget -menu] |
|
foreach {x y entry} [PostPosition $mb $menu] { break } |
|
tk_popup $menu [winfo rootx $menu] [winfo rooty $menu] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ttk::menubutton::FindMenuEntry {menu s} { |
|
set last [$menu index last] |
|
if {$last eq "none" || $last < 0} { |
|
return "" |
|
} |
|
for {set i 0} {$i <= $last} {incr i} { |
|
if {![catch {$menu entrycget $i -label} label] |
|
&& ($label eq $s)} { |
|
return $i |
|
} |
|
} |
|
return "" |
|
} |
|
|
|
|
|
|