mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
41d41fbdb9
routine creates a Tcl/Tk interpreter and deletes it. However, init cost of Tk's MainWindow is not so small. And that makes it impossible to use libraries written with Tcl functions only on an environment without a graphical display. This changes support delaying initalization of Tk_Stubs until the script needs Tk. * ext/tk/stubs.h: New file. Define prototypes and return codes of functions on stubs.c. * ext/tk/tcltklib.c: Support delaying initalization of Tk_Stubs until the script needs Tk. * ext/tk/tcltklib.c: Show friendly error messages for errors on initialization. * ext/tk/tcltklib.c: Avoid SEGV on ip_finalize() when ruby is exiting and $DEBUG is true. (Not fix. If you know the reason of why, please fix it.) * ext/tk/tkutil/tkutil.c (ary2list, ary2list2): bug fix on handling of encoding. * ext/tk/lib/multi-tk.rb: MultiTkIp#eval_string and bg_eval_string don't work propery. * ext/tk/lib/tk.rb: Forget extending Tk::Encoding module to Tk. * ext/tk/lib/tk/variable.rb: TkVarAccess fails to initialize the object for an element of a Tcl's array variable. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8860 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
103 lines
3.2 KiB
Ruby
103 lines
3.2 KiB
Ruby
##########################################################################
|
|
# TkTree widget class
|
|
#
|
|
# see <http://wiki.tcl.tk/10615>
|
|
#
|
|
# Note: optional argument '-font' of the Tcl library is changed to
|
|
# 'itemfont' on this Ruby library, because of avoiding font
|
|
# operation trouble in 'initialize' method ( see the following
|
|
# test script ).
|
|
#
|
|
##########################################################################
|
|
require 'tk'
|
|
|
|
class TkTree < TkCanvas
|
|
TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'tktree.tcl')
|
|
|
|
def create_self(keys)
|
|
args = [@path]
|
|
if keys.kind_of?(Hash)
|
|
font = keys.delete('itemfont')
|
|
# font = hash_kv(font) if font.kind_of?(Hash)
|
|
keys['font'] = font if font
|
|
# args.concat(hash_kv(keys))
|
|
args << keys
|
|
end
|
|
begin
|
|
tk_call('::tktree::treecreate', *args)
|
|
rescue NameError, RuntimeError
|
|
Tk.load_tclscript(TkTree::TCL_SCRIPT_PATH)
|
|
tk_call('::tktree::treecreate', *args)
|
|
end
|
|
end
|
|
|
|
def newitem(itempath, keys = nil)
|
|
if keys.kind_of?(Hash)
|
|
keys = _symbolkey2str(keys)
|
|
font = keys.delete('itemfont')
|
|
# font = hash_kv(font) if font.kind_of?(Hash)
|
|
keys['font'] = font if font
|
|
# tk_call('::tktree::newitem', @path, itempath, *hash_kv(keys))
|
|
tk_call('::tktree::newitem', @path, itempath, keys)
|
|
else
|
|
tk_call('::tktree::newitem', @path, itempath)
|
|
end
|
|
end
|
|
|
|
def delitem(itempath)
|
|
tk_call('::tktree::delitem', @path, itempath)
|
|
end
|
|
|
|
def labelat(xpos, ypos)
|
|
tk_call('::tktree::delitem', @path, xpos, ypos)
|
|
end
|
|
|
|
def getselection
|
|
tk_call('::tktree::getselection', @path)
|
|
end
|
|
|
|
def setselection(itempath)
|
|
tk_call('::tktree::getselection', @path, itempath)
|
|
end
|
|
end
|
|
|
|
|
|
##########################################################################
|
|
# test script
|
|
##########################################################################
|
|
if __FILE__ == $0
|
|
TkLabel.new(:text=><<EOL, :relief=>:ridge, :justify=>:left).pack
|
|
|
|
This is a sample to use a Tcl library script on Ruby/Tk.
|
|
This sample loads tktree.tcl (see <http://wiki.tcl.tk/10615>)
|
|
and calls functions of the Tcl script.
|
|
EOL
|
|
|
|
items = %w(/group1/item1 /group1/item2 /group1/subgroup/item1 /group2/item1 /item1)
|
|
|
|
tr1 = TkTree.new.pack(:expand=>true, :fill=>:both)
|
|
tr1.focus
|
|
|
|
items.each{|item|
|
|
tr1.newitem(item,
|
|
:command=>proc{Tk.messageBox(:message=>"#{item} executed")})
|
|
}
|
|
|
|
f = TkFrame.new.pack(:expand=>true, :fill=>:both)
|
|
tr2 = TkTree.new(f, :bg=>'black', #:itemfont=>{:family=>'Times', :size=>14},
|
|
:textcolor=>'red', :bd=>4, :relief=>:ridge,
|
|
:selectbackground=>'darkBlue', :selectforeground=>'yellow',
|
|
:selectborderwidth=>3, :linecolor=>'yellow') {
|
|
yscrollbar(TkScrollbar.new(f, :width=>10).pack(:side=>:right, :fill=>:y))
|
|
xscrollbar(TkScrollbar.new(f, :width=>10).pack(:side=>:bottom, :fill=>:x))
|
|
pack(:expand=>true, :fill=>:both)
|
|
}
|
|
|
|
items.each{|item|
|
|
tr2.newitem(item, :textcolor=>'green', :image=>'',
|
|
:itemfont=>{:family=>'Times', :size=>10},
|
|
:command=>proc{Tk.messageBox(:message=>"#{item} executed")})
|
|
}
|
|
|
|
Tk.mainloop
|
|
end
|