mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 13:34:17 +02:00

* 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/trunk@24063 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
137 lines
4.1 KiB
Ruby
137 lines
4.1 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<Tk::Frame
|
|
include TkComposite
|
|
include TkMenuSpec
|
|
|
|
def initialize(parent = nil, spec = nil, options = {})
|
|
if parent.kind_of? Hash
|
|
options = parent
|
|
parent = nil
|
|
spec = (options.has_key?('spec'))? options.delete('spec'): nil
|
|
end
|
|
|
|
_symbolkey2str(options)
|
|
menuspec_opt = {}
|
|
TkMenuSpec::MENUSPEC_OPTKEYS.each{|key|
|
|
menuspec_opt[key] = options.delete(key) if options.has_key?(key)
|
|
}
|
|
|
|
super(parent, options)
|
|
|
|
@menus = []
|
|
|
|
spec.each{|info| add_menu(info, menuspec_opt)} if spec
|
|
|
|
options.each{|key, value| configure(key, value)} if options
|
|
end
|
|
|
|
def add_menu(menu_info, menuspec_opt={})
|
|
mbtn, menu = _create_menubutton(@frame, menu_info, menuspec_opt)
|
|
|
|
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
|