1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/tk/sample/tktree.rb
nagai 41d41fbdb9 * ext/tk/stubs.c: When --enable-tcltk-stubs, the initialize
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
2005-07-28 09:14:59 +00:00

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