From: shugo@... (Shugo Maeda) Date: 1998-01-22T12:01:14+09:00 Subject: [ruby-list:5966] Re: How to use TkMenu ? --Multipart_Thu_Jan_22_11:49:49_1998-1 Content-Type: text/plain; charset=ISO-2022-JP 前田です。 In message "[ruby-list:5956] Re: How to use TkMenu ?" Kikutani Makoto wrote: |> menu_spec = [ |> ["File", |> ["Open", lambda { openFile }], |> "---", |> ["Exit", lambda { exit }]], |> ["Edit", |> ["Cut", lambda { cut }], |> ["Copy", lambda { copy }]] |> ] |> |> menubar = TkMenubar.new(menu_spec) |> |> みたいなクラスがあると便利かもしれません。 | |良いですねえ。 |# TkCompositeですぐにできるかな。 すぐできました(^^; 使い方は以下のような感じです。 menu_spec = [ [['File', 0], ['Open', proc{puts('Open clicked')}, 0], '---', ['Quit', proc{exit}, 0]], [['Edit', 0], ['Cut', proc{puts('Cut clicked')}, 2], ['Copy', proc{puts('Copy clicked')}, 0], ['Paste', proc{puts('Paste clicked')}, 0]] ] menubar = TkMenubar.new(nil, menu_spec, 'tearoff'=>false, 'foreground'=>'grey40', 'activeforeground'=>'red', 'font'=>'-adobe-helvetica-bold-r-*--12-*-iso8859-1') menubar.pack('side'=>'top', 'fill'=>'x') あるいは、 menubar = TkMenubar.new menubar.add_menu([['File', 0], ['Open', proc{puts('Open clicked')}, 0], '---', ['Quit', proc{exit}, 0]]) menubar.add_menu([['Edit', 0], ['Cut', proc{puts('Cut clicked')}, 2], ['Copy', proc{puts('Copy clicked')}, 0], ['Paste', proc{puts('Paste clicked')}, 0]]) menubar.configure('tearoff', false) menubar.configure('foreground', 'grey40') menubar.configure('activeforeground', 'red') menubar.configure('font', '-adobe-helvetica-bold-r-*--12-*-iso8859-1') menubar.pack('side'=>'top', 'fill'=>'x') specのフォーマットは [ [ [ボタンのtext, underline, accelerator], [メニューのlabel, command, underline, accelerator], '---', # セパレータ ... ], ... ] のようになっています。 オプションは省略できます。 配列の代りにHashを使ってもOKです。 add_menuを使う場合はコンストラクタでオプションを指定する代りに すべてのメニューをadd_menuしてからconfigureする必要があります。 -- 前田 修吾 --Multipart_Thu_Jan_22_11:49:49_1998-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="tkmenubar.rb" Content-Transfer-Encoding: 7bit # tkmenubar.rb require "tk" class TkMenubar include TkComposite def initialize(parent = nil, spec = nil, options = nil) super(parent, options) @menus = [] if spec for menu_info in spec add_menu(menu_info) end end if options for key, value in options configure(key, value) end end end def add_menu(menu_info) btn_info = menu_info.shift mbtn = TkMenubutton.new(@frame) if btn_info.kind_of?(Hash) for key, value in btn_info mbtn.configure(key, value) end elsif btn_info.kind_of?(Array) mbtn.configure('text', btn_info[0]) if btn_info[0] mbtn.configure('underline', btn_info[1]) if btn_info[1] mbtn.configure('accelerator', btn_info[2]) if btn_info[2] else mbtn.configure('text', btn_info) end menu = TkMenu.new(mbtn) for item_info in menu_info if item_info.kind_of?(Hash) menu.add('command', item_info) elsif item_info.kind_of?(Array) options = {} options['label'] = item_info[0] if item_info[0] options['command'] = item_info[1] if item_info[1] options['underline'] = item_info[2] if item_info[2] options['accelerator'] = item_info[3] if item_info[3] menu.add('command', options) elsif /^-+$/ =~ item_info menu.add('sep') else menu.add('command', 'label' => item_info) end end mbtn.menu(menu) @menus.push([mbtn, menu]) add_delegates('tearoff', menu) add_delegates('foreground', mbtn, menu) add_delegates('background', mbtn, menu) add_delegates('disabledforeground', mbtn, menu) add_delegates('activeforeground', mbtn, menu) add_delegates('activebackground', mbtn, menu) add_delegates('font', mbtn, menu) add_delegates('kanjifont', mbtn, menu) mbtn.pack('side' => 'left') end def add_delegates(option, *wins) unless @delegates @delegates = {} @delegates['DEFAULT'] = @frame end if @delegates[option].kind_of?(Array) for i in wins @delegates[option].push(i) end else @delegates[option] = wins end end def [](index) return @menus[index] end def method_missing(msg, *args) @frame.send(msg, *args) end end --Multipart_Thu_Jan_22_11:49:49_1998-1--