ffi-tk 2009.11.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,70 @@
|
|
|
1
|
+
module Tk
|
|
2
|
+
# Utility methods for managing the input focus.
|
|
3
|
+
module Focus
|
|
4
|
+
module_function
|
|
5
|
+
|
|
6
|
+
def focus(window = None, option = None)
|
|
7
|
+
if window == None
|
|
8
|
+
Tk.execute('focus')
|
|
9
|
+
else
|
|
10
|
+
case option
|
|
11
|
+
when None
|
|
12
|
+
Tk.execute('focus', window)
|
|
13
|
+
when :displayof
|
|
14
|
+
Tk.execute('focus', '-displayof', window)
|
|
15
|
+
when :force
|
|
16
|
+
Tk.execute_only('focus', '-force', window)
|
|
17
|
+
when :lastfor
|
|
18
|
+
Tk.execute('focus', '-lastfor', window)
|
|
19
|
+
else
|
|
20
|
+
raise ArgumentError, "option must be one of: None, :displayof, :force, :lastfor"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This method changes the focus model for the application to an implicit one
|
|
26
|
+
# where the window under the mouse gets the focus.
|
|
27
|
+
# After this method is called, whenever the mouse enters a window Tk will
|
|
28
|
+
# automatically give it the input focus.
|
|
29
|
+
# The focus command may be used to move the focus to a window other than the
|
|
30
|
+
# one under the mouse, but as soon as the mouse moves into a new window the
|
|
31
|
+
# focus will jump to that window.
|
|
32
|
+
#
|
|
33
|
+
# Note: at present there is no built-in support for returning the
|
|
34
|
+
# application to an explicit focus model; to do this you will have to write
|
|
35
|
+
# a script that deletes the bindings created by tk_focusFollowsMouse.
|
|
36
|
+
def follows_mouse
|
|
37
|
+
Tk.execute_only(:tk_focusFollowsMouse)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# A method used for keyboard traversal.
|
|
41
|
+
# It returns the "next" window after +window+ in focus order.
|
|
42
|
+
#
|
|
43
|
+
# The focus order is determined by the stacking order of windows and the
|
|
44
|
+
# structure of the window hierarchy.
|
|
45
|
+
# Among siblings, the focus order is the same as the stacking order, with
|
|
46
|
+
# the lowest window being first.
|
|
47
|
+
#
|
|
48
|
+
# If a window has children, the window is visited first, followed by its
|
|
49
|
+
# children (recursively), followed by its next sibling.
|
|
50
|
+
#
|
|
51
|
+
# Top-level windows other than +window+ are skipped, so that it never
|
|
52
|
+
# returns a window in a different top-level from +window+.
|
|
53
|
+
#
|
|
54
|
+
# After computing the next window, it examines the window's :takefocus
|
|
55
|
+
# option to see whether it should be skipped.
|
|
56
|
+
#
|
|
57
|
+
# If so, it continues on to the next window in the focus order, until it
|
|
58
|
+
# eventually finds a window that will accept the focus or returns back to
|
|
59
|
+
# window.
|
|
60
|
+
def next(window)
|
|
61
|
+
Tk.execute(:tk_focusNext, window)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Similar to [Focus.next], except that it returns the window just before
|
|
65
|
+
# +window+ in the focus order.
|
|
66
|
+
def prev(window)
|
|
67
|
+
Tk.execute(:tk_focusPrev, window)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module Tk
|
|
2
|
+
# Create and inspect fonts.
|
|
3
|
+
# The font command provides several facilities for dealing with fonts, such as
|
|
4
|
+
# defining named fonts and inspecting the actual attributes of a font.
|
|
5
|
+
class Font
|
|
6
|
+
def initialize(string_or_hash)
|
|
7
|
+
if string_or_hash.respond_to?(:to_str)
|
|
8
|
+
string_or_hash =~ /^(.*)\s+(\d+)?$/
|
|
9
|
+
|
|
10
|
+
params = {}
|
|
11
|
+
params[:family] = $1.to_s
|
|
12
|
+
params[:size] = $2.to_i if $2
|
|
13
|
+
|
|
14
|
+
@font = Font.create(params)
|
|
15
|
+
elsif string_or_hash.respond_to?(:to_hash)
|
|
16
|
+
@font = Font.create(string_or_hash)
|
|
17
|
+
else
|
|
18
|
+
raise ArgumentError
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def actual(options = {})
|
|
23
|
+
Font.actual(@font, options)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def actual_hash(options = {})
|
|
27
|
+
Font.actual(@font, options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def measure(text, options = {})
|
|
31
|
+
Font.measure(@font, text, options)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def metrics(option, options = {})
|
|
35
|
+
Font.metrics(@font, option, options)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def configure(argument = None)
|
|
39
|
+
Font.configure(@font, argument)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def to_tcl
|
|
43
|
+
TclString.new(@font)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
FONT_CONFIGURE_HINTS = {
|
|
47
|
+
underline: :boolean,
|
|
48
|
+
overstrike: :boolean,
|
|
49
|
+
weight: :symbol,
|
|
50
|
+
slant: :symbol,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
def self.execute(command, *args)
|
|
54
|
+
Tk.execute(:font, command, *args)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.execute_only(command, *args)
|
|
58
|
+
Tk.execute_only(:font, command, *args)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# NOTE:
|
|
62
|
+
# the signature has been simplified to a required +font+ argument and a
|
|
63
|
+
# simple +options+ hash.
|
|
64
|
+
# The original signature is:
|
|
65
|
+
# `font actual font ?-displayof window? ?option? ?--? ?char?`
|
|
66
|
+
# But it just makes things very painful.
|
|
67
|
+
# @options
|
|
68
|
+
# :displayof window
|
|
69
|
+
# :char char
|
|
70
|
+
# :option name
|
|
71
|
+
def self.actual(font, options = {})
|
|
72
|
+
window = options.fetch(:displayof, None)
|
|
73
|
+
option = options.fetch(:option, None)
|
|
74
|
+
char = options.fetch(:char, None)
|
|
75
|
+
|
|
76
|
+
args = []
|
|
77
|
+
args << "-displayof" << window unless window == None
|
|
78
|
+
args << option.to_tcl_option unless option == None
|
|
79
|
+
args << "--" << char.to_tcl unless char == None
|
|
80
|
+
|
|
81
|
+
array = execute(:actual, font, *args)
|
|
82
|
+
array.tcl_options_to_hash(FONT_CONFIGURE_HINTS)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.configure(fontname, argument = None)
|
|
86
|
+
Configure.common(
|
|
87
|
+
self, [:configure, fontname], argument, FONT_CONFIGURE_HINTS)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.create(fontname, options = None)
|
|
91
|
+
if fontname.respond_to?(:to_tcl_options)
|
|
92
|
+
fontname, options = None, fontname
|
|
93
|
+
options = options.to_tcl_options
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
execute(:create, fontname, options)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self.delete(*fontnames)
|
|
100
|
+
execute(:delete, *fontnames)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# The return value is a list of the case-insensitive names of all font
|
|
104
|
+
# families that exist on window's display.
|
|
105
|
+
# If the window argument is omitted, it defaults to the main window.
|
|
106
|
+
def self.families(options = {})
|
|
107
|
+
execute(:families, options.to_tcl_options)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def self.measure(font, text, options = {})
|
|
111
|
+
execute(:measure, font, options.to_tcl_options, text)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def self.metrics(font, option, options = {})
|
|
115
|
+
execute(:metrics, font, options.to_tcl_options, option.to_tcl_option)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# The return value is a list of all the named fonts that are currently
|
|
119
|
+
# defined.
|
|
120
|
+
def self.names
|
|
121
|
+
execute(:names).to_a
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module Tk
|
|
2
|
+
module_function
|
|
3
|
+
|
|
4
|
+
# Pop up a dialog box for the user to select a file to open.
|
|
5
|
+
#
|
|
6
|
+
# This method is usually associated with the "Open" command in the "File"
|
|
7
|
+
# menu.
|
|
8
|
+
# Its purpose is for the user to select an existing file only.
|
|
9
|
+
# If the user enters a non-existing file, the dialog box gives the user an
|
|
10
|
+
# error prompt and requires the user to give an alternative selection.
|
|
11
|
+
# If an application allows the user to create new files, it should do so by
|
|
12
|
+
# providing a separate "New" command in the "File" menu.
|
|
13
|
+
#
|
|
14
|
+
# If a user selects a file, the full pathname of the file is returned.
|
|
15
|
+
# If the user cancels the dialog, nil is returned.
|
|
16
|
+
#
|
|
17
|
+
# The following options may be given:
|
|
18
|
+
#
|
|
19
|
+
# defaultextension: extension
|
|
20
|
+
# Specifies a string that will be appended to the filename if the user
|
|
21
|
+
# enters a filename without an extension.
|
|
22
|
+
# The default value is the empty string, which means no extension will be
|
|
23
|
+
# appended to the filename in any case.
|
|
24
|
+
# This option is ignored on Mac OS X, which does not require extensions to
|
|
25
|
+
# filenames, and the UNIX implementation guesses reasonable values for
|
|
26
|
+
# this from the :filetypes option when this is not supplied.
|
|
27
|
+
#
|
|
28
|
+
# filetypes: file_pattern_list
|
|
29
|
+
# If a File types listbox exists in the file dialog on the particular
|
|
30
|
+
# platform, this option gives the filetypes in this listbox.
|
|
31
|
+
# When the user choose a filetype in the listbox, only the files of that
|
|
32
|
+
# type are listed.
|
|
33
|
+
# If this option is unspecified, or if it is set to the empty list, or if
|
|
34
|
+
# the File types listbox is not supported by the particular platform then
|
|
35
|
+
# all files are listed regardless of their types.
|
|
36
|
+
#
|
|
37
|
+
# initialdir: directory
|
|
38
|
+
# Specifies that the files in directory should be displayed when the
|
|
39
|
+
# dialog pops up.
|
|
40
|
+
# If this parameter is not specified, then the files in the current
|
|
41
|
+
# working directory are displayed.
|
|
42
|
+
# If the parameter specifies a relative path, the return value will
|
|
43
|
+
# convert the relative path to an absolute path.
|
|
44
|
+
#
|
|
45
|
+
# initialfile: filename
|
|
46
|
+
# Specifies a filename to be displayed in the dialog when it pops up.
|
|
47
|
+
#
|
|
48
|
+
# message: string
|
|
49
|
+
# Specifies a message to include in the client area of the dialog.
|
|
50
|
+
# This is only available on Mac OS X.
|
|
51
|
+
#
|
|
52
|
+
# multiple: boolean
|
|
53
|
+
# Allows the user to choose multiple files from the dialog.
|
|
54
|
+
#
|
|
55
|
+
# parent: window
|
|
56
|
+
# Makes window the logical parent of the file dialog.
|
|
57
|
+
# The file dialog is displayed on top of its parent window.
|
|
58
|
+
# On Mac OS X, this turns the file dialog into a sheet attached to the
|
|
59
|
+
# parent window.
|
|
60
|
+
#
|
|
61
|
+
# title: string
|
|
62
|
+
# Specifies a string to display as the title of the dialog box.
|
|
63
|
+
# If this option is not specified, then a default title is displayed.
|
|
64
|
+
#
|
|
65
|
+
# On the Unix and Macintosh platforms, extensions are matched using glob-style
|
|
66
|
+
# pattern matching.
|
|
67
|
+
# On the Windows platform, extensions are matched by the underlying operating
|
|
68
|
+
# system.
|
|
69
|
+
#
|
|
70
|
+
# The types of possible extensions are:
|
|
71
|
+
# * the special extension "*" matches any file
|
|
72
|
+
# * the special extension "" matches any files that do not have an extension
|
|
73
|
+
# (i.e., the filename contains no full stop character)
|
|
74
|
+
# * any character string that does not contain any wild card characters ("*"
|
|
75
|
+
# and "?").
|
|
76
|
+
#
|
|
77
|
+
# Due to the different pattern matching rules on the various platforms, to
|
|
78
|
+
# ensure portability, wild card characters are not allowed in the extensions,
|
|
79
|
+
# except as in the special extension "*".
|
|
80
|
+
# Extensions without a full stop character (e.g. "~") are allowed but may not
|
|
81
|
+
# work on all platforms.
|
|
82
|
+
def get_open_file(options = None)
|
|
83
|
+
Tk.execute(:tk_getOpenFile, options.to_tcl_options?)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Tk
|
|
2
|
+
module_function
|
|
3
|
+
|
|
4
|
+
# Pop up a dialog box for the user to select a file to save.
|
|
5
|
+
#
|
|
6
|
+
# This method is usually associated with the "Save as" command in the "File"
|
|
7
|
+
# menu.
|
|
8
|
+
# If the user enters a file that already exists, the dialog box prompts the
|
|
9
|
+
# user for confirmation whether the existing file should be overwritten or
|
|
10
|
+
# not.
|
|
11
|
+
#
|
|
12
|
+
# If a user selects a file, the full pathname of the file is returned.
|
|
13
|
+
# If the user cancels the dialog, nil is returned.
|
|
14
|
+
#
|
|
15
|
+
# The following options may be given:
|
|
16
|
+
#
|
|
17
|
+
# defaultextension: extension
|
|
18
|
+
# Specifies a string that will be appended to the filename if the user
|
|
19
|
+
# enters a filename without an extension.
|
|
20
|
+
# The default value is the empty string, which means no extension will be
|
|
21
|
+
# appended to the filename in any case.
|
|
22
|
+
# This option is ignored on Mac OS X, which does not require extensions to
|
|
23
|
+
# filenames, and the UNIX implementation guesses reasonable values for
|
|
24
|
+
# this from the :filetypes option when this is not supplied.
|
|
25
|
+
#
|
|
26
|
+
# filetypes: file_pattern_list
|
|
27
|
+
# If a File types listbox exists in the file dialog on the particular
|
|
28
|
+
# platform, this option gives the filetypes in this listbox.
|
|
29
|
+
# When the user choose a filetype in the listbox, only the files of that
|
|
30
|
+
# type are listed.
|
|
31
|
+
# If this option is unspecified, or if it is set to the empty list, or if
|
|
32
|
+
# the File types listbox is not supported by the particular platform then
|
|
33
|
+
# all files are listed regardless of their types.
|
|
34
|
+
#
|
|
35
|
+
# initialdir: directory
|
|
36
|
+
# Specifies that the files in directory should be displayed when the
|
|
37
|
+
# dialog pops up.
|
|
38
|
+
# If this parameter is not specified, then the files in the current
|
|
39
|
+
# working directory are displayed.
|
|
40
|
+
# If the parameter specifies a relative path, the return value will
|
|
41
|
+
# convert the relative path to an absolute path.
|
|
42
|
+
#
|
|
43
|
+
# initialfile: filename
|
|
44
|
+
# Specifies a filename to be displayed in the dialog when it pops up.
|
|
45
|
+
#
|
|
46
|
+
# message: string
|
|
47
|
+
# Specifies a message to include in the client area of the dialog.
|
|
48
|
+
# This is only available on Mac OS X.
|
|
49
|
+
#
|
|
50
|
+
# multiple: boolean
|
|
51
|
+
# Allows the user to choose multiple files from the dialog.
|
|
52
|
+
#
|
|
53
|
+
# parent: window
|
|
54
|
+
# Makes window the logical parent of the file dialog.
|
|
55
|
+
# The file dialog is displayed on top of its parent window.
|
|
56
|
+
# On Mac OS X, this turns the file dialog into a sheet attached to the
|
|
57
|
+
# parent window.
|
|
58
|
+
#
|
|
59
|
+
# title: string
|
|
60
|
+
# Specifies a string to display as the title of the dialog box.
|
|
61
|
+
# If this option is not specified, then a default title is displayed.
|
|
62
|
+
#
|
|
63
|
+
# On the Unix and Macintosh platforms, extensions are matched using glob-style
|
|
64
|
+
# pattern matching.
|
|
65
|
+
# On the Windows platform, extensions are matched by the underlying operating
|
|
66
|
+
# system.
|
|
67
|
+
#
|
|
68
|
+
# The types of possible extensions are:
|
|
69
|
+
# * the special extension "*" matches any file
|
|
70
|
+
# * the special extension "" matches any files that do not have an extension
|
|
71
|
+
# (i.e., the filename contains no full stop character)
|
|
72
|
+
# * any character string that does not contain any wild card characters ("*"
|
|
73
|
+
# and "?").
|
|
74
|
+
#
|
|
75
|
+
# Due to the different pattern matching rules on the various platforms, to
|
|
76
|
+
# ensure portability, wild card characters are not allowed in the extensions,
|
|
77
|
+
# except as in the special extension "*".
|
|
78
|
+
# Extensions without a full stop character (e.g. "~") are allowed but may not
|
|
79
|
+
# work on all platforms.
|
|
80
|
+
def get_save_file(options = None)
|
|
81
|
+
Tk.execute(:tk_getSaveFile, options.to_tcl_options?)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
module Tk
|
|
2
|
+
# Confine pointer and keyboard events to a window sub-tree
|
|
3
|
+
#
|
|
4
|
+
#
|
|
5
|
+
# WARNING
|
|
6
|
+
#
|
|
7
|
+
# It is very easy to use global grabs to render a display completely unusable
|
|
8
|
+
# (e.g. by setting a grab on a widget which does not respond to events and not
|
|
9
|
+
# providing any mechanism for releasing the grab).
|
|
10
|
+
# Take extreme care when using them!
|
|
11
|
+
#
|
|
12
|
+
#
|
|
13
|
+
# DESCRIPTION
|
|
14
|
+
#
|
|
15
|
+
# This command implements simple pointer and keyboard grabs for Tk.
|
|
16
|
+
#
|
|
17
|
+
# Tk's grabs are different than the grabs described in the Xlib documentation.
|
|
18
|
+
# When a grab is set for a particular window, Tk restricts all pointer events
|
|
19
|
+
# to the grab window and its descendants in Tk's window hierarchy.
|
|
20
|
+
#
|
|
21
|
+
# Whenever the pointer is within the grab window's subtree, the pointer will
|
|
22
|
+
# behave exactly the same as if there had been no grab at all and all events
|
|
23
|
+
# will be reported in the normal fashion.
|
|
24
|
+
# When the pointer is outside window's tree, button presses and releases and
|
|
25
|
+
# mouse motion events are reported to window, and window entry and window exit
|
|
26
|
+
# events are ignored.
|
|
27
|
+
#
|
|
28
|
+
# The grab subtree âownsâ the pointer: windows outside the grab subtree
|
|
29
|
+
# will be visible on the screen but they will be insensitive until the grab is
|
|
30
|
+
# released. The tree of windows underneath the grab window can include
|
|
31
|
+
# top-level windows, in which case all of those top-level windows and their
|
|
32
|
+
# descendants will continue to receive mouse events during the grab.
|
|
33
|
+
# Two forms of grabs are possible: local and global.
|
|
34
|
+
# A local grab affects only the grabbing application: events will be reported
|
|
35
|
+
# to other applications as if the grab had never occurred.
|
|
36
|
+
# Grabs are local by default.
|
|
37
|
+
#
|
|
38
|
+
# A global grab locks out all applications on the screen, so that only the
|
|
39
|
+
# given subtree of the grabbing application will be sensitive to pointer
|
|
40
|
+
# events (mouse button presses, mouse button releases, pointer motions, window
|
|
41
|
+
# entries, and window exits).
|
|
42
|
+
#
|
|
43
|
+
# During global grabs the window manager will not receive pointer events
|
|
44
|
+
# either. During local grabs, keyboard events (key presses and key releases)
|
|
45
|
+
# are delivered as usual: the window manager controls which application
|
|
46
|
+
# receives keyboard events, and if they are sent to any window in the grabbing
|
|
47
|
+
# application then they are redirected to the focus window.
|
|
48
|
+
# During a global grab Tk grabs the keyboard so that all keyboard events are
|
|
49
|
+
# always sent to the grabbing application.
|
|
50
|
+
#
|
|
51
|
+
# The focus command is still used to determine which window in the application
|
|
52
|
+
# receives the keyboard events.
|
|
53
|
+
# The keyboard grab is released when the grab is released.
|
|
54
|
+
#
|
|
55
|
+
# Grabs apply to particular displays.
|
|
56
|
+
# If an application has windows on multiple displays then it can establish a
|
|
57
|
+
# separate grab on each display.
|
|
58
|
+
# The grab on a particular display affects only the windows on that display.
|
|
59
|
+
# It is possible for different applications on a single display to have
|
|
60
|
+
# simultaneous local grabs, but only one application can have a global grab on
|
|
61
|
+
# a given display at once.
|
|
62
|
+
module Grab
|
|
63
|
+
# @see Grab.global
|
|
64
|
+
def grab_global(window)
|
|
65
|
+
Grab.globa(self)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @see Grab.local
|
|
69
|
+
def grab_local
|
|
70
|
+
Grab.local(self)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @see Grab.current
|
|
74
|
+
def grab_current
|
|
75
|
+
Grab.current(self)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @see Grab.release
|
|
79
|
+
def grab_release
|
|
80
|
+
Grab.release(self)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @see Grab.set_global
|
|
84
|
+
def grab_set_global
|
|
85
|
+
Grab.set_global(self)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @see Grab.set_local
|
|
89
|
+
def grab_set_local
|
|
90
|
+
Grab.set_local(self)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
module_function
|
|
94
|
+
|
|
95
|
+
# Same as [set_global], described below.
|
|
96
|
+
def global(window)
|
|
97
|
+
Tk.execute(:grab, '-global', window)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Same as [set_local], described below.
|
|
101
|
+
def local(window)
|
|
102
|
+
Tk.execute(:grab, window)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# If window is specified, returns the name of the current grab window in
|
|
106
|
+
# this application for window's display, or an empty string if there is no
|
|
107
|
+
# such window.
|
|
108
|
+
# If window is omitted, the command returns a list whose elements are all
|
|
109
|
+
# of the windows grabbed by this application for all displays, or an empty
|
|
110
|
+
# string if the application has no grabs.
|
|
111
|
+
def current(window = None)
|
|
112
|
+
if None == window
|
|
113
|
+
Tk.execute(:grab, :current).to_a
|
|
114
|
+
else
|
|
115
|
+
Tk.execute(:grab, :current, window).to_s?
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Releases the grab on window if there is one, otherwise does nothing.
|
|
120
|
+
# Returns an empty string.
|
|
121
|
+
def release(window)
|
|
122
|
+
Tk.execute_only(:grab, :release, window)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Sets a local grab on window.
|
|
126
|
+
# If a grab was already in effect for this application on +window+'s display
|
|
127
|
+
# then it is automatically released.
|
|
128
|
+
# Does nothing if there is already a local grab on +window+.
|
|
129
|
+
def set_local(window)
|
|
130
|
+
Tk.execute(:grab, :set, window)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Sets a global grab on window.
|
|
134
|
+
# If a grab was already in effect for this application on +window+'s display
|
|
135
|
+
# then it is automatically released.
|
|
136
|
+
# Does nothing if there is already a global grab on +window+.
|
|
137
|
+
def set_global(window)
|
|
138
|
+
Tk.execute(:grab, :set, '-global', window)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|