| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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 "" |
| | } |
| |
|
| | |
| |
|