[#5880] "Linux Journal Vol.6" carries an article on Ruby — Shin-ichiro HARA <sinara@...>

原です。

16 messages 1998/01/19
[#5881] Re: "Linux Journal Vol.6" carries an article on Ruby — matz@... (Yukihiro Matsumoto) 1998/01/19

まつもと ゆきひろです

[#5905] win and unix, and so on — TAKAHASHI Masayoshi <maki@...>

高橋と申します。はじめまして。しばらくROMしてました。

27 messages 1998/01/20
[#5906] Re: win and unix, and so on — matz@... (Yukihiro Matsumoto) 1998/01/20

まつもと ゆきひろです

[#5912] Re: win and unix, and so on — WATANABE Hirofumi <watanabe@...> 1998/01/20

わたなべです.

[#5922] Re: win and unix, and so on — Shin-ichiro HARA <sinara@...> 1998/01/20

原です。

[#5951] How to use TkMenu ? — Kikutani Makoto <kikutani@...>

きくたにです。

16 messages 1998/01/21
[#5952] Re: How to use TkMenu ? — matz@... (Yukihiro Matsumoto) 1998/01/21

まつもと ゆきひろです

[#6023] Comparison with Other Languages (Re: [python-ml-jp 54] Re: Reasons why I prefer to use Python) — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

8 messages 1998/01/26

[#6055] Ruby連載 第3回 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

68 messages 1998/01/28
[#6057] Re: Ruby 連載 第 3 回 — Kikutani Makoto <kikutani@...> 1998/01/28

きくたにです。

[#6060] Re: Ruby 連載 第 3 回 — matz@... (Yukihiro Matsumoto) 1998/01/28

まつもと ゆきひろです

[#6073] Re: Ruby連載 第3回 — hisanori@... 1998/01/28

松尾です。こんばんは。

[#6089] Re: Ruby連載 第3回 — matz@... (Yukihiro Matsumoto) 1998/01/29

まつもと ゆきひろです

[#6119] man/date/time — Tadayoshi Funaba <tadf@...>

こんにちは、ちょっと訊きたいことがあります。

37 messages 1998/01/29
[#6128] lib/date.rb (Re: man/date/time) — matz@... (Yukihiro Matsumoto) 1998/01/30

まつもと ゆきひろです

[#6136] Re: man/date/time — keiju@... (石塚圭樹 ) 1998/01/30

けいじゅ@日本ラショナルソフトウェアです.

[#6155] Re: man/date/time — Tadayoshi Funaba <tadf@...> 1998/01/31

>すいません. ruby-devにだけポストしていました.

[ruby-list:5966] Re: How to use TkMenu ?

From: shugo@... (Shugo Maeda)
Date: 1998-01-22 03:01:14 UTC
List: ruby-list #5966
前田です。

In message "[ruby-list:5956] Re: How to use TkMenu ?"
Kikutani Makoto <kikutani@po.eis.or.jp> 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する必要があります。

-- 
前田 修吾

Attachments (1)

tkmenubar.rb (2.19 KB, text/x-ruby)
# 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

In This Thread