mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

* 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/branches/ruby_1_8@6454 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
131 lines
3.7 KiB
Ruby
131 lines
3.7 KiB
Ruby
#
|
|
# tk/menubar.rb
|
|
#
|
|
# Original version:
|
|
# Copyright (C) 1998 maeda shugo. All rights reserved.
|
|
# This file can be distributed under the terms of the Ruby.
|
|
|
|
# Usage:
|
|
#
|
|
# 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')
|
|
#
|
|
#
|
|
# OR
|
|
#
|
|
#
|
|
# 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')
|
|
#
|
|
#
|
|
# 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')
|
|
|
|
# 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
|
|
options = _symbolkey2str(parent)
|
|
spec = options.delete('spec')
|
|
super(options)
|
|
else
|
|
super(parent, options)
|
|
end
|
|
|
|
@menus = []
|
|
|
|
spec.each{|info| add_menu(info)} if spec
|
|
|
|
options.each{|key, value| configure(key, value)} if options
|
|
end
|
|
|
|
def add_menu(menu_info)
|
|
mbtn, menu = _create_menubutton(@frame, menu_info)
|
|
|
|
submenus = _get_cascade_menus(menu).flatten
|
|
|
|
@menus.push([mbtn, menu])
|
|
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)
|
|
return @menus[index]
|
|
end
|
|
end
|