| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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 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 { # flush |
| 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]}] |
| 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 rooty $mb] - $mh}] |
| } |
| } |
| left { |
| incr x -$mw |
| } |
| right { |
| incr x $bw |
| } |
| default { # flush |
| incr x [expr {([winfo width $mb] - [winfo reqwidth $menu])/ 2}] |
| } |
| } |
| 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 "" |
| } |
|
|
| |
|
|