mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tk/*: full update Ruby/Tk to support Ruby(1.9|1.8) and Tc/Tk8.5.
* ext/tk/lib/tkextlib/tile.rb: [incompatible] remove TileWidgets' instate/state/identify method to avoid the conflict with standard widget options. Those methods are renamed to ttk_instate/ttk_state/ ttk_identify (tile_instate/tile_state/tile_identify are available too). Although I don't recommend, if you realy need old methods, please define "Tk::USE_OBSOLETE_TILE_STATE_METHOD = true" before "require 'tkextlib/tile'". * ext/tk/lib/tkextlib/tile.rb: "Tk::Tile::__Import_Tile_Widgets__!" is obsolete. It outputs warning. To control default widget set, use "Tk.default_widget_set = :Ttk". * ext/tk/lib/tk.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind as module methods of TkConfigMethod. It may help users to wrap old Ruby/Tk scripts (use standard widgets) to force to use Ttk widgets. Ttk widgets don't have some options of standard widgets which are control the view of widgets. When set ignore-mode true, configure method tries to ignoure such unknown options with no exception. Of course, it may raise other troubles on the GUI design. So, those are a little danger methods. * ext/tk/lib/tk/itemconfig.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind as module methods of TkItemConfigMethod as the same purpose as TkConfigMethod's ones. * ext/tk/sample/ttk_wrapper.rb: A new example. This is a tool for wrapping old Ruby/Tk scripts (which use standard widgets) to use Ttk (Tile) widgets as default. * ext/tk/sample/tkextlib/tile/demo.rb: use ttk_instate/ttk_state method instead of instate/state method. * ext/tk/lib/tk/root, ext/tk/lib/tk/namespace.rb, ext/tk/lib/tk/text.rb, ext/tk/lib/tkextlib/*: some 'instance_eval's are replaced to "instance_exec(self)". * ext/tk/lib/tk/event.rb: bug fix on KEY_TBL and PROC_TBL (?x is not a character code on Ruby1.9). * ext/tk/lib/tk/variable.rb: support new style of operation argument on Tcl/Tk's 'trace' command for variables. * ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget: bug fix * ext/tk/sammple/demos-jp/textpeer.rb, ext/tk/sammple/demos-en/textpeer.rb: new widget demo. * ext/tk/tcltklib.c: decrase SEGV troubles (probably) * ext/tk/lib/tk.rb: remove Thread.critical access if Ruby1.9 * ext/tk/lib/tk/multi-tk.rb: support Ruby1.9 (probably) * ext/tk/lib/tkextlib/tile.rb: add method to define Tcl/Tk command to make Tcl/Tk theme sources (based on different version of Tile extension) available. (Tk::Tile::__define_LoadImages_proc_for_comaptibility__) * ext/tk/lib/tk.rb, ext/tk/lib/tk/wm.rb: support dockable frames (Tcl/Tk8.5 feature). 'wm' command can treat many kinds of widgets as toplevel widgets. * ext/tk/lib/tkextlib/tile/style.rb: ditto. (Tk::Tile::Style.__define_wrapper_proc_for_compatibility__) * ext/tk/lib/tk/font.rb: add actual_hash and metrics_hash to get properties as a hash. metrics_hash method returns a boolean value for 'fixed' option. But metrics method returns numeric value (0 or 1) for 'fixed' option, because of backward compatibility. * ext/tk/lib/tk/timer.rb: somtimes fail to set callback procedure. * ext/tk/lib/tk.rb: add Tk.sleep and Tk.wakeup method. Tk.sleep doesn't block the eventloop. It will be better to use the method in event callbacks. * ext/tk/sample/tksleep_sample.rb: sample script about Tk.sleep. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15848 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b62af05a98
commit
3024ffdc3a
121 changed files with 7879 additions and 2218 deletions
|
@ -19,8 +19,93 @@ end
|
|||
class << Tk::Tile::Style
|
||||
if Tk::Tile::TILE_SPEC_VERSION_ID < 8
|
||||
TkCommandNames = ['style'.freeze].freeze
|
||||
else
|
||||
|
||||
# --- Tk::Tile::Style.__define_wrapper_proc_for_compatibility__! ---
|
||||
# On Ttk (Tile) extension, 'style' command has imcompatible changes
|
||||
# depend on the version of the extention. It requires modifying the
|
||||
# Tcl/Tk scripts to define local styles. The rule for modification
|
||||
# is a simple one. But, if users want to keep compatibility between
|
||||
# versions of the extension, they will have to contrive to do that.
|
||||
# It may be troublesome, especially for Ruby/Tk users.
|
||||
# This method may help such work. This method make some definitions
|
||||
# on the Tcl/Tk interpreter to work with different version of style
|
||||
# command format. Please give attention to use this method. It may
|
||||
# conflict with some definitions on Tcl/Tk scripts.
|
||||
if Tk::Tile::TILE_SPEC_VERSION_ID < 7
|
||||
def __define_wrapper_proc_for_compatibility__!
|
||||
unless Tk.info(:commands, '::ttk::style').empty?
|
||||
fail RuntimeError,
|
||||
"can't define ':ttk::style' command (already exist)"
|
||||
end
|
||||
TkCore::INTERP.add_tk_procs('::ttk::style', 'args', <<-'EOS')
|
||||
if [string equal [lrange $args 0 1] {element create}] {
|
||||
if [string equal [lindex $args 3] image] {
|
||||
set spec [lindex $args 4]
|
||||
set map [lrange $spec 1 end]
|
||||
if [llength $map] {
|
||||
# return [eval [concat [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
|
||||
return [uplevel 1 [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]
|
||||
}
|
||||
}
|
||||
}
|
||||
# return [eval "::style $args"]
|
||||
return [uplevel 1 ::style $args]
|
||||
EOS
|
||||
#########################
|
||||
end
|
||||
else ### TILE_SPEC_VERSION_ID == 7
|
||||
def __define_wrapper_proc_for_compatibility__!
|
||||
unless Tk.info(:commands, '::ttk::style').empty?
|
||||
fail RuntimeError,
|
||||
"can't define ':ttk::style' command (already exist)"
|
||||
end
|
||||
TkCore::INTERP.add_tk_procs('::ttk::style', 'args', <<-'EOS')
|
||||
if [string equal [lrange $args 0 1] {element create}] {
|
||||
if [string equal [lindex $args 3] image] {
|
||||
set spec [lindex $args 4]
|
||||
set map [lrange $spec 1 end]
|
||||
if [llength $map] {
|
||||
# return [eval [concat [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
|
||||
return [uplevel 1 [list ::style element create [lindex $args 2] image [lindex $spec 0] -map $map] [lrange $args 5 end]]]
|
||||
}
|
||||
}
|
||||
} elseif [string equal [lindex $args 0] default] {
|
||||
# return [eval "::style [lreplace $args 0 0 configure]"]
|
||||
return [uplevel 1 ::style [lreplace $args 0 0 configure]]
|
||||
}
|
||||
# return [eval "::style $args"]
|
||||
return [uplevel 1 ::style $args]
|
||||
EOS
|
||||
#########################
|
||||
end
|
||||
end
|
||||
else ### TILE_SPEC_VERSION_ID >= 8
|
||||
TkCommandNames = ['::ttk::style'.freeze].freeze
|
||||
|
||||
def __define_wrapper_proc_for_compatibility__!
|
||||
unless Tk.info(:commands, '::style').empty?
|
||||
fail RuntimeError, "can't define '::style' command (already exist)"
|
||||
end
|
||||
TkCore::INTERP.add_tk_procs('::style', 'args', <<-'EOS')
|
||||
if [string equal [lrange $args 0 1] {element create}] {
|
||||
if [string equal [lindex $args 3] image] {
|
||||
set name [lindex $args 4]
|
||||
set opts [lrange $args 5 end]
|
||||
set idx [lsearch $opts -map]
|
||||
if {$idx >= 0 && [expr $idx % 2 == 0]} {
|
||||
# return [eval [concat [list ::ttk::style element create [lindex $args 2] image [concat $name [lindex $opts [expr $idx + 1]]]] [lreplace $opts $idx [expr $idx + 1]]]]
|
||||
return [uplevel 1 [list ::ttk::style element create [lindex $args 2] image [concat $name [lindex $opts [expr $idx + 1]]]] [lreplace $opts $idx [expr $idx + 1]]]
|
||||
}
|
||||
}
|
||||
} elseif [string equal [lindex $args 0] default] {
|
||||
# return [eval "::ttk::style [lreplace $args 0 0 configure]"]
|
||||
return [uplevel 1 ::ttk::style [lreplace $args 0 0 configure]]
|
||||
}
|
||||
# return [eval "::ttk::style $args"]
|
||||
return [uplevel 1 ::ttk::style $args]
|
||||
EOS
|
||||
#########################
|
||||
end
|
||||
end
|
||||
|
||||
def configure(style=nil, keys=nil)
|
||||
|
@ -98,7 +183,52 @@ class << Tk::Tile::Style
|
|||
end
|
||||
|
||||
def element_create(name, type, *args)
|
||||
tk_call(TkCommandNames[0], 'element', 'create', name, type, *args)
|
||||
if type == 'image' || type == :image
|
||||
element_create_image(name, *args)
|
||||
else
|
||||
tk_call(TkCommandNames[0], 'element', 'create', name, type, *args)
|
||||
end
|
||||
end
|
||||
|
||||
def element_create_image(name, *args)
|
||||
fail ArgumentError, 'Must supply a base image' unless (spec = args.shift)
|
||||
if (opts = args.shift)
|
||||
if opts.kind_of?(Hash)
|
||||
opts = _symbolkey2str(opts)
|
||||
else
|
||||
fail ArgumentError, 'bad option'
|
||||
end
|
||||
end
|
||||
fail ArgumentError, 'too many arguments' unless args.empty?
|
||||
|
||||
if spec.kind_of?(Array)
|
||||
# probably, command format is tile 0.8+ (Tcl/Tk8.5+) style
|
||||
if Tk::Tile::TILE_SPEC_VERSION_ID >= 8
|
||||
if opts
|
||||
tk_call(TkCommandNames[0],
|
||||
'element', 'create', name, 'image', spec, opts)
|
||||
else
|
||||
tk_call(TkCommandNames[0], 'element', 'create', name, 'image', spec)
|
||||
end
|
||||
else
|
||||
fail ArgumentError, 'illegal arguments' if opts.key?('map')
|
||||
base = spec.shift
|
||||
opts['map'] = spec
|
||||
tk_call(TkCommandNames[0],
|
||||
'element', 'create', name, 'image', base, opts)
|
||||
end
|
||||
else
|
||||
# probably, command format is tile 0.7.8 or older style
|
||||
if Tk::Tile::TILE_SPEC_VERSION_ID >= 8
|
||||
spec = [spec, *(opts.delete('map'))] if opts.key?('map')
|
||||
end
|
||||
if opts
|
||||
tk_call(TkCommandNames[0],
|
||||
'element', 'create', name, 'image', spec, opts)
|
||||
else
|
||||
tk_call(TkCommandNames[0], 'element', 'create', name, 'image', spec)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def element_names()
|
||||
|
|
|
@ -381,7 +381,7 @@ module Tk::Tile::TreeviewConfig
|
|||
when :item, 'item'
|
||||
['width']
|
||||
when :column, 'column'
|
||||
super(id[1])
|
||||
super(id[1]) + ['minwidth']
|
||||
when :tag, 'tag'
|
||||
super(id[1])
|
||||
when :heading, 'heading'
|
||||
|
@ -413,7 +413,7 @@ module Tk::Tile::TreeviewConfig
|
|||
when :item, 'item'
|
||||
['open']
|
||||
when :column, 'column'
|
||||
super(id[1])
|
||||
super(id[1]) + ['stretch']
|
||||
when :tag, 'tag'
|
||||
super(id[1])
|
||||
when :heading, 'heading'
|
||||
|
@ -617,30 +617,43 @@ end
|
|||
|
||||
class Tk::Tile::Treeview::Item < TkObject
|
||||
ItemID_TBL = TkCore::INTERP.create_table
|
||||
TkCore::INTERP.init_ip_env{ Tk::Tile::Treeview::Item::ItemID_TBL.clear }
|
||||
|
||||
TkCore::INTERP.init_ip_env{
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.clear
|
||||
}
|
||||
}
|
||||
|
||||
def self.id2obj(tree, id)
|
||||
tpath = tree.path
|
||||
return id unless Tk::Tile::Treeview::Item::ItemID_TBL[tpath]
|
||||
(Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id])? \
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]: id
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath]
|
||||
(Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id])? \
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]: id
|
||||
else
|
||||
id
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def self.assign(tree, id)
|
||||
tpath = tree.path
|
||||
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
|
||||
return Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
|
||||
end
|
||||
obj = nil
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
|
||||
return Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id]
|
||||
end
|
||||
|
||||
obj = self.allocate
|
||||
obj.instance_eval{
|
||||
@parent = @t = tree
|
||||
@tpath = tpath
|
||||
@path = @id = id
|
||||
obj = self.allocate
|
||||
obj.instance_eval{
|
||||
@parent = @t = tree
|
||||
@tpath = tpath
|
||||
@path = @id = id
|
||||
}
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath] ||= {}
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id] = obj
|
||||
}
|
||||
ItemID_TBL[tpath] = {} unless ItemID_TBL[tpath]
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath][id] = obj
|
||||
obj
|
||||
end
|
||||
|
||||
|
@ -669,8 +682,10 @@ class Tk::Tile::Treeview::Item < TkObject
|
|||
@parent = @t = tree
|
||||
@tpath = tree.path
|
||||
@path = @id = _insert_item(@t, parent_item, idx, keys)
|
||||
ItemID_TBL[@tpath] = {} unless ItemID_TBL[@tpath]
|
||||
ItemID_TBL[@tpath][@id] = self
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
ItemID_TBL[@tpath] = {} unless ItemID_TBL[@tpath]
|
||||
ItemID_TBL[@tpath][@id] = self
|
||||
}
|
||||
end
|
||||
def id
|
||||
@id
|
||||
|
@ -804,22 +819,35 @@ end
|
|||
class Tk::Tile::Treeview::Root < Tk::Tile::Treeview::Item
|
||||
def self.new(tree, keys = {})
|
||||
tpath = tree.path
|
||||
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
|
||||
else
|
||||
super(tree, keys)
|
||||
end
|
||||
obj = nil
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
if Tk::Tile::Treeview::Item::ItemID_TBL[tpath] &&
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
|
||||
obj = Tk::Tile::Treeview::Item::ItemID_TBL[tpath]['']
|
||||
else
|
||||
#super(tree, keys)
|
||||
(obj = self.allocate).instance_eval{
|
||||
@parent = @t = tree
|
||||
@tpath = tree.path
|
||||
@path = @id = ''
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] ||= {}
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
|
||||
}
|
||||
end
|
||||
}
|
||||
obj.configure(keys) if keys && ! keys.empty?
|
||||
obj
|
||||
end
|
||||
|
||||
def initialize(tree, keys = {})
|
||||
# dummy:: not called by 'new' method
|
||||
@parent = @t = tree
|
||||
@tpath = tree.path
|
||||
@path = @id = ''
|
||||
unless Tk::Tile::Treeview::Item::ItemID_TBL[@tpath]
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] = {}
|
||||
end
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath] ||= {}
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL[@tpath][@id] = self
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -829,24 +857,42 @@ class Tk::Tile::Treeview::Tag < TkObject
|
|||
include TkTreatTagFont
|
||||
|
||||
TagID_TBL = TkCore::INTERP.create_table
|
||||
Tag_ID = ['tile_treeview_tag'.freeze, '00000'.taint].freeze
|
||||
|
||||
TkCore::INTERP.init_ip_env{ Tk::Tile::Treeview::Tag::TagID_TBL.clear }
|
||||
(Tag_ID = ['tile_treeview_tag'.freeze, '00000'.taint]).instance_eval{
|
||||
@mutex = Mutex.new
|
||||
def mutex; @mutex; end
|
||||
freeze
|
||||
}
|
||||
|
||||
TkCore::INTERP.init_ip_env{
|
||||
Tk::Tile::Treeview::Tag::TagID_TBL.mutex.synchronize{
|
||||
Tk::Tile::Treeview::Tag::TagID_TBL.clear
|
||||
}
|
||||
}
|
||||
|
||||
def self.id2obj(tree, id)
|
||||
tpath = tree.path
|
||||
return id unless Tk::Tile::Treeview::Tag::TagID_TBL[tpath]
|
||||
(Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id])? \
|
||||
Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id]: id
|
||||
Tk::Tile::Treeview::Tag::TagID_TBL.mutex.synchronize{
|
||||
if Tk::Tile::Treeview::Tag::TagID_TBL[tpath]
|
||||
(Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id])? \
|
||||
Tk::Tile::Treeview::Tag::TagID_TBL[tpath][id]: id
|
||||
else
|
||||
id
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def initialize(tree, keys=nil)
|
||||
@parent = @t = tree
|
||||
@tpath = tree.path
|
||||
@path = @id = Tag_ID.join(TkCore::INTERP._ip_id_)
|
||||
TagID_TBL[@tpath] = {} unless TagID_TBL[@tpath]
|
||||
TagID_TBL[@tpath][@id] = self
|
||||
Tag_ID[1].succ!
|
||||
Tag_ID.mutex.synchronize{
|
||||
@path = @id = Tag_ID.join(TkCore::INTERP._ip_id_)
|
||||
Tag_ID[1].succ!
|
||||
}
|
||||
TagID_TBL.mutex.synchronize{
|
||||
TagID_TBL[@tpath] = {} unless TagID_TBL[@tpath]
|
||||
TagID_TBL[@tpath][@id] = self
|
||||
}
|
||||
if keys && keys != None
|
||||
tk_call_without_enc(@tpath, 'tag', 'configure', *hash_kv(keys, true))
|
||||
end
|
||||
|
@ -919,8 +965,12 @@ class Tk::Tile::Treeview < TkWindow
|
|||
WidgetClassNames[WidgetClassName] = self
|
||||
|
||||
def __destroy_hook__
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.delete(@path)
|
||||
Tk::Tile::Treeview::Tag::ItemID_TBL.delete(@path)
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.mutex.synchronize{
|
||||
Tk::Tile::Treeview::Item::ItemID_TBL.delete(@path)
|
||||
}
|
||||
Tk::Tile::Treeview::Tag::ItemID_TBL.mutex.synchronize{
|
||||
Tk::Tile::Treeview::Tag::ItemID_TBL.delete(@path)
|
||||
}
|
||||
end
|
||||
|
||||
def self.style(*args)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue