2003-07-31 16:52:40 -04:00
# menubutton.rb
#
# This demonstration script creates a window with a bunch of menus
# and cascaded menus using menubuttons.
require " tkcanvas "
def optionMenu ( menubutton , varName , firstValue , * rest )
varName . value = firstValue
configoptions = { 'textvariable' = > varName , 'indicatoron' = > 'on' ,
'relief' = > 'raised' , 'borderwidth' = > 2 , 'highlightthickness' = > 2 ,
'anchor' = > 'c' , 'direction' = > 'flush' }
configoptions . each { | key , value |
menubutton . configure ( key , value )
}
menu = TkMenu . new ( menubutton ) {
tearoff 'off'
add 'radio' , 'label' = > firstValue , 'variable' = > varName
}
menubutton . menu ( menu )
for i in rest
menu . add 'radio' , 'label' = > i , 'variable' = > varName
end
return menu
end
if defined? ( $menubu_demo ) && $menubu_demo
$menubu_demo . destroy
$menubu_demo = nil
end
$menubu_demo = TkToplevel . new { | w |
title ( " Menu Button Demonstration " )
iconname ( " menubutton " )
}
positionWindow ( $menubu_demo )
# version check
if $tk_version . to_f < 8 . 0
# label
TkLabel . new ( $menubu_demo , 'font' = > $font , 'wraplength' = > '4i' , 'justify' = > 'left' ) {
text ( " This is a demonstration of menubuttons. The \" Below \" menubutton pops its menu below the button; the \" Right \" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette. " )
} . pack ( 'side' = > 'top' )
# frame
TkFrame . new ( $menubu_demo ) { | frame |
TkButton . new ( frame ) {
text 'Dismiss'
command proc {
tmppath = $menubu_demo
$menubu_demo = nil
tmppath . destroy
}
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
TkButton . new ( frame ) {
text 'Show Code'
2004-05-01 12:09:54 -04:00
command proc { showCode 'menubu' }
2003-07-31 16:52:40 -04:00
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
} . pack ( 'side' = > 'bottom' , 'fill' = > 'x' , 'pady' = > '2m' )
else ; # Tk8.x
body = TkFrame . new ( $menubu_demo )
body . pack ( 'expand' = > 'yes' , 'fill' = > 'both' )
below = TkMenubutton . new ( body ) {
text " Below "
underline 0
direction 'below'
relief 'raised'
}
belowMenu = TkMenu . new ( below ) {
tearoff 0
add 'command' , 'label' = > " Below menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Below menu. \" " }
add 'command' , 'label' = > " Below menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Below menu. \" " }
}
below . menu ( belowMenu )
below . grid ( 'row' = > 0 , 'column' = > 1 , 'sticky' = > 'n' )
below = TkMenubutton . new ( body ) {
text " Below "
underline 0
direction 'below'
relief 'raised'
}
belowMenu = TkMenu . new ( below ) {
tearoff 0
add 'command' , 'label' = > " Below menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Below menu. \" " }
add 'command' , 'label' = > " Below menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Below menu. \" " }
}
below . menu ( belowMenu )
below . grid ( 'row' = > 0 , 'column' = > 1 , 'sticky' = > 'n' )
below = TkMenubutton . new ( body ) {
text " Below "
underline 0
direction 'below'
relief 'raised'
}
belowMenu = TkMenu . new ( below ) {
tearoff 0
add 'command' , 'label' = > " Below menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Below menu. \" " }
add 'command' , 'label' = > " Below menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Below menu. \" " }
}
below . menu ( belowMenu )
below . grid ( 'row' = > 0 , 'column' = > 1 , 'sticky' = > 'n' )
right = TkMenubutton . new ( body ) {
text " Right "
underline 0
direction 'right'
relief 'raised'
}
rightMenu = TkMenu . new ( right ) {
tearoff 0
add 'command' , 'label' = > " Right menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Left menu. \" " }
add 'command' , 'label' = > " Right menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Right menu. \" " }
}
right . menu ( rightMenu )
right . grid ( 'row' = > 1 , 'column' = > 0 , 'sticky' = > 'w' )
left = TkMenubutton . new ( body ) {
text " Left "
underline 0
direction 'left'
relief 'raised'
}
leftMenu = TkMenu . new ( left ) {
tearoff 0
add 'command' , 'label' = > " Left menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Left menu. \" " }
add 'command' , 'label' = > " Left menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Left menu. \" " }
}
left . menu ( leftMenu )
left . grid ( 'row' = > 1 , 'column' = > 2 , 'sticky' = > 'e' )
center = TkFrame . new ( body ) {
grid ( 'row' = > 1 , 'column' = > 1 , 'sticky' = > 'news' )
}
above = TkMenubutton . new ( body ) {
text " Above "
underline 0
direction 'above'
relief 'raised'
}
aboveMenu = TkMenu . new ( above ) {
tearoff 0
add 'command' , 'label' = > " Above menu: first item " , 'command' = > proc { puts " \" You have selected the first item from the Above menu. \" " }
add 'command' , 'label' = > " Above menu: second item " , 'command' = > proc { puts " \" You have selected the second item from the Above menu. \" " }
}
above . menu ( aboveMenu )
above . grid ( 'row' = > 2 , 'column' = > 1 , 'sticky' = > 's' )
center = TkFrame . new ( body ) {
grid ( 'row' = > 1 , 'column' = > 1 , 'sticky' = > 'news' )
}
TkFrame . new ( $menubu_demo ) { | frame |
TkButton . new ( frame ) {
text 'Dismiss'
command proc {
tmppath = $menubu_demo
$menubu_demo = nil
tmppath . destroy
}
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
TkButton . new ( frame ) {
text 'Show Code'
command proc { showCode 'menubu' }
} . pack ( 'side' = > 'left' , 'expand' = > 'yes' )
} . pack ( 'side' = > 'bottom' , 'expand' = > 'yes' , 'fill' = > 'x' , 'pady' = > '2m' )
msg = TkLabel . new ( center ) {
# font $font
wraplength '4i'
justify 'left'
text " This is a demonstration of menubuttons. The \" Below \" menubutton pops its menu below the button; the \" Right \" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette. "
}
msg . pack ( 'side' = > 'top' , 'padx' = > 25 , 'pady' = > 25 )
TkFrame . new ( center ) { | f |
menubuttonoptions = TkVariable . new
mbutton = TkMenubutton . new ( f )
options = optionMenu ( mbutton , menubuttonoptions ,
'one' , 'two' , 'three' )
mbutton . pack ( 'side' = > 'left' , 'padx' = > 25 , 'pady' = > 25 )
paletteColor = TkVariable . new
colors = [ 'Black' , 'red4' , 'DarkGreen' , 'NavyBlue' , 'gray75' ,
'Red' , 'Green' , 'Blue' , 'gray50' , 'Yellow' , 'Cyan' , 'Magenta' ,
'White' , 'Brown' , 'DarkSeaGreen' , 'DarkViolet' ]
colorMenuButton = TkMenubutton . new ( f )
m = optionMenu ( colorMenuButton , paletteColor , * colors )
2003-08-02 17:39:23 -04:00
begin
windowingsystem = Tk . windowingsystem ( )
rescue
windowingsystem = " "
end
if windowingsystem == " classic " || windowingsystem == " aqua "
topBorderColor = 'Black'
bottomBorderColor = 'Black'
else
topBorderColor = 'gray50'
bottomBorderColor = 'gray75'
end
2003-07-31 16:52:40 -04:00
for i in 0 .. 15
image = TkPhotoImage . new ( 'height' = > 16 , 'width' = > 16 )
image . put ( topBorderColor , 0 , 0 , 16 , 1 )
image . put ( topBorderColor , 0 , 1 , 1 , 16 )
image . put ( bottomBorderColor , 0 , 15 , 16 , 16 )
image . put ( bottomBorderColor , 15 , 1 , 16 , 16 )
image . put ( colors [ i ] , 1 , 1 , 15 , 15 )
selectimage = TkPhotoImage . new ( 'height' = > 16 , 'width' = > 16 )
selectimage . put ( 'Black' , 0 , 0 , 16 , 2 )
selectimage . put ( 'Black' , 0 , 2 , 2 , 16 )
selectimage . put ( 'Black' , 2 , 14 , 16 , 16 )
selectimage . put ( 'Black' , 14 , 2 , 16 , 14 )
selectimage . put ( colors [ i ] , 2 , 2 , 14 , 14 )
m . entryconfigure ( i , 'image' = > image , 'selectimage' = > selectimage , 'hidemargin' = > 'on' )
end
m . configure ( 'tearoff' , 'on' )
for c in [ 'Black' , 'gray75' , 'gray50' , 'White' ]
m . entryconfigure ( c , 'columnbreak' = > 1 )
end
colorMenuButton . pack ( 'side' = > 'left' , 'padx' = > 25 , 'pady' = > 25 )
pack 'padx' = > 25 , 'pady' = > 25
}
end ; # Tk8.x