ruby/ext/tk/sample/tkmenubutton.rb
nagai 41b74c6e20 * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries.
* ext/tk/*: Support new features of Tcl/Tk8.6b1 and minor bug fixes.
     ( [KNOWN BUG] Ruby/Tk on Ruby 1.9 will not work on Cygwin. )
* ext/tk/*: Unify sources between Ruby 1.8 & 1.9.
            Improve default_widget_set handling.
* ext/tk/*: Multi-TkInterpreter (multi-tk.rb) works on Ruby 1.8 & 1.9.
     ( [KNOWN BUG] On Ruby 1.8, join to a long term Thread on Tk
       callbacks may freeze. On Ruby 1.9, cannot create a second 
       master interpreter (creating slaves are OK); supported master
       interpreter is the default master interpreter only. )
* ext/tk/lib/tkextlib/*: Update supported versions of Tk extensions.
         Tcllib 1.8/Tklib 0.4.1  ==>  Tcllib 1.11.1/Tklib 0.5
         BWidgets 1.7            ==>  BWidgets 1.8
         TkTable 2.9             ==>  TkTable 2.10
         TkTreeCtrl 2005-12-02   ==>  TkTreeCtrl 2.2.9
         Tile 0.8.0/8.5.1        ==>  Tile 0.8.3/8.6b1
         IncrTcl 2005-02-14      ==>  IncrTcl 2008-12-15
         TclX 2005-02-07         ==>  TclX 2008-12-15
         Trofs 0.4.3             ==>  Trofs 0.4.4


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@24064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-07-12 23:09:52 +00:00

135 lines
4.9 KiB
Ruby

#!/usr/bin/env ruby
#
# menubutton sample : based on sample menubuttons on the Tcl/Tk demo script
#
require 'tk'
TkLabel.new(:text=>'Sample of TkMenubutton').pack(:side=>:top)
TkFrame.new{|f|
pack(:side=>:top)
TkMenubutton.new(:parent=>f, :text=>'Right', :underline=>0,
:direction=>:right, :relief=>:raised){|mb|
menu TkMenu.new(:parent=>mb, :tearoff=>0){
add(:command, :label=>'Right menu: first item',
:command=>proc{print 'You have selected the first item' +
" from the Right menu.\n"})
add(:command, :label=>'Right menu: second item',
:command=>proc{print 'You have selected the second item' +
" from the Right menu.\n"})
}
pack(:side=>:left, :padx=>25, :pady=>25)
}
TkMenubutton.new(:parent=>f, :text=>'Below', :underline=>0,
:direction=>:below, :relief=>:raised){|mb|
menu(TkMenu.new(:parent=>mb, :tearoff=>0){
add(:command, :label=>'Below menu: first item',
:command=>proc{print 'You have selected the first item' +
" from the Below menu.\n"})
add(:command, :label=>'Below menu: second item',
:command=>proc{print 'You have selected the second item' +
" from the Below menu.\n"})
})
pack(:side=>:left, :padx=>25, :pady=>25)
}
TkMenubutton.new(:parent=>f, :text=>'Above', :underline=>0,
:direction=>:above, :relief=>:raised){|mb|
menu TkMenu.new(:parent=>mb, :tearoff=>0){
add(:command, :label=>'Above menu: first item',
:command=>proc{print 'You have selected the first item' +
" from the Above menu.\n"})
add(:command, :label=>'Above menu: second item',
:command=>proc{print 'You have selected the second item' +
" from the Above menu.\n"})
}
pack(:side=>:left, :padx=>25, :pady=>25)
}
TkMenubutton.new(:parent=>f, :text=>'Left', :underline=>0,
:direction=>:left, :relief=>:raised){|mb|
menu(TkMenu.new(:parent=>mb, :tearoff=>0){
add(:command, :label=>'Left menu: first item',
:command=>proc{print 'You have selected the first item' +
" from the Left menu.\n"})
add(:command, :label=>'Left menu: second item',
:command=>proc{print 'You have selected the second item' +
" from the Left menu.\n"})
})
pack(:side=>:left, :padx=>25, :pady=>25)
}
}
############################
TkFrame.new(:borderwidth=>2, :relief=>:sunken,
:height=>5).pack(:side=>:top, :fill=>:x, :padx=>20)
############################
TkLabel.new(:text=>'Sample of TkOptionMenu').pack(:side=>:top)
colors = %w(Black red4 DarkGreen NavyBlue gray75 Red Green Blue gray50
Yellow Cyan Magenta White Brown DarkSeaGreen DarkViolet)
TkFrame.new{|f|
pack(:side=>:top)
b1 = TkOptionMenubutton .
new(:parent=>f, :values=>%w(one two three)) .
pack(:side=>:left, :padx=>25, :pady=>25)
b2 = TkOptionMenubutton.new(:parent=>f, :values=>colors) {|optMB|
colors.each{|color|
no_sel = TkPhotoImage.new(:height=>16, :width=>16){
put 'gray50', *[ 0, 0, 16, 1]
put 'gray50', *[ 0, 1, 1, 16]
put 'gray75', *[ 0, 15, 16, 16]
put 'gray75', *[15, 1, 16, 16]
put color, *[ 1, 1, 15, 15]
}
sel = TkPhotoImage.new(:height=>16, :width=>16){
put 'Black', *[ 0, 0, 16, 2]
put 'Black', *[ 0, 2, 2, 16]
put 'Black', *[ 2, 14, 16, 16]
put 'Black', *[14, 2, 16, 14]
put color, *[ 2, 2, 14, 14]
}
optMB.entryconfigure(color, :hidemargin=>1,
:image=>no_sel, :selectimage=>sel)
}
optMB.menuconfigure(:tearoff, 1)
%w(Black gray75 gray50 White).each{|color|
optMB.entryconfigure(color, :columnbreak=>true)
}
pack(:side=>:left, :padx=>25, :pady=>25)
}
TkButton.new(:parent=>f){
text 'show values'
command proc{p [b1.value, b2.value]}
pack(:side=>:left, :padx=>25, :pady=>5, :anchor=>:s)
}
}
############################
TkFrame.new(:borderwidth=>2, :relief=>:sunken,
:height=>5).pack(:side=>:top, :fill=>:x, :padx=>20)
############################
root = TkRoot.new(:title=>'menubutton samples')
TkButton.new(root, :text=>'exit', :command=>proc{exit}){
pack(:side=>:top, :padx=>25, :pady=>5, :anchor=>:e)
}
# VirtualEvent <<MenuSelect>> on Tcl/Tk ==> '<MenuSelect>' on Ruby/Tk
# ( remove the most external <, > for Ruby/Tk notation )
TkMenu.bind('<MenuSelect>', proc{|widget|
p widget.entrycget('active', :label)
}, '%W')
############################
Tk.mainloop