mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
4cb164ee2a
* tkafter.rb: Add self to 1st argument of interval- and loop-proc TkAfter#current_interval returns an interval (sleep) time value TkAfter#current_args returns an array of arguments TkAfter#return_value returns a return value of last loop-proc e.g. TkAfter.new( proc{|obj| 500 - obj.current_interval}, 10, [proc{|obj| p obj.current_args}, 'proc', 1], proc{|obj| p obj.current_args; ['return', 2]}, [proc{|obj| p obj.return_value p ['proc', obj.current_args[0].call(obj.return_value[1], obj.current_args[1])]}, proc{|*args| args[0] + args[1]}, 1], proc{p ['proc', 4]} ).start(100) * tk*.rb: Allow to use Symbols for parameters. Allow new notation of constructor (also allow old notation). e.g. TkFrame.new('classname'=>'User'){|base| pack f = TkFrame.new(base, :classname=>'ButtonFrame').pack TkButton.new( :parent => f, :text => 'Quit', :command => proc{exit} ).pack( :fill => :x, :pady => 2 ) } * tkcanvas.rb: (TkcItem) Add 'coords' parameter to the canvas item constructor (for new notation of constructor). e.g. c = TkCanvas.new.pack l = TkcLine.new(c, :coords=>[[0,0], [100,100]]) * tcltklib.c: New 'mainloop' and 'mainloop_watchdog'. The priority of their event-loop can be controlled. They accept an optional argument. If it false, they don't exit although the root widget is destroyed. This function is sometimes useful, if it is used with 'restart'. 'mainloop' can't treat Thread#join/value in a callback routine. (e.g. TkButton.new(:command=>proc{p Thread.new{button.invoke}.value}) ) 'mainloop_watchdog' can treat them, but watchdog thread is always running (so, a little heavier than 'mainloop'). If the purpose of using Thread#join/value is to do something under some safe-level, please use Proc object. (e.g. :command=>proc{$SAFE=1;proc{$SAFE=2;button.invoke}.call;p $SAFE}) * tk.rb: Support functions of new 'mainloop' and 'mainloop_watchdog'. * tk.rb: (Tk.restart) Add 'app-name' paramater and 'use' parameter. 'app-name' specifies the name and the resource class of the application. If 'app-name' is specified to 'xxx', the application class on the resource database is set to 'Xxx' and the application name is changed by the same rule of Tk.appname method. 'use' specifies the main window for embedding the root widget instead of generating a new window. * tk.rb: Add new parameter 'widgetname' to the widget constructor to support effective use of Resource Database. For example, the resource 'Xxx*quit.text: QUIT' can set the text of the button generated by the following code. e.g. Tk.restart('Xxx') TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack Tk.mainloop * tk.rb: TkOption::get always returns a tainted string. Add TkOption::new_proc_class. It generates a class to import procedures defined on the resource database. For example, there is a following resource file. ----< resource-test >------------ *CMD.foo: {|*args| p [$SAFE, :foo, args]} *CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]} *Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)} --------------------------------- The following code is a sample of use of the resource file. e.g. require 'tk' TkOption.readfile 'resource-test' p TkOption.new_proc_class(:CMD, [:foo], 1) p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD) TkButton.new(:text=>'test').pack Tk.mainloop git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2515 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
143 lines
3.6 KiB
Ruby
143 lines
3.6 KiB
Ruby
#
|
|
# tkmenubar.rb
|
|
#
|
|
# 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')
|
|
|
|
# The format of the menu_spec is:
|
|
# [
|
|
# [
|
|
# [button text, underline, accelerator],
|
|
# [menu label, command, underline, accelerator],
|
|
# '---', # separator
|
|
# ...
|
|
# ],
|
|
# ...
|
|
# ]
|
|
|
|
# underline and accelerator are optional parameters.
|
|
# Hashes are OK instead of Arrays.
|
|
|
|
# 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"
|
|
|
|
class TkMenubar<TkFrame
|
|
|
|
include TkComposite
|
|
|
|
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 = []
|
|
|
|
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])
|
|
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')
|
|
end
|
|
|
|
def [](index)
|
|
return @menus[index]
|
|
end
|
|
end
|