ffi-tk 2009.11.29
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +748 -0
- data/MANIFEST +188 -0
- data/README.md +85 -0
- data/Rakefile +47 -0
- data/TODO.md +62 -0
- data/bin/rwish +33 -0
- data/doc/MIT_LICENSE +18 -0
- data/doc/TCL_LICENSE +39 -0
- data/example/choose_color.rb +22 -0
- data/example/choose_directory.rb +22 -0
- data/example/dialog.rb +37 -0
- data/example/hello.rb +11 -0
- data/example/message_box.rb +26 -0
- data/example/option_menu.rb +17 -0
- data/example/popup.rb +24 -0
- data/example/set_palette.rb +32 -0
- data/example/text.rb +47 -0
- data/example/tile/kroc_demo_small.rb +123 -0
- data/example/tile/kroc_rb_demo.rb +135 -0
- data/example/tile/notebook.rb +48 -0
- data/example/tile/theme_hello.rb +38 -0
- data/example/tile/treeview.rb +71 -0
- data/example/various.rb +25 -0
- data/example/wait.rb +16 -0
- data/ffi-tk.gemspec +33 -0
- data/lib/ffi-tk.rb +76 -0
- data/lib/ffi-tk/command.rb +39 -0
- data/lib/ffi-tk/command/after.rb +36 -0
- data/lib/ffi-tk/command/bell.rb +34 -0
- data/lib/ffi-tk/command/bind.rb +11 -0
- data/lib/ffi-tk/command/bindtags.rb +69 -0
- data/lib/ffi-tk/command/cget.rb +92 -0
- data/lib/ffi-tk/command/choose_color.rb +29 -0
- data/lib/ffi-tk/command/choose_directory.rb +45 -0
- data/lib/ffi-tk/command/clipboard.rb +102 -0
- data/lib/ffi-tk/command/configure.rb +88 -0
- data/lib/ffi-tk/command/destroy.rb +12 -0
- data/lib/ffi-tk/command/dialog.rb +54 -0
- data/lib/ffi-tk/command/event.rb +79 -0
- data/lib/ffi-tk/command/focus.rb +70 -0
- data/lib/ffi-tk/command/font.rb +124 -0
- data/lib/ffi-tk/command/get_open_file.rb +85 -0
- data/lib/ffi-tk/command/get_save_file.rb +83 -0
- data/lib/ffi-tk/command/grab.rb +141 -0
- data/lib/ffi-tk/command/grid.rb +246 -0
- data/lib/ffi-tk/command/image.rb +79 -0
- data/lib/ffi-tk/command/lower.rb +23 -0
- data/lib/ffi-tk/command/message_box.rb +65 -0
- data/lib/ffi-tk/command/option_menu.rb +8 -0
- data/lib/ffi-tk/command/pack.rb +99 -0
- data/lib/ffi-tk/command/place.rb +91 -0
- data/lib/ffi-tk/command/popup.rb +14 -0
- data/lib/ffi-tk/command/raise.rb +25 -0
- data/lib/ffi-tk/command/scrollable.rb +151 -0
- data/lib/ffi-tk/command/selection.rb +132 -0
- data/lib/ffi-tk/command/set_palette.rb +9 -0
- data/lib/ffi-tk/command/tk_cmd.rb +155 -0
- data/lib/ffi-tk/command/vars.rb +82 -0
- data/lib/ffi-tk/command/wait.rb +39 -0
- data/lib/ffi-tk/command/winfo.rb +668 -0
- data/lib/ffi-tk/command/wm.rb +1025 -0
- data/lib/ffi-tk/core_extensions.rb +154 -0
- data/lib/ffi-tk/event/data.rb +60 -0
- data/lib/ffi-tk/event/handler.rb +44 -0
- data/lib/ffi-tk/ffi/tcl.rb +92 -0
- data/lib/ffi-tk/ffi/tcl/cmd_proc.rb +10 -0
- data/lib/ffi-tk/ffi/tcl/eval_result.rb +148 -0
- data/lib/ffi-tk/ffi/tcl/interp.rb +95 -0
- data/lib/ffi-tk/ffi/tcl/obj.rb +89 -0
- data/lib/ffi-tk/ffi/tcl/time.rb +36 -0
- data/lib/ffi-tk/ffi/tk.rb +35 -0
- data/lib/ffi-tk/geometry.rb +32 -0
- data/lib/ffi-tk/thread_sender.rb +26 -0
- data/lib/ffi-tk/tk.rb +222 -0
- data/lib/ffi-tk/variable.rb +46 -0
- data/lib/ffi-tk/widget.rb +68 -0
- data/lib/ffi-tk/widget/button.rb +41 -0
- data/lib/ffi-tk/widget/canvas.rb +806 -0
- data/lib/ffi-tk/widget/canvas/arc.rb +18 -0
- data/lib/ffi-tk/widget/canvas/bitmap.rb +13 -0
- data/lib/ffi-tk/widget/canvas/image.rb +10 -0
- data/lib/ffi-tk/widget/canvas/item.rb +170 -0
- data/lib/ffi-tk/widget/canvas/line.rb +16 -0
- data/lib/ffi-tk/widget/canvas/oval.rb +15 -0
- data/lib/ffi-tk/widget/canvas/polygon.rb +16 -0
- data/lib/ffi-tk/widget/canvas/rectangle.rb +15 -0
- data/lib/ffi-tk/widget/canvas/text.rb +15 -0
- data/lib/ffi-tk/widget/canvas/window.rb +11 -0
- data/lib/ffi-tk/widget/checkbutton.rb +63 -0
- data/lib/ffi-tk/widget/entry.rb +208 -0
- data/lib/ffi-tk/widget/frame.rb +12 -0
- data/lib/ffi-tk/widget/label.rb +26 -0
- data/lib/ffi-tk/widget/labelframe.rb +7 -0
- data/lib/ffi-tk/widget/listbox.rb +192 -0
- data/lib/ffi-tk/widget/menu.rb +318 -0
- data/lib/ffi-tk/widget/menubutton.rb +7 -0
- data/lib/ffi-tk/widget/message.rb +36 -0
- data/lib/ffi-tk/widget/panedwindow.rb +164 -0
- data/lib/ffi-tk/widget/radiobutton.rb +43 -0
- data/lib/ffi-tk/widget/root.rb +8 -0
- data/lib/ffi-tk/widget/scale.rb +44 -0
- data/lib/ffi-tk/widget/scrollbar.rb +114 -0
- data/lib/ffi-tk/widget/spinbox.rb +198 -0
- data/lib/ffi-tk/widget/text.rb +893 -0
- data/lib/ffi-tk/widget/text/peer.rb +10 -0
- data/lib/ffi-tk/widget/tile.rb +70 -0
- data/lib/ffi-tk/widget/tile/button.rb +8 -0
- data/lib/ffi-tk/widget/tile/checkbutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/combobox.rb +43 -0
- data/lib/ffi-tk/widget/tile/entry.rb +8 -0
- data/lib/ffi-tk/widget/tile/frame.rb +13 -0
- data/lib/ffi-tk/widget/tile/label.rb +9 -0
- data/lib/ffi-tk/widget/tile/labelframe.rb +8 -0
- data/lib/ffi-tk/widget/tile/menubutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/notebook.rb +93 -0
- data/lib/ffi-tk/widget/tile/panedwindow.rb +9 -0
- data/lib/ffi-tk/widget/tile/progressbar.rb +59 -0
- data/lib/ffi-tk/widget/tile/radiobutton.rb +8 -0
- data/lib/ffi-tk/widget/tile/scale.rb +8 -0
- data/lib/ffi-tk/widget/tile/scrollbar.rb +41 -0
- data/lib/ffi-tk/widget/tile/separator.rb +23 -0
- data/lib/ffi-tk/widget/tile/sizegrip.rb +24 -0
- data/lib/ffi-tk/widget/tile/style.rb +114 -0
- data/lib/ffi-tk/widget/tile/treeview.rb +414 -0
- data/lib/ffi-tk/widget/toplevel.rb +14 -0
- data/spec/ffi-tk/command/bindtags.rb +18 -0
- data/spec/ffi-tk/command/clipboard.rb +18 -0
- data/spec/ffi-tk/command/font.rb +67 -0
- data/spec/ffi-tk/command/grid.rb +6 -0
- data/spec/ffi-tk/command/image.rb +26 -0
- data/spec/ffi-tk/command/pack.rb +20 -0
- data/spec/ffi-tk/command/place.rb +20 -0
- data/spec/ffi-tk/command/selection.rb +13 -0
- data/spec/ffi-tk/command/vars.rb +32 -0
- data/spec/ffi-tk/command/winfo.rb +233 -0
- data/spec/ffi-tk/command/wm.rb +185 -0
- data/spec/ffi-tk/event.rb +95 -0
- data/spec/ffi-tk/tile/button.rb +51 -0
- data/spec/ffi-tk/tile/checkbutton.rb +13 -0
- data/spec/ffi-tk/tile/combobox.rb +65 -0
- data/spec/ffi-tk/tile/entry.rb +61 -0
- data/spec/ffi-tk/tile/frame.rb +65 -0
- data/spec/ffi-tk/tile/label.rb +17 -0
- data/spec/ffi-tk/tile/labelframe.rb +13 -0
- data/spec/ffi-tk/tile/menubutton.rb +13 -0
- data/spec/ffi-tk/tile/notebook.rb +103 -0
- data/spec/ffi-tk/tile/panedwindow.rb +13 -0
- data/spec/ffi-tk/tile/progressbar.rb +78 -0
- data/spec/ffi-tk/tile/radiobutton.rb +13 -0
- data/spec/ffi-tk/tile/scale.rb +13 -0
- data/spec/ffi-tk/tile/scrollbar.rb +43 -0
- data/spec/ffi-tk/tile/separator.rb +22 -0
- data/spec/ffi-tk/tile/sizegrip.rb +13 -0
- data/spec/ffi-tk/tile/style.rb +161 -0
- data/spec/ffi-tk/tile/treeview.rb +101 -0
- data/spec/ffi-tk/variable.rb +24 -0
- data/spec/ffi-tk/widget/button.rb +22 -0
- data/spec/ffi-tk/widget/canvas.rb +169 -0
- data/spec/ffi-tk/widget/checkbutton.rb +44 -0
- data/spec/ffi-tk/widget/entry.rb +155 -0
- data/spec/ffi-tk/widget/frame.rb +8 -0
- data/spec/ffi-tk/widget/label.rb +16 -0
- data/spec/ffi-tk/widget/labelframe.rb +12 -0
- data/spec/ffi-tk/widget/listbox.rb +19 -0
- data/spec/ffi-tk/widget/menu.rb +12 -0
- data/spec/ffi-tk/widget/menubutton.rb +12 -0
- data/spec/ffi-tk/widget/message.rb +12 -0
- data/spec/ffi-tk/widget/panedwindow.rb +12 -0
- data/spec/ffi-tk/widget/radiobutton.rb +12 -0
- data/spec/ffi-tk/widget/root.rb +9 -0
- data/spec/ffi-tk/widget/scale.rb +12 -0
- data/spec/ffi-tk/widget/scrollbar.rb +12 -0
- data/spec/ffi-tk/widget/spinbox.rb +12 -0
- data/spec/ffi-tk/widget/text.rb +246 -0
- data/spec/ffi-tk/widget/toplevel.rb +12 -0
- data/spec/helper.rb +3 -0
- data/tasks/authors.rake +21 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +18 -0
- data/tasks/gem.rake +22 -0
- data/tasks/gem_setup.rake +113 -0
- data/tasks/grancher.rake +12 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/rcov.rake +17 -0
- data/tasks/release.rake +65 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/setup.rake +12 -0
- data/tasks/ycov.rake +84 -0
- metadata +261 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module Tk
|
2
|
+
module Tile
|
3
|
+
class Sizegrip < Tk::Widget
|
4
|
+
def self.tk_command; 'ttk::sizegrip'; end
|
5
|
+
include TileWidget, Cget, Configure
|
6
|
+
|
7
|
+
# # USAGE
|
8
|
+
# Using pack:
|
9
|
+
# pack [ttk::frame $top.statusbar] -side bottom -fill x
|
10
|
+
# pack [ttk::sizegrip $top.statusbar.grip] -side right -anchor se
|
11
|
+
# Using grid:
|
12
|
+
# grid [ttk::sizegrip $top.statusbar.grip] \
|
13
|
+
# -row $lastRow -column $lastColumn -sticky se
|
14
|
+
# # ... optional: add vertical scrollbar in $lastColumn,
|
15
|
+
# # ... optional: add horizontal scrollbar in $lastRow
|
16
|
+
|
17
|
+
# BUG: http://tcl.activestate.com/man/tcl8.5/TkCmd/ttk_sizegrip.htm
|
18
|
+
# If the containing toplevel's position was specified relative to the
|
19
|
+
# right or bottom of the screen (e.g., 'wm geometry ... wxh-x-y' instead
|
20
|
+
# of “wm geometry ... wxh+x+y”), the sizegrip widget will not resize the
|
21
|
+
# window. ttk::sizegrip widgets only support “southeast” resizing.
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Tk
|
2
|
+
module Tile
|
3
|
+
def self.style(style, parent_name)
|
4
|
+
[style, parent_name.to_s.split('::').last].join('.')
|
5
|
+
end
|
6
|
+
|
7
|
+
module Style
|
8
|
+
extend Tk::Cget, Tk::Configure
|
9
|
+
TkkStyleCmd = 'ttk::style'.freeze
|
10
|
+
|
11
|
+
# Returns a list of all known themes.
|
12
|
+
def self.theme_names
|
13
|
+
Tk.execute('ttk::style', 'theme', 'names')
|
14
|
+
end
|
15
|
+
|
16
|
+
# Sets the current theme to themeName, and refreshes all widgets.
|
17
|
+
def self.theme_use(name)
|
18
|
+
return unless theme_names.include? name
|
19
|
+
Tk.execute_only('ttk::style', 'theme', 'use', name) && name
|
20
|
+
end
|
21
|
+
|
22
|
+
# Temporarily sets the current theme to themeName, evaluate script,
|
23
|
+
# then restore the previous theme. Typically script simply defines
|
24
|
+
# styles and elements, though arbitrary Tcl code may appear.
|
25
|
+
def self.theme_settings(name, &block)
|
26
|
+
return unless block
|
27
|
+
raise ArgumentError unless theme_names.include? name
|
28
|
+
|
29
|
+
id = Tk.uuid(:proc){|uuid| Tk.callbacks[uuid] = block }
|
30
|
+
cmd = "{ RubyFFI::callback #{id} }"
|
31
|
+
Tk.eval "ttk::style theme settings #{name} #{cmd}"
|
32
|
+
#Tk.execute_only('ttk::style', 'theme', 'settings', name, cmd)
|
33
|
+
Tk.callbacks.delete(id) if id
|
34
|
+
name
|
35
|
+
end
|
36
|
+
|
37
|
+
# Creates a new theme. It is an error if themeName already exists.
|
38
|
+
# If -parent is specified, the new theme will inherit styles, elements, and
|
39
|
+
# layouts from the parent theme basedon. If -settings is present, script is
|
40
|
+
# evaluated in the context of the new theme as per ttk::style theme settings.
|
41
|
+
def self.theme_create(name, options={}, &block)
|
42
|
+
raise ArgumentError if theme_names.include? name
|
43
|
+
options = options.to_tcl_options
|
44
|
+
|
45
|
+
if block
|
46
|
+
id = Tk.uuid(:proc){|uuid| Tk.callbacks[uuid] = block }
|
47
|
+
options << " -settings { RubyFFI::callback #{id} }"
|
48
|
+
end
|
49
|
+
res = Tk.execute_only('ttk::style', 'theme', 'create', name, options)
|
50
|
+
Tk.callbacks.delete(id) if id
|
51
|
+
res
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# Returns the list of elements defined in the current theme.
|
56
|
+
def self.element_names
|
57
|
+
Tk.execute('ttk::style', 'element', 'names')
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns the list of element's options.
|
61
|
+
def self.element_options(name)
|
62
|
+
return unless element_names.include? name
|
63
|
+
Tk.execute('ttk::style', 'element', 'options', name).to_a
|
64
|
+
end
|
65
|
+
|
66
|
+
# Creates a new element in the current theme of type type. The only
|
67
|
+
# built-in element type is image (see ttk_image(n)), although themes
|
68
|
+
# may define other element types (see Ttk_RegisterElementFactory).
|
69
|
+
def self.element_create(name, type, args=nil, options={})
|
70
|
+
if type == 'image' || type == :image
|
71
|
+
Tk.execute_only('ttk::style', 'element', 'create', name, 'image', args, options.to_tcl_options)
|
72
|
+
else
|
73
|
+
#Tk.execute_only('ttk::style', 'element', 'create', name, type)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# Define the widget layout for style style. See LAYOUTS below for the format
|
79
|
+
# of layoutSpec. If layoutSpec is omitted, return the layout specification
|
80
|
+
# for style style.
|
81
|
+
def self.layout(name, layout_spec)
|
82
|
+
Tk.execute_only('ttk::style', 'layout', name, layout_spec)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Sets dynamic values of the specified option(s) in style.
|
86
|
+
# Each statespec / value pair is examined in order; the value
|
87
|
+
# corresponding to the first matching statespec is used.
|
88
|
+
def self.map(style, options={})
|
89
|
+
style.kind_of?(Hash) && (options, style = style, nil)
|
90
|
+
style = '.' unless style
|
91
|
+
|
92
|
+
Tk.execute_only('ttk::style', 'map', style, options.to_tcl_options )
|
93
|
+
end
|
94
|
+
|
95
|
+
# Sets the default value of the specified option(s) in style.
|
96
|
+
def self.configure(style=nil, options={})
|
97
|
+
style.kind_of?(Hash) && (keys, style = style, nil)
|
98
|
+
style = '.' unless style
|
99
|
+
|
100
|
+
Tk.execute_only('ttk::style','configure', style, options.to_tcl_options)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns the value specified for -option in style style in state
|
104
|
+
# state, using the standard lookup rules for element options.
|
105
|
+
# state is a list of state names; if omitted, it defaults to all
|
106
|
+
# bits off (the “normal” state). If the default argument is present,
|
107
|
+
# it is used as a fallback value in case no specification
|
108
|
+
# for -option is found.
|
109
|
+
def self.lookup(style, option, state=Tk::None, default=Tk::None)
|
110
|
+
Tk.execute('ttk::style', 'lookup', style, option.to_tcl_option, state, default).to_s
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,414 @@
|
|
1
|
+
module Tk
|
2
|
+
module Tile
|
3
|
+
# The ttk::treeview widget displays a hierarchical collection of items.
|
4
|
+
# Each item has a textual label, an optional image, and an optional list of
|
5
|
+
# data values.
|
6
|
+
# The data values are displayed in successive columns after the tree label.
|
7
|
+
# The order in which data values are displayed may be controlled by setting
|
8
|
+
# the -displaycolumns widget option.
|
9
|
+
# The tree widget can also display column headings.
|
10
|
+
# Columns may be accessed by number or by symbolic names listed in the
|
11
|
+
# -columns widget option; see COLUMN IDENTIFIERS.
|
12
|
+
# Each item is identified by a unique name.
|
13
|
+
# The widget will generate item IDs if they are not supplied by the caller.
|
14
|
+
# There is a distinguished root item, named {}.
|
15
|
+
# The root item itself is not displayed; its children appear at the top
|
16
|
+
# level of the hierarchy.
|
17
|
+
# Each item also has a list of tags, which can be used to associate event
|
18
|
+
# bindings with individual items and control the appearance of the item.
|
19
|
+
# Treeview widgets support horizontal and vertical scrolling with the
|
20
|
+
# standard -[xy]scrollcommand options and [xy]view widget commands.
|
21
|
+
class Treeview < Tk::Widget
|
22
|
+
include Tk::Tile::TileWidget, Cget, Configure
|
23
|
+
|
24
|
+
def self.tk_command; 'ttk::treeview'; end
|
25
|
+
|
26
|
+
# Delete all items
|
27
|
+
def clear
|
28
|
+
delete(*children(nil))
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the bounding box (relative to the treeview widget's window) of
|
32
|
+
# the specified item in the form x y width height.
|
33
|
+
# If column is specified, returns the bounding box of that cell.
|
34
|
+
# If the item is not visible (i.e., if it is a descendant of a closed item
|
35
|
+
# or is scrolled offscreen), returns the empty list.
|
36
|
+
def bbox(item, column = None)
|
37
|
+
execute(:bbox, item, column)
|
38
|
+
end
|
39
|
+
|
40
|
+
# If newchildren is not specified, returns the list of children belonging
|
41
|
+
# to item.
|
42
|
+
# If newchildren is specified, replaces item's child list with newchildren.
|
43
|
+
# Items in the old child list not present in the new child list are
|
44
|
+
# detached from the tree.
|
45
|
+
# None of the items in newchildren may be an ancestor of item.
|
46
|
+
def children(item, *new_children)
|
47
|
+
if new_children.empty?
|
48
|
+
execute(:children, item).to_a.map{|child| Item.new(self, child) }
|
49
|
+
else
|
50
|
+
execute(:children, item, *new_children.flatten)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Query or modify the options for the specified column.
|
55
|
+
#
|
56
|
+
# If no +options+ is specified, returns an Hash of option/value pairs.
|
57
|
+
#
|
58
|
+
# If +options+ is a Symbol/String, returns the value of that option.
|
59
|
+
#
|
60
|
+
# Otherwise, the options are updated with the specified values.
|
61
|
+
#
|
62
|
+
# The following options may be set on each column:
|
63
|
+
# id: name
|
64
|
+
# The column name. This is a read-only option. For example
|
65
|
+
# `list.column('#n')` returns the data column associated with display
|
66
|
+
# column `#n`.
|
67
|
+
#
|
68
|
+
# anchor: name
|
69
|
+
# Specifies how the text in this column should be aligned with respect
|
70
|
+
# to the cell.
|
71
|
+
# One of n, ne, e, se, s, sw, w, nw, or center.
|
72
|
+
#
|
73
|
+
# minwidth: width
|
74
|
+
# The minimum width of the column in pixels.
|
75
|
+
# The treeview widget will not make the column any smaller than
|
76
|
+
# minwidth when the widget is resized or the user drags a column
|
77
|
+
# separator.
|
78
|
+
#
|
79
|
+
# stretch: boolean
|
80
|
+
# Specifies whether or not the column's width should be adjusted when
|
81
|
+
# the widget is resized.
|
82
|
+
#
|
83
|
+
# width: w
|
84
|
+
# The width of the column in pixels.
|
85
|
+
# Default is something reasonable, probably 200 or so.
|
86
|
+
#
|
87
|
+
# Use +column+ '#0' to configure the tree column.
|
88
|
+
def column(column, options = None)
|
89
|
+
common_configure([:column, column], options, stretch: :boolean)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Deletes each of the items in +items+ and all of their descendants.
|
93
|
+
# The root item may not be deleted.
|
94
|
+
#
|
95
|
+
# @see detach
|
96
|
+
def delete(*items)
|
97
|
+
items = items.flatten
|
98
|
+
execute_only(:delete, items) if items.any?
|
99
|
+
end
|
100
|
+
|
101
|
+
# Unlinks all of the specified items in +items+ from the tree.
|
102
|
+
# The items and all of their descendants are still present and may be
|
103
|
+
# reinserted at another point in the tree but will not be displayed.
|
104
|
+
# The root item may not be detached.
|
105
|
+
#
|
106
|
+
# @see delete
|
107
|
+
def detach(*items)
|
108
|
+
execute(:detach, *items.flatten)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns true if the specified item is present in the tree, false
|
112
|
+
# otherwise.
|
113
|
+
def exists(item)
|
114
|
+
execute(:exists, item).to_boolean
|
115
|
+
end
|
116
|
+
alias exist? exists
|
117
|
+
|
118
|
+
# If item is specified, sets the focus item to item.
|
119
|
+
# Otherwise, returns the current focus item, or {} if there is none.
|
120
|
+
def focus_item(item = None)
|
121
|
+
result = execute(:focus, item)
|
122
|
+
Item.new(self, result) if result
|
123
|
+
end
|
124
|
+
|
125
|
+
# Query or modify the heading options for the specified column.
|
126
|
+
# Valid options are: -text text The text to display in the column heading.
|
127
|
+
# -image imageName Specifies an image to display to the right of the column
|
128
|
+
# heading. -anchor anchor Specifies how the heading text should be aligned.
|
129
|
+
# One of the standard Tk anchor values.
|
130
|
+
# -command script A script to evaluate when the heading label is pressed.
|
131
|
+
# Use pathname heading #0 to configure the tree column heading.
|
132
|
+
def heading(column, options = None)
|
133
|
+
common_configure([:heading, column], options)
|
134
|
+
end
|
135
|
+
|
136
|
+
# Returns a description of the specified component under the point given by
|
137
|
+
# x and y, or the empty string if no such component is present at that
|
138
|
+
# position. The following subcommands are supported:
|
139
|
+
def identify_component(x, y)
|
140
|
+
execute(:identify, component, x, y)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Returns the item ID of the item at position y.
|
144
|
+
def identify_row(x, y)
|
145
|
+
execute(:identify, row, x, y)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Returns the data column identifier of the cell at position x.
|
149
|
+
# The tree column has ID #0.
|
150
|
+
def identify_column(x, y)
|
151
|
+
execute(:identify, column, x, y)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns the integer index of item within its parent's list of children.
|
155
|
+
def index(item)
|
156
|
+
execute(:index, item)
|
157
|
+
end
|
158
|
+
|
159
|
+
# Creates a new item.
|
160
|
+
# parent is the item ID of the parent item, or the empty string {} to
|
161
|
+
# create a new top-level item.
|
162
|
+
# index is an integer, or the value end, specifying where in the list of
|
163
|
+
# parent's children to insert the new item.
|
164
|
+
# If index is less than or equal to zero, the new node is inserted at the
|
165
|
+
# beginning; if index is greater than or equal to the current number of
|
166
|
+
# children, it is inserted at the end.
|
167
|
+
# If -id is specified, it is used as the item identifier; id must not
|
168
|
+
# already exist in the tree.
|
169
|
+
# Otherwise, a new unique identifier is generated.
|
170
|
+
#
|
171
|
+
# Returns the item identifier of the newly created item.
|
172
|
+
def insert(parent, index, options = {})
|
173
|
+
id = execute(:insert, parent, index, options.to_tcl_options)
|
174
|
+
Item.new(self, id)
|
175
|
+
end
|
176
|
+
|
177
|
+
Item = Struct.new(:tk_parent, :id)
|
178
|
+
class Item
|
179
|
+
def initialize(tk_parent, id)
|
180
|
+
self.tk_parent, self.id = tk_parent, id.to_s
|
181
|
+
end
|
182
|
+
|
183
|
+
def insert(index, options = {})
|
184
|
+
tk_parent.insert(id, index, options)
|
185
|
+
end
|
186
|
+
|
187
|
+
def index
|
188
|
+
tk_parent.index(id)
|
189
|
+
end
|
190
|
+
|
191
|
+
def options(options = None)
|
192
|
+
tk_parent.item(id, options)
|
193
|
+
end
|
194
|
+
|
195
|
+
def bbox(column = None)
|
196
|
+
tk_parent.bbox(id, column).to_a
|
197
|
+
end
|
198
|
+
|
199
|
+
def move(parent, index)
|
200
|
+
tk_parent.move_item(id, parent, index)
|
201
|
+
end
|
202
|
+
|
203
|
+
def delete
|
204
|
+
tk_parent.delete(id)
|
205
|
+
end
|
206
|
+
|
207
|
+
def detach
|
208
|
+
tk_parent.detach(id)
|
209
|
+
end
|
210
|
+
|
211
|
+
def exists
|
212
|
+
tk_parent.exists(id)
|
213
|
+
end
|
214
|
+
alias exist? exists
|
215
|
+
|
216
|
+
def children(*new_children)
|
217
|
+
tk_parent.children(id, *new_children)
|
218
|
+
end
|
219
|
+
|
220
|
+
def selection_add
|
221
|
+
tk_parent.selection_add(id)
|
222
|
+
end
|
223
|
+
alias select selection_add
|
224
|
+
|
225
|
+
def selection_remove
|
226
|
+
tk_parent.selection_remove(id)
|
227
|
+
end
|
228
|
+
alias deselect selection_remove
|
229
|
+
|
230
|
+
def selection_toggle
|
231
|
+
tk_parent.selection_toggle(id)
|
232
|
+
end
|
233
|
+
alias toggle selection_toggle
|
234
|
+
|
235
|
+
def set(column = None, value = None)
|
236
|
+
tk_parent.set(id, column, value)
|
237
|
+
end
|
238
|
+
|
239
|
+
def prev
|
240
|
+
tk_parent.prev(id)
|
241
|
+
end
|
242
|
+
|
243
|
+
def next
|
244
|
+
tk_parent.next(id)
|
245
|
+
end
|
246
|
+
|
247
|
+
def parent
|
248
|
+
tk_parent.parent(id)
|
249
|
+
end
|
250
|
+
|
251
|
+
def focus
|
252
|
+
tk_parent.focus_item(id)
|
253
|
+
end
|
254
|
+
|
255
|
+
def see
|
256
|
+
tk_parent.see(id)
|
257
|
+
end
|
258
|
+
|
259
|
+
def to_tcl
|
260
|
+
id
|
261
|
+
end
|
262
|
+
|
263
|
+
def inspect
|
264
|
+
"#<Treeview::Item @tk_parent=%p @id=%p>" % [tk_parent.tk_pathname, id]
|
265
|
+
end
|
266
|
+
|
267
|
+
private :id=
|
268
|
+
end
|
269
|
+
|
270
|
+
# Test the widget state, execute passed block if state matches statespec.
|
271
|
+
def instate(statespec)
|
272
|
+
result = execute(:instate, statespec).to_boolean
|
273
|
+
yield if result && block_given?
|
274
|
+
result
|
275
|
+
end
|
276
|
+
|
277
|
+
# Query or modify the options for the specified item.
|
278
|
+
# If no -option is specified, returns a dictionary of option/value pairs.
|
279
|
+
# If a single -option is specified, returns the value of that option.
|
280
|
+
# Otherwise, the item's options are updated with the specified values.
|
281
|
+
# See ITEM OPTIONS for the list of available options.
|
282
|
+
def item(item, options = None)
|
283
|
+
common_configure([:item, item], options)
|
284
|
+
end
|
285
|
+
|
286
|
+
# Moves item to position index in parent's list of children.
|
287
|
+
# It is illegal to move an item under one of its descendants.
|
288
|
+
# If index is less than or equal to zero, item is moved to the beginning;
|
289
|
+
# if greater than or equal to the number of children, it is moved to the
|
290
|
+
# end.
|
291
|
+
def move(item, parent, index)
|
292
|
+
execute(:move, item, parent, index)
|
293
|
+
end
|
294
|
+
|
295
|
+
# Returns the item's next sibling, or nil if item is the last child of its
|
296
|
+
# parent.
|
297
|
+
def next(item)
|
298
|
+
id = execute(:next, item)
|
299
|
+
Item.new(self, id) if id
|
300
|
+
end
|
301
|
+
|
302
|
+
# Returns the parent of item, or nil if item is at the top level of the
|
303
|
+
# hierarchy.
|
304
|
+
def parent(item)
|
305
|
+
id = execute(:parent, item)
|
306
|
+
Item.new(self, id) if id
|
307
|
+
end
|
308
|
+
|
309
|
+
# Returns the item's previous sibling, or nil if item is the first child
|
310
|
+
# of its parent.
|
311
|
+
def prev(item)
|
312
|
+
id = execute(:prev, item)
|
313
|
+
Item.new(self, id) if id
|
314
|
+
end
|
315
|
+
|
316
|
+
# Ensure that item is visible: sets all of item's ancestors to -open true,
|
317
|
+
# and scrolls the widget if necessary so that item is within the visible
|
318
|
+
# portion of the tree.
|
319
|
+
def see(item)
|
320
|
+
execute(:see, item)
|
321
|
+
end
|
322
|
+
|
323
|
+
# Returns the list of selected items.
|
324
|
+
def selection
|
325
|
+
execute(:selection).to_a
|
326
|
+
end
|
327
|
+
|
328
|
+
# +items+ becomes the new selection.
|
329
|
+
def selection_set(*items)
|
330
|
+
execute(:selection, set, *items.flatten)
|
331
|
+
end
|
332
|
+
|
333
|
+
# Add +items+ to the selection
|
334
|
+
def selection_add(*items)
|
335
|
+
execute(:selection, :add, *items.flatten)
|
336
|
+
end
|
337
|
+
|
338
|
+
# Remove +items+ from the selection
|
339
|
+
def selection_remove(*items)
|
340
|
+
execute(:selection, :remove, *items.flatten)
|
341
|
+
end
|
342
|
+
|
343
|
+
# Toggle the selection state of each item in +items+.
|
344
|
+
def selection_toggle(*items)
|
345
|
+
execute(:selection, :toggle, *items.flatten)
|
346
|
+
end
|
347
|
+
|
348
|
+
# With one argument, returns a dictionary of column/value pairs for the
|
349
|
+
# specified item.
|
350
|
+
# With two arguments, returns the current value of the specified column.
|
351
|
+
# With three arguments, sets the value of column column in item item to
|
352
|
+
# the specified value.
|
353
|
+
# See also COLUMN IDENTIFIERS.
|
354
|
+
def set(item, column = None, value = None)
|
355
|
+
if None == column
|
356
|
+
execute(:set, item)
|
357
|
+
elsif None == value
|
358
|
+
execute(:set, item, column).to_s
|
359
|
+
else
|
360
|
+
execute_only(:set, item, column, value)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
# Modify or query the widget state; see ttk::widget(n).
|
365
|
+
def state(state_spec = None)
|
366
|
+
execute(:state, state_spec)
|
367
|
+
end
|
368
|
+
|
369
|
+
# Add a Tk binding script for the event sequence sequence to the tag
|
370
|
+
# tagName. When an X event is delivered to an item, binding scripts for
|
371
|
+
# each of the item's -tags are evaluated in order as per bindtags(n).
|
372
|
+
# <KeyPress>, <KeyRelease>, and virtual events are sent to the focus item.
|
373
|
+
# <ButtonPress>, <ButtonRelease>, and <Motion> events are sent to the
|
374
|
+
# item under the mouse pointer.
|
375
|
+
# No other event types are supported.
|
376
|
+
# The binding script undergoes %-substitutions before evaluation; see
|
377
|
+
# bind(n) for details.
|
378
|
+
def tag_bind(tag_name, sequence = None, &script)
|
379
|
+
execute(:tag, :bind, tag_name, sequence, script)
|
380
|
+
end
|
381
|
+
|
382
|
+
# Query or modify the options for the specified tagName.
|
383
|
+
# If one or more option/value pairs are specified, sets the value of those
|
384
|
+
# options for the specified tag.
|
385
|
+
# If a single option is specified, returns the value of that option (or the
|
386
|
+
# empty string if the option has not been specified for tagName).
|
387
|
+
# With no additional arguments, returns a dictionary of the option
|
388
|
+
# settings for tagName.
|
389
|
+
# See TAG OPTIONS for the list of available options.
|
390
|
+
def tag_configure(tag_name, options = None)
|
391
|
+
common_configure([:tag, :configure, tag_name], options)
|
392
|
+
end
|
393
|
+
|
394
|
+
# Standard command for horizontal scrolling; see widget(n).
|
395
|
+
def xview(args)
|
396
|
+
execute(:xview, args)
|
397
|
+
end
|
398
|
+
|
399
|
+
# Standard command for vertical scrolling; see ttk::widget(n).
|
400
|
+
# Each item should have the same number of values as the -columns widget
|
401
|
+
# option. If there are fewer values than columns, the remaining values are
|
402
|
+
# assumed empty.
|
403
|
+
# If there are more values than columns, the extra values are ignored.
|
404
|
+
# Specifies the text foreground color.
|
405
|
+
# Specifies the cell or item background color.
|
406
|
+
# Generated whenever the selection changes.
|
407
|
+
# Generated just before setting the focus item to -open true.
|
408
|
+
# Generated just after setting the focus item to -open false.
|
409
|
+
def yview(args)
|
410
|
+
execute(:yview, args)
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|