diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-12 15:25:49 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-12 15:25:49 +0000 |
commit | c0271cadd7c49f2c3304e93f6190da0b8623c1f3 (patch) | |
tree | ae877225c9d33c23865c14f81a6cf6252f10e590 /ext/tk/lib/tk/menubar.rb | |
parent | 82593c058f0a61d8d4bcf7279fed496022330246 (diff) |
* ext/tcltklib/extconf.rb: [EXPERIMENTAL] MacOS X (darwin) support
* ext/tcltklib/tcltklib.c: fix thread trouble on callback proc, and
eliminate warning about instance variable access
* ext/tk/lib/tk/menubar.rb: improve supported menu_spec
* ext/tk/lib/tk/menuspec.rb: [add] menu_spec support library
* ext/tk/lib/tk/root.rb: add menu_spec support
* ext/tk/lib/tk/text.rb: bug fix
* ext/tk/lib/tk/toplevel.rb: add menu_spec support
* ext/tk/sample/menubar?.rb: [add] sample of menu_spec usage
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6454 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/lib/tk/menubar.rb')
-rw-r--r-- | ext/tk/lib/tk/menubar.rb | 127 |
1 files changed, 57 insertions, 70 deletions
diff --git a/ext/tk/lib/tk/menubar.rb b/ext/tk/lib/tk/menubar.rb index 2c2846e9b6..f29c40ff38 100644 --- a/ext/tk/lib/tk/menubar.rb +++ b/ext/tk/lib/tk/menubar.rb @@ -1,8 +1,9 @@ # # tk/menubar.rb # -# Copyright (C) 1998 maeda shugo. All rights reserved. -# This file can be distributed under the terms of the Ruby. +# Original version: +# Copyright (C) 1998 maeda shugo. All rights reserved. +# This file can be distributed under the terms of the Ruby. # Usage: # @@ -41,30 +42,56 @@ # menubar.configure('activeforeground', 'red') # menubar.configure('font', '-adobe-helvetica-bold-r-*--12-*-iso8859-1') # menubar.pack('side'=>'top', 'fill'=>'x') - -# The format of the menu_spec is: -# [ -# [ -# [button text, underline, accelerator], -# [menu label, command, underline, accelerator], -# '---', # separator -# ... -# ], -# ... +# +# +# OR +# +# radio_var = TkVariable.new('y') +# menu_spec = [ +# [['File', 0], +# {:label=>'Open', :command=>proc{puts('Open clicked')}, :underline=>0}, +# '---', +# ['Check_A', TkVariable.new(true), 6], +# {:type=>'checkbutton', :label=>'Check_B', +# :variable=>TkVariable.new, :underline=>6}, +# '---', +# ['Radio_X', [radio_var, 'x'], 6], +# ['Radio_Y', [radio_var, 'y'], 6], +# ['Radio_Z', [radio_var, 'z'], 6], +# '---', +# ['cascade', [ +# ['sss', proc{p 'sss'}, 0], +# ['ttt', proc{p 'ttt'}, 0], +# ['uuu', proc{p 'uuu'}, 0], +# ['vvv', proc{p 'vvv'}, 0], +# ], 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'=>'Helvetia 12 bold') +# menubar.pack('side'=>'top', 'fill'=>'x') -# underline and accelerator are optional parameters. -# Hashes are OK instead of Arrays. +# See tk/menuspce.rb about the format of the menu_spec # To use add_menu, configuration must be done by calling configure after # adding all menus by add_menu, not by the constructor arguments. require 'tk' require 'tk/frame' +require 'tk/composite' +require 'tk/menuspec' class TkMenubar<TkFrame - include TkComposite + include TkMenuSpec def initialize(parent = nil, spec = nil, options = nil) if parent.kind_of? Hash @@ -77,65 +104,25 @@ class TkMenubar<TkFrame @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 + spec.each{|info| add_menu(info)} if spec + + options.each{|key, value| configure(key, value)} if options 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) + mbtn, menu = _create_menubutton(@frame, menu_info) + + submenus = _get_cascade_menus(menu).flatten + @menus.push([mbtn, menu]) - delegate('tearoff', menu) - delegate('foreground', mbtn, menu) - delegate('background', mbtn, menu) - delegate('disabledforeground', mbtn, menu) - delegate('activeforeground', mbtn, menu) - delegate('activebackground', mbtn, menu) - delegate('font', mbtn, menu) - delegate('kanjifont', mbtn, menu) - mbtn.pack('side' => 'left') + delegate('tearoff', menu, *submenus) + delegate('foreground', mbtn, menu, *submenus) + delegate('background', mbtn, menu, *submenus) + delegate('disabledforeground', mbtn, menu, *submenus) + delegate('activeforeground', mbtn, menu, *submenus) + delegate('activebackground', mbtn, menu, *submenus) + delegate('font', mbtn, menu, *submenus) + delegate('kanjifont', mbtn, menu, *submenus) end def [](index) |