wxruby 1.9.6-x86-mingw32
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/LICENSE +53 -0
- data/README +297 -0
- data/lib/wx/accessors.rb +52 -0
- data/lib/wx/classes/acceleratortable.rb +28 -0
- data/lib/wx/classes/animation.rb +18 -0
- data/lib/wx/classes/app.rb +45 -0
- data/lib/wx/classes/artprovider.rb +31 -0
- data/lib/wx/classes/bitmap.rb +28 -0
- data/lib/wx/classes/busycursor.rb +12 -0
- data/lib/wx/classes/checklistbox.rb +45 -0
- data/lib/wx/classes/choice.rb +4 -0
- data/lib/wx/classes/clientdc.rb +13 -0
- data/lib/wx/classes/clipboard.rb +16 -0
- data/lib/wx/classes/colour.rb +47 -0
- data/lib/wx/classes/combobox.rb +4 -0
- data/lib/wx/classes/commandevent.rb +7 -0
- data/lib/wx/classes/controlwithitems.rb +10 -0
- data/lib/wx/classes/dc.rb +57 -0
- data/lib/wx/classes/event.rb +5 -0
- data/lib/wx/classes/evthandler.rb +921 -0
- data/lib/wx/classes/font.rb +118 -0
- data/lib/wx/classes/functions.rb +44 -0
- data/lib/wx/classes/gauge.rb +12 -0
- data/lib/wx/classes/grid.rb +138 -0
- data/lib/wx/classes/helpcontroller.rb +5 -0
- data/lib/wx/classes/htmlhelpcontroller.rb +5 -0
- data/lib/wx/classes/htmlwindow.rb +14 -0
- data/lib/wx/classes/icon.rb +21 -0
- data/lib/wx/classes/iconbundle.rb +3 -0
- data/lib/wx/classes/image.rb +31 -0
- data/lib/wx/classes/imagelist.rb +3 -0
- data/lib/wx/classes/listbox.rb +4 -0
- data/lib/wx/classes/listctrl.rb +21 -0
- data/lib/wx/classes/locale.rb +28 -0
- data/lib/wx/classes/mediactrl.rb +22 -0
- data/lib/wx/classes/menu.rb +62 -0
- data/lib/wx/classes/menuitem.rb +7 -0
- data/lib/wx/classes/object.rb +7 -0
- data/lib/wx/classes/paintdc.rb +12 -0
- data/lib/wx/classes/point.rb +48 -0
- data/lib/wx/classes/previewframe.rb +13 -0
- data/lib/wx/classes/rect.rb +10 -0
- data/lib/wx/classes/size.rb +49 -0
- data/lib/wx/classes/sound.rb +23 -0
- data/lib/wx/classes/styledtextctrl.rb +92 -0
- data/lib/wx/classes/textctrl.rb +14 -0
- data/lib/wx/classes/texturlevent.rb +6 -0
- data/lib/wx/classes/timer.rb +94 -0
- data/lib/wx/classes/toolbartool.rb +4 -0
- data/lib/wx/classes/treectrl.rb +44 -0
- data/lib/wx/classes/window.rb +82 -0
- data/lib/wx/classes/xmlresource.rb +37 -0
- data/lib/wx/keyword_ctors.rb +222 -0
- data/lib/wx/keyword_defs.rb +492 -0
- data/lib/wx/version.rb +3 -0
- data/lib/wx.rb +42 -0
- data/lib/wxruby2.so +0 -0
- data/samples/SAMPLES-LICENSE.TXT +18 -0
- data/samples/aui/aui.rb +1356 -0
- data/samples/bigdemo/About.rbw +39 -0
- data/samples/bigdemo/ColorPanel.rbw +23 -0
- data/samples/bigdemo/GridSimple.rbw +78 -0
- data/samples/bigdemo/MDIDemo.rbw +57 -0
- data/samples/bigdemo/PopupMenu.rbw +149 -0
- data/samples/bigdemo/ShapedWindow.rbw +131 -0
- data/samples/bigdemo/Sizers.rbw +543 -0
- data/samples/bigdemo/bigdemo.rb +823 -0
- data/samples/bigdemo/demoTemplate.rbw +33 -0
- data/samples/bigdemo/helpfile.htb +0 -0
- data/samples/bigdemo/icons/Test 015.jpg +0 -0
- data/samples/bigdemo/icons/Test 015.png +0 -0
- data/samples/bigdemo/icons/choice.bmp +0 -0
- data/samples/bigdemo/icons/choice.xpm +27 -0
- data/samples/bigdemo/icons/combo.bmp +0 -0
- data/samples/bigdemo/icons/combo.xpm +27 -0
- data/samples/bigdemo/icons/copy.xpm +25 -0
- data/samples/bigdemo/icons/cut.xpm +24 -0
- data/samples/bigdemo/icons/gauge.bmp +0 -0
- data/samples/bigdemo/icons/gauge.xpm +27 -0
- data/samples/bigdemo/icons/help.xpm +25 -0
- data/samples/bigdemo/icons/list.bmp +0 -0
- data/samples/bigdemo/icons/list.xpm +27 -0
- data/samples/bigdemo/icons/mondrian.ico +0 -0
- data/samples/bigdemo/icons/mondrian.xpm +44 -0
- data/samples/bigdemo/icons/new.xpm +24 -0
- data/samples/bigdemo/icons/ogl.ico +0 -0
- data/samples/bigdemo/icons/ogl.xpm +45 -0
- data/samples/bigdemo/icons/open.xpm +26 -0
- data/samples/bigdemo/icons/paste.bmp +0 -0
- data/samples/bigdemo/icons/paste.xpm +38 -0
- data/samples/bigdemo/icons/pointy.png +0 -0
- data/samples/bigdemo/icons/preview.xpm +26 -0
- data/samples/bigdemo/icons/print.xpm +26 -0
- data/samples/bigdemo/icons/radio.bmp +0 -0
- data/samples/bigdemo/icons/radio.xpm +27 -0
- data/samples/bigdemo/icons/robert.xpm +415 -0
- data/samples/bigdemo/icons/ruby.png +0 -0
- data/samples/bigdemo/icons/sashtest.ico +0 -0
- data/samples/bigdemo/icons/save.xpm +25 -0
- data/samples/bigdemo/icons/smiles.bmp +0 -0
- data/samples/bigdemo/icons/smiles.xpm +39 -0
- data/samples/bigdemo/icons/smiley.ico +0 -0
- data/samples/bigdemo/icons/smiley.xpm +42 -0
- data/samples/bigdemo/icons/stattext.xpm +24 -0
- data/samples/bigdemo/icons/test2.bmp +0 -0
- data/samples/bigdemo/icons/test2.png +0 -0
- data/samples/bigdemo/icons/test2.xpm +79 -0
- data/samples/bigdemo/icons/text.bmp +0 -0
- data/samples/bigdemo/icons/text.xpm +27 -0
- data/samples/bigdemo/icons/tog1.bmp +0 -0
- data/samples/bigdemo/icons/tog1.xpm +38 -0
- data/samples/bigdemo/icons/tog2.bmp +0 -0
- data/samples/bigdemo/icons/tog2.xpm +38 -0
- data/samples/bigdemo/icons/wxwin.ico +0 -0
- data/samples/bigdemo/icons/wxwin16x16.png +0 -0
- data/samples/bigdemo/icons/wxwin16x16.xpm +25 -0
- data/samples/bigdemo/icons/wxwin32x32.png +0 -0
- data/samples/bigdemo/icons/wxwin48x48.png +0 -0
- data/samples/bigdemo/run.rb +90 -0
- data/samples/bigdemo/tips.txt +7 -0
- data/samples/bigdemo/utils.rb +12 -0
- data/samples/bigdemo/wxArtProvider.rbw +281 -0
- data/samples/bigdemo/wxBitmapButton.rbw +65 -0
- data/samples/bigdemo/wxButton.rbw +64 -0
- data/samples/bigdemo/wxCalendarCtrl.rbw +60 -0
- data/samples/bigdemo/wxCheckBox.rbw +50 -0
- data/samples/bigdemo/wxCheckListBox.rbw +75 -0
- data/samples/bigdemo/wxChoice.rbw +47 -0
- data/samples/bigdemo/wxChoicebook.rbw +78 -0
- data/samples/bigdemo/wxColourDialog.rbw +31 -0
- data/samples/bigdemo/wxComboBox.rbw +77 -0
- data/samples/bigdemo/wxCursor.rbw +136 -0
- data/samples/bigdemo/wxDialog.rbw +74 -0
- data/samples/bigdemo/wxDirDialog.rbw +29 -0
- data/samples/bigdemo/wxDragImage.rbw +70 -0
- data/samples/bigdemo/wxFileDialog.rbw +37 -0
- data/samples/bigdemo/wxFileDialog_Save.rbw +35 -0
- data/samples/bigdemo/wxFindReplaceDialog.rbw +82 -0
- data/samples/bigdemo/wxFontDialog.rbw +173 -0
- data/samples/bigdemo/wxFrame.rbw +53 -0
- data/samples/bigdemo/wxGauge.rbw +71 -0
- data/samples/bigdemo/wxGenericDirCtrl.rbw +74 -0
- data/samples/bigdemo/wxGrid.rbw +66 -0
- data/samples/bigdemo/wxHtmlHelpController.rbw +52 -0
- data/samples/bigdemo/wxListBox.rbw +140 -0
- data/samples/bigdemo/wxListCtrl_virtual.rbw +107 -0
- data/samples/bigdemo/wxMDIWindows.rbw +50 -0
- data/samples/bigdemo/wxMenu.rbw +236 -0
- data/samples/bigdemo/wxMessageDialog.rbw +27 -0
- data/samples/bigdemo/wxMiniFrame.rbw +70 -0
- data/samples/bigdemo/wxMultipleChoiceDialog.rbw +32 -0
- data/samples/bigdemo/wxNotebook.rbw +136 -0
- data/samples/bigdemo/wxProgressDialog.rbw +43 -0
- data/samples/bigdemo/wxRadioBox.rbw +72 -0
- data/samples/bigdemo/wxRadioButton.rbw +125 -0
- data/samples/bigdemo/wxSashWindow.rbw +141 -0
- data/samples/bigdemo/wxScrolledMessageDialog.rbw +57 -0
- data/samples/bigdemo/wxScrolledWindow.rbw +199 -0
- data/samples/bigdemo/wxSingleChoiceDialog.rbw +33 -0
- data/samples/bigdemo/wxSlider.rbw +42 -0
- data/samples/bigdemo/wxSpinButton.rbw +50 -0
- data/samples/bigdemo/wxSpinCtrl.rbw +51 -0
- data/samples/bigdemo/wxSplitterWindow.rbw +63 -0
- data/samples/bigdemo/wxStaticBitmap.rbw +51 -0
- data/samples/bigdemo/wxStaticText.rbw +55 -0
- data/samples/bigdemo/wxStatusBar.rbw +126 -0
- data/samples/bigdemo/wxTextCtrl.rbw +149 -0
- data/samples/bigdemo/wxTextEntryDialog.rbw +31 -0
- data/samples/bigdemo/wxToggleButton.rbw +49 -0
- data/samples/bigdemo/wxToolBar.rbw +131 -0
- data/samples/bigdemo/wxTreeCtrl.rbw +190 -0
- data/samples/calendar/calendar.rb +271 -0
- data/samples/caret/caret.rb +282 -0
- data/samples/caret/mondrian.xpm +44 -0
- data/samples/controls/controls.rb +1136 -0
- data/samples/controls/get_item_sample.rb +87 -0
- data/samples/controls/icons/choice.xpm +27 -0
- data/samples/controls/icons/combo.xpm +27 -0
- data/samples/controls/icons/gauge.xpm +27 -0
- data/samples/controls/icons/list.xpm +27 -0
- data/samples/controls/icons/radio.xpm +27 -0
- data/samples/controls/icons/stattext.xpm +24 -0
- data/samples/controls/icons/text.xpm +27 -0
- data/samples/controls/mondrian.ico +0 -0
- data/samples/controls/mondrian.xpm +44 -0
- data/samples/controls/test2.bmp +0 -0
- data/samples/dialogs/dialogs.rb +723 -0
- data/samples/dialogs/tips.txt +18 -0
- data/samples/drawing/graphics_drawing.rb +235 -0
- data/samples/drawing/images.rb +37 -0
- data/samples/drawing/paperclip.png +0 -0
- data/samples/etc/activation.rb +102 -0
- data/samples/etc/choice.rb +67 -0
- data/samples/etc/miniframe.rb +79 -0
- data/samples/etc/sash.rb +130 -0
- data/samples/etc/scrollwin.rb +110 -0
- data/samples/etc/system_settings.rb +252 -0
- data/samples/etc/threaded.rb +72 -0
- data/samples/etc/wizard.rb +74 -0
- data/samples/event/event.rb +182 -0
- data/samples/grid/grid.rb +198 -0
- data/samples/grid/gridtablebase.rb +134 -0
- data/samples/html/html.rb +262 -0
- data/samples/listbook/listbook.rb +174 -0
- data/samples/listbook/listbook.xrc +370 -0
- data/samples/mdi/mdi.rb +82 -0
- data/samples/media/mediactrl.rb +167 -0
- data/samples/minimal/minimal.rb +77 -0
- data/samples/minimal/mondrian.ico +0 -0
- data/samples/minimal/mondrian.png +0 -0
- data/samples/minimal/nothing.rb +16 -0
- data/samples/opengl/cube.rb +117 -0
- data/samples/printing/mondrian.ico +0 -0
- data/samples/printing/mondrian.xpm +44 -0
- data/samples/printing/printing.rb +310 -0
- data/samples/sockets/SocketPackets.rb +27 -0
- data/samples/sockets/res/message-new.png +0 -0
- data/samples/sockets/res/user.png +0 -0
- data/samples/sockets/wxClient.rb +395 -0
- data/samples/sockets/wxServer.rb +422 -0
- data/samples/sockets/wxSocketGUI.rb +97 -0
- data/samples/text/mondrian.ico +0 -0
- data/samples/text/mondrian.xpm +44 -0
- data/samples/text/scintilla.rb +169 -0
- data/samples/text/textctrl.rb +113 -0
- data/samples/text/unicode.rb +242 -0
- data/samples/text/utf8.txt +15 -0
- data/samples/treectrl/icon1.xpm +79 -0
- data/samples/treectrl/icon2.xpm +53 -0
- data/samples/treectrl/icon3.xpm +79 -0
- data/samples/treectrl/icon4.xpm +43 -0
- data/samples/treectrl/icon5.xpm +79 -0
- data/samples/treectrl/treectrl.rb +1174 -0
- data/samples/xrc/samples.xrc +46 -0
- data/samples/xrc/xrc_sample.rb +96 -0
- metadata +313 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
class Wx::Size
|
2
|
+
def to_s
|
3
|
+
"#<Wx::Size: (#{get_width}, #{get_height})>"
|
4
|
+
end
|
5
|
+
|
6
|
+
# Return a new Wx::Size with the width and height values both divided
|
7
|
+
# by parameter +div+, which should be a Numeric
|
8
|
+
def /(div)
|
9
|
+
self.class.new( (get_x / div).to_i, (get_y / div).to_i )
|
10
|
+
end
|
11
|
+
|
12
|
+
# Return a new Wx::Size with the width and height values both
|
13
|
+
# multiplied by parameter +mul+, which should be a Numeric
|
14
|
+
def *(mul)
|
15
|
+
self.class.new( (get_x * mul).to_i, (get_y * mul).to_i )
|
16
|
+
end
|
17
|
+
|
18
|
+
# Return a new Wx::Size with the width and height parameters both
|
19
|
+
# reduced by parameter +arg+. If +arg+ is another Wx::Size, reduce
|
20
|
+
# width by the other's width and height by the other's height; if
|
21
|
+
# +arg+ is a numeric value, reduce both width and height by that
|
22
|
+
# value.
|
23
|
+
def -(arg)
|
24
|
+
case arg
|
25
|
+
when self.class
|
26
|
+
self.class.new( get_x - arg.get_x, get_y - arg.get_y )
|
27
|
+
when Numeric
|
28
|
+
self.class.new( (get_x - arg).to_i, (get_y - arg).to_i )
|
29
|
+
else
|
30
|
+
Kernel.raise TypeError, "Cannot add #{arg} to #{self.inspect}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return a new Wx::Size with the width and height parameters both
|
35
|
+
# increased by parameter +arg+. If +arg+ is another Wx::Size, increase
|
36
|
+
# width by the other's width and height by the other's height; if
|
37
|
+
# +arg+ is a numeric value, increase both width and height by that
|
38
|
+
# value.
|
39
|
+
def +(arg)
|
40
|
+
case arg
|
41
|
+
when self.class
|
42
|
+
self.class.new( get_x + arg.get_x, get_y + arg.get_y )
|
43
|
+
when Numeric
|
44
|
+
self.class.new( (get_x + arg).to_i, (get_y + arg).to_i )
|
45
|
+
else
|
46
|
+
Kernel.raise TypeError, "Cannot add #{arg} to #{self.inspect}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Plays simple sounds from .wav files
|
2
|
+
class Wx::Sound
|
3
|
+
class << self
|
4
|
+
# Shortcut class method, as per the wxWidgets docs, but easier to do
|
5
|
+
# in Ruby
|
6
|
+
def play(file, flags = Wx::SOUND_ASYNC)
|
7
|
+
new(file).play(flags)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Test if newly created Sound is valid; if not, raise an exception
|
12
|
+
# rather than failing silently.
|
13
|
+
wx_init = self.instance_method(:initialize)
|
14
|
+
define_method(:initialize) do | *args |
|
15
|
+
if not File.exist?( File.expand_path(args[0]) )
|
16
|
+
Kernel.raise(ArgumentError, "Sound file does not exist: #{args[0]}")
|
17
|
+
end
|
18
|
+
wx_init.bind(self).call(*args)
|
19
|
+
if not ok?
|
20
|
+
Kernel.raise(ArgumentError, "Error loading sound file #{args[0]}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Functionality here must be loaded first to add custom events
|
2
|
+
require 'wx/classes/evthandler'
|
3
|
+
|
4
|
+
# These event type constants will only be available and meaningful if
|
5
|
+
# Wx::StyledTextCtrl has been compiled into the library. If so, they
|
6
|
+
# need the below definitions for mapping, otherwise all the rest should
|
7
|
+
# be skipped
|
8
|
+
if defined?(Wx::StyledTextCtrl)
|
9
|
+
EventType = Wx::EvtHandler::EventType
|
10
|
+
|
11
|
+
stc_event_types = [
|
12
|
+
EventType['evt_stc_calltip_click', 1,
|
13
|
+
Wx::EVT_STC_CALLTIP_CLICK,
|
14
|
+
Wx::StyledTextEvent],
|
15
|
+
EventType['evt_stc_change', 1,
|
16
|
+
Wx::EVT_STC_CHANGE,
|
17
|
+
Wx::StyledTextEvent],
|
18
|
+
EventType['evt_stc_charadded', 1,
|
19
|
+
Wx::EVT_STC_CHARADDED,
|
20
|
+
Wx::StyledTextEvent],
|
21
|
+
EventType['evt_stc_doubleclick', 1,
|
22
|
+
Wx::EVT_STC_DOUBLECLICK,
|
23
|
+
Wx::StyledTextEvent],
|
24
|
+
EventType['evt_stc_do_drop', 1,
|
25
|
+
Wx::EVT_STC_DO_DROP,
|
26
|
+
Wx::StyledTextEvent],
|
27
|
+
EventType['evt_stc_drag_over', 1,
|
28
|
+
Wx::EVT_STC_DRAG_OVER,
|
29
|
+
Wx::StyledTextEvent],
|
30
|
+
EventType['evt_stc_dwellend', 1,
|
31
|
+
Wx::EVT_STC_DWELLEND,
|
32
|
+
Wx::StyledTextEvent],
|
33
|
+
EventType['evt_stc_dwellstart', 1,
|
34
|
+
Wx::EVT_STC_DWELLSTART,
|
35
|
+
Wx::StyledTextEvent],
|
36
|
+
EventType['evt_stc_hotspot_click', 1,
|
37
|
+
Wx::EVT_STC_HOTSPOT_CLICK,
|
38
|
+
Wx::StyledTextEvent],
|
39
|
+
EventType['evt_stc_hotspot_dclick', 1,
|
40
|
+
Wx::EVT_STC_HOTSPOT_DCLICK,
|
41
|
+
Wx::StyledTextEvent],
|
42
|
+
EventType['evt_stc_key', 1,
|
43
|
+
Wx::EVT_STC_KEY,
|
44
|
+
Wx::StyledTextEvent],
|
45
|
+
EventType['evt_stc_macrorecord', 1,
|
46
|
+
Wx::EVT_STC_MACRORECORD,
|
47
|
+
Wx::StyledTextEvent],
|
48
|
+
EventType['evt_stc_marginclick', 1,
|
49
|
+
Wx::EVT_STC_MARGINCLICK,
|
50
|
+
Wx::StyledTextEvent],
|
51
|
+
EventType['evt_stc_modified', 1,
|
52
|
+
Wx::EVT_STC_MODIFIED,
|
53
|
+
Wx::StyledTextEvent],
|
54
|
+
EventType['evt_stc_needshown', 1,
|
55
|
+
Wx::EVT_STC_NEEDSHOWN,
|
56
|
+
Wx::StyledTextEvent],
|
57
|
+
EventType['evt_stc_painted', 1,
|
58
|
+
Wx::EVT_STC_PAINTED,
|
59
|
+
Wx::StyledTextEvent],
|
60
|
+
EventType['evt_stc_romodifyattempt', 1,
|
61
|
+
Wx::EVT_STC_ROMODIFYATTEMPT,
|
62
|
+
Wx::StyledTextEvent],
|
63
|
+
EventType['evt_stc_savepointleft', 1,
|
64
|
+
Wx::EVT_STC_SAVEPOINTLEFT,
|
65
|
+
Wx::StyledTextEvent],
|
66
|
+
EventType['evt_stc_savepointreached', 1,
|
67
|
+
Wx::EVT_STC_SAVEPOINTREACHED,
|
68
|
+
Wx::StyledTextEvent],
|
69
|
+
EventType['evt_stc_start_drag', 1,
|
70
|
+
Wx::EVT_STC_START_DRAG,
|
71
|
+
Wx::StyledTextEvent],
|
72
|
+
EventType['evt_stc_styleneeded', 1,
|
73
|
+
Wx::EVT_STC_STYLENEEDED,
|
74
|
+
Wx::StyledTextEvent],
|
75
|
+
EventType['evt_stc_updateui', 1,
|
76
|
+
Wx::EVT_STC_UPDATEUI,
|
77
|
+
Wx::StyledTextEvent],
|
78
|
+
EventType['evt_stc_uridropped', 1,
|
79
|
+
Wx::EVT_STC_URIDROPPED,
|
80
|
+
Wx::StyledTextEvent],
|
81
|
+
EventType['evt_stc_userlistselection', 1,
|
82
|
+
Wx::EVT_STC_USERLISTSELECTION,
|
83
|
+
Wx::StyledTextEvent],
|
84
|
+
EventType['evt_stc_zoom', 1,
|
85
|
+
Wx::EVT_STC_ZOOM,
|
86
|
+
Wx::StyledTextEvent]
|
87
|
+
]
|
88
|
+
|
89
|
+
stc_event_types.each do | ev_type |
|
90
|
+
Wx::EvtHandler.register_event_type(ev_type)
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Wx::TextCtrl
|
2
|
+
# Fix position_to_xy so it returns a two-element array - the internal
|
3
|
+
# version returns a three-element array with a Boolean that doesn't
|
4
|
+
# really make sense in Ruby
|
5
|
+
wx_position_to_xy = instance_method(:position_to_xy)
|
6
|
+
define_method(:position_to_xy) do | pos |
|
7
|
+
retval, x, y = wx_position_to_xy.bind(self).call(pos)
|
8
|
+
if retval
|
9
|
+
return [x, y]
|
10
|
+
else
|
11
|
+
return nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# Class allowing periodic or timed events to be fired
|
2
|
+
class Wx::Timer
|
3
|
+
# Convenience method to trigger a one-off action after +interval+
|
4
|
+
# milliseconds have passed. The action is specified by the passed
|
5
|
+
# block. The Timer is owned by the global App object, and is returned
|
6
|
+
# by the method.
|
7
|
+
def self.after(interval, &block)
|
8
|
+
timer = new(Wx::THE_APP, Wx::ID_ANY)
|
9
|
+
Wx::THE_APP.evt_timer(timer.get_id, block)
|
10
|
+
timer.start(interval, true)
|
11
|
+
timer
|
12
|
+
end
|
13
|
+
|
14
|
+
# Convenience method to trigger a repeating action every +interval+
|
15
|
+
# milliseconds. The action is specified by the passed block. The Timer
|
16
|
+
# is owned by the global App object, and is returned by the method.
|
17
|
+
def self.every(interval, &block)
|
18
|
+
timer = new(Wx::THE_APP, Wx::ID_ANY)
|
19
|
+
Wx::THE_APP.evt_timer(timer.get_id, block)
|
20
|
+
timer.start(interval)
|
21
|
+
timer
|
22
|
+
end
|
23
|
+
|
24
|
+
# In common with other classes, make the id method refer to the
|
25
|
+
# wxWidgets id, not ruby's deprecated name for object_id
|
26
|
+
alias :id :get_id
|
27
|
+
|
28
|
+
# This class can be linked to an owner - an instance of a class
|
29
|
+
# derived from EvtHandler which will receive Timer events. However,
|
30
|
+
# event if a Wx::Timer is attached to a Wx::Window, it is (unlike most
|
31
|
+
# classes) NOT automatically deleted when the window is destroyed. If
|
32
|
+
# the Timer continues ticking, it will send events to the
|
33
|
+
# now-destroyed window, causing segfaults. So the little acrobatics
|
34
|
+
# below set up a hook when a Timer's owner is set, and then ensure the
|
35
|
+
# timer is stopped when the window is destroyed.
|
36
|
+
|
37
|
+
# Redefine initialize
|
38
|
+
wx_init = self.instance_method(:initialize)
|
39
|
+
define_method(:initialize) do | *args |
|
40
|
+
setup_owner_destruction_hook(args[0])
|
41
|
+
wx_init.bind(self).call(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Redefine set_owner
|
45
|
+
wx_set_owner = self.instance_method(:set_owner)
|
46
|
+
define_method(:set_owner) do | *args |
|
47
|
+
setup_owner_destruction_hook(args[0])
|
48
|
+
wx_set_owner.bind(self).call(*args)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
# This method notes in Ruby the ownership of the timer, from both
|
53
|
+
# sides, and sets up an event hook if needed for the window's
|
54
|
+
# destruction.
|
55
|
+
def setup_owner_destruction_hook(new_owner)
|
56
|
+
this_timer = self
|
57
|
+
|
58
|
+
# Class-wide list of global (unowned) timers
|
59
|
+
@@__unowned_timers__ ||= []
|
60
|
+
|
61
|
+
# remove from list of previous owner
|
62
|
+
if defined?(@__owner__) and @__owner__
|
63
|
+
@__owner__.instance_eval { @__owned_timers__.delete(this_timer) }
|
64
|
+
end
|
65
|
+
|
66
|
+
# If becoming global unowned timer, add to list of those timers
|
67
|
+
if not new_owner
|
68
|
+
@__owner__ = nil
|
69
|
+
@@__unowned_timers__ << self
|
70
|
+
return
|
71
|
+
end
|
72
|
+
|
73
|
+
# Otherwise, if previously unowned, remove from global owned
|
74
|
+
@@__unowned_timers__.delete(self)
|
75
|
+
@__owner__ = new_owner
|
76
|
+
|
77
|
+
# Then add to list of new owner, setting destructor hook if required
|
78
|
+
new_owner.instance_eval do
|
79
|
+
if not defined?(@__owned_timers__)
|
80
|
+
@__owned_timers__ = []
|
81
|
+
unless self.kind_of?(Wx::App) # Don't set up hook on App
|
82
|
+
evt_window_destroy do | evt |
|
83
|
+
# If it's the owning window being destroyed...
|
84
|
+
if evt.get_event_object == self
|
85
|
+
@__owned_timers__.each { | timer | timer.stop }
|
86
|
+
end
|
87
|
+
evt.skip
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
@__owned_timers__ << this_timer
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Hierarchical control with items
|
2
|
+
class Wx::TreeCtrl
|
3
|
+
# Make these ruby enumerables so find, find_all, map etc are available
|
4
|
+
include Enumerable
|
5
|
+
# Iterate over all items
|
6
|
+
alias :each :traverse
|
7
|
+
|
8
|
+
# Return the children of +parent+ as an array of TreeItemIDs.
|
9
|
+
def get_children(parent)
|
10
|
+
kids = [ get_first_child(parent) ]
|
11
|
+
return [] if kids[0].zero?
|
12
|
+
|
13
|
+
while kid = get_next_sibling(kids.last) and not kid.zero?
|
14
|
+
kids << kid
|
15
|
+
end
|
16
|
+
kids
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns a Wx::Rect corresponding to the edges of an individual tree
|
20
|
+
# item, including the button, identified by id. The standard wxWidgets
|
21
|
+
# API for getting the pixel location of an item is unrubyish, using an
|
22
|
+
# input/output parameter. But since the underlying get_bounding_rect
|
23
|
+
# method works, it's easier to fix the API in Ruby than adding more to
|
24
|
+
# the already-toxic swig interface TreeCtrl.i file.
|
25
|
+
def get_item_rect(tree_item_id)
|
26
|
+
rect = Wx::Rect.new
|
27
|
+
if get_bounding_rect(tree_item_id, rect, false)
|
28
|
+
return rect
|
29
|
+
else
|
30
|
+
return nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a Wx::Rect corresponding to the edges of an individual tree
|
35
|
+
# item's text label. See above.
|
36
|
+
def get_label_rect(tree_item_id)
|
37
|
+
rect = Wx::Rect.new
|
38
|
+
if get_bounding_rect(tree_item_id, rect, true)
|
39
|
+
return rect
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Copyright 2004-2007 by Kevin Smith
|
2
|
+
# released under the MIT-style wxruby2 license
|
3
|
+
|
4
|
+
# The base class for all things displayed on screen
|
5
|
+
class Wx::Window
|
6
|
+
|
7
|
+
# Ruby's Object#id is deprecated and will be removed in 1.9; therefore
|
8
|
+
# for classes inheriting from Wx::Window, the id method returns the
|
9
|
+
# wxRuby Window id
|
10
|
+
alias :id :get_id
|
11
|
+
# In case a more explicit option is preferred.
|
12
|
+
alias :wx_id :get_id
|
13
|
+
|
14
|
+
|
15
|
+
# Recursively searches all windows below +self+ and returns the first
|
16
|
+
# window which has the id +an_id+. This corresponds to the find_window
|
17
|
+
# method method in WxWidgets when called with an integer.
|
18
|
+
def find_window_by_id(an_id)
|
19
|
+
Wx::Window.find_window_by_id(an_id, self)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Searches all windows below +self+ and returns the first window which
|
23
|
+
# has the name +a_name+ This corresponds to the find_window method method
|
24
|
+
# in WxWidgets when called with an string.
|
25
|
+
def find_window_by_name(a_name)
|
26
|
+
Wx::Window.find_window_by_name(a_name, self)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Searches all windows below +self+ and returns the first window which
|
30
|
+
# has the label +a_label+.
|
31
|
+
def find_window_by_label(a_label)
|
32
|
+
Wx:Window.find_window_by_label(a_label, self)
|
33
|
+
end
|
34
|
+
|
35
|
+
alias :__old_evt_paint :evt_paint
|
36
|
+
# This modified version of evt_paint sets a variable indicating that a
|
37
|
+
# paint event is being handled just before running the event
|
38
|
+
# handler. This ensures that any call to Window#paint within the
|
39
|
+
# handler will supply a Wx::PaintDC (see swig/Window.i).
|
40
|
+
def evt_paint(meth = nil, &block)
|
41
|
+
paint_proc = acquire_handler(meth, block)
|
42
|
+
wrapped_block = proc do | event |
|
43
|
+
instance_variable_set("@__painting__", true)
|
44
|
+
paint_proc.call(event)
|
45
|
+
remove_instance_variable("@__painting__")
|
46
|
+
end
|
47
|
+
__old_evt_paint(&wrapped_block)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Provides bufferd drawing facility to reduce flicker for complex
|
51
|
+
# drawing commands. Works similar to BufferedDC and BufferedPaintDC in
|
52
|
+
# the wxWidgets API, by doing drawing on an in-memory Bitmap, then
|
53
|
+
# copying the result in bulk to the screen.
|
54
|
+
#
|
55
|
+
# The method may be passed an existing Wx::Bitmap as the +buffer+,
|
56
|
+
# otherwise one will be created.
|
57
|
+
#
|
58
|
+
# Works like wxAutoBufferedDC in that additional buffering will only
|
59
|
+
# be done on platforms that do not already natively support buffering
|
60
|
+
# for the standard PaintDC / ClientDC - Windows, in particular.
|
61
|
+
def paint_buffered(buffer = nil)
|
62
|
+
# OS X and GTK do double-buffering natively
|
63
|
+
if self.double_buffered?
|
64
|
+
paint { | dc | yield dc }
|
65
|
+
else
|
66
|
+
# client_size is the window area available for drawing upon
|
67
|
+
c_size = client_size
|
68
|
+
# Create an in-memory buffer if none supplied
|
69
|
+
buffer ||= Wx::Bitmap.new(c_size.width, c_size.height)
|
70
|
+
buffer.draw do | mem_dc |
|
71
|
+
mem_dc.background = Wx::TRANSPARENT_BRUSH
|
72
|
+
mem_dc.clear
|
73
|
+
# Yield the bitmap for the user code to draw upon
|
74
|
+
yield mem_dc
|
75
|
+
paint do | dc |
|
76
|
+
# Copy the buffer to the window
|
77
|
+
dc.blit(0, 0, c_size.width, c_size.height, mem_dc, 0, 0)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Wx::XmlResource
|
2
|
+
# XRC_NO_SUBCLASSING should always be in place in wxRuby - we can't
|
3
|
+
# currently link directly to wxRuby subclasses.
|
4
|
+
class << self
|
5
|
+
wx_get = self.instance_method(:get)
|
6
|
+
define_method(:get) do
|
7
|
+
res = wx_get.bind(self).call
|
8
|
+
res.flags |= Wx::XRC_NO_SUBCLASSING
|
9
|
+
res
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# WxRuby already has all XRC handlers built in so there's no way to
|
14
|
+
# control init_all_handlers to reduce binary size. So save users
|
15
|
+
# having to call it.
|
16
|
+
wx_init = self.instance_method(:initialize)
|
17
|
+
define_method(:initialize) do | *args |
|
18
|
+
result = wx_init.bind(self).call(*args)
|
19
|
+
result.flags |= Wx::XRC_NO_SUBCLASSING
|
20
|
+
result.init_all_handlers
|
21
|
+
end
|
22
|
+
|
23
|
+
# The standard .load method returns a boolean indicating success or
|
24
|
+
# failure. Failure might result from bad XML, or a non-existent
|
25
|
+
# file. In ruby, in these circumstances, it's more natural to raise an
|
26
|
+
# Exception than expect the user to test the return value.
|
27
|
+
wx_load = self.instance_method(:load)
|
28
|
+
define_method(:load) do | fname |
|
29
|
+
result = wx_load.bind(self).call(fname)
|
30
|
+
if not result
|
31
|
+
Kernel.raise( RuntimeError,
|
32
|
+
"Failed to load XRC from '#{fname}'; " +
|
33
|
+
"check the file exists and is valid XML")
|
34
|
+
end
|
35
|
+
fname
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,222 @@
|
|
1
|
+
# = WxRuby Extensions - Keyword Constructors
|
2
|
+
#
|
3
|
+
# The *Keyword Constructors* extension allows the use of Ruby hash-style
|
4
|
+
# keyword arguments in constructors of common WxWidgets Windows, Frame,
|
5
|
+
# Dialog and Control classes.
|
6
|
+
#
|
7
|
+
# == Introduction
|
8
|
+
#
|
9
|
+
# Building a GUI in WxWidgets involves lots of calls to +new+, but
|
10
|
+
# these methods often have long parameter lists. Often the default
|
11
|
+
# values for many of these parameters are correct. For example, if
|
12
|
+
# you're using a sizer-based layout, you usually don't want to specify a
|
13
|
+
# size for widgets, but you still have to type
|
14
|
+
#
|
15
|
+
# Wx::TreeCtrl.new( parent, -1, Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE,
|
16
|
+
# Wx::NO_BUTTONS )
|
17
|
+
#
|
18
|
+
# just to create a standard TreeCtrl with the 'no buttons' style. If you
|
19
|
+
# want to specify the 'NO BUTTONS' style, you can't avoid all the typing
|
20
|
+
# of DEFAULT_POSITION etc.
|
21
|
+
#
|
22
|
+
# == Basic Keyword Constructors
|
23
|
+
#
|
24
|
+
# With keyword_constructors, you could write the above as
|
25
|
+
#
|
26
|
+
# TreeCtrl.new(parent, :style => Wx::NO_BUTTONS)
|
27
|
+
#
|
28
|
+
# And it will assume you want the default id (-1), and the default size
|
29
|
+
# and position. If you want to specify an explicit size, you can do so:
|
30
|
+
#
|
31
|
+
# TreeCtrl.new(parent, :size => Wx::Size.new(100, 300))
|
32
|
+
#
|
33
|
+
# For brevity, this module also allows you to specify positions and
|
34
|
+
# sizes using a a two-element array:
|
35
|
+
#
|
36
|
+
# TreeCtrl.new(parent, :size => [100, 300])
|
37
|
+
#
|
38
|
+
# Similarly with position:
|
39
|
+
#
|
40
|
+
# TreeCtrl.new(parent, :pos => Wx::Point.new(5, 25))
|
41
|
+
#
|
42
|
+
# TreeCtrl.new(parent, :pos => [5, 25])
|
43
|
+
#
|
44
|
+
# You can have multiple keyword arguments:
|
45
|
+
#
|
46
|
+
# TreeCtrl.new(parent, :pos => [5, 25], :size => [100, 300] )
|
47
|
+
#
|
48
|
+
# == No ID required
|
49
|
+
#
|
50
|
+
# As with position and size, you usually don't want to deal with
|
51
|
+
# assigning unique ids to every widget and frame you create - it's a C++
|
52
|
+
# hangover that often seems clunky in Ruby. The *Event Connectors*
|
53
|
+
# extension allows you to set up event handling without having to use
|
54
|
+
# ids, and if no :id argument is supplied to a constructor, the default
|
55
|
+
# (-1) will be passed.
|
56
|
+
#
|
57
|
+
# There are occasions when a specific ID does need to be used - for
|
58
|
+
# example, to tell WxWidgets that a button is a 'stock' item, so that it
|
59
|
+
# can be displayed using platform-standard text and icon. To do this,
|
60
|
+
# simply pass an :id argument to the constructor - here, the system's
|
61
|
+
# standard 'preview' button
|
62
|
+
#
|
63
|
+
# Wx::Button.new(parent, :id => Wx::ID_PREVIEW)
|
64
|
+
#
|
65
|
+
# == Class-specific arguments
|
66
|
+
#
|
67
|
+
# The arguments :size, :pos and :style are common to many WxWidgets
|
68
|
+
# window classes. The +new+ methods of these classes also have
|
69
|
+
# parameters that are specific to those classes; for example, the text
|
70
|
+
# label on a button, or the initial value of a text control.
|
71
|
+
#
|
72
|
+
# Wx::Button.new(parent, :label => 'press me')
|
73
|
+
# Wx::TextCtrl.new(parent, :value => 'type some text here')
|
74
|
+
#
|
75
|
+
# The keyword names of these arguments can be found by looking at the
|
76
|
+
# WxRuby documentation, in the relevant class's +new+ method. You can
|
77
|
+
# also get a string description of the class's +new+ method parameters
|
78
|
+
# within Ruby by doing:
|
79
|
+
#
|
80
|
+
# puts Wx::TextCtrl.describe_constructor()
|
81
|
+
#
|
82
|
+
# This will print a list of the argument names expected by the class's
|
83
|
+
# +new+ method, and the correct type for them.
|
84
|
+
#
|
85
|
+
# == Mixing positional and keyword arguments
|
86
|
+
#
|
87
|
+
# To support existing code, and to avoid forcing the use of more verbose
|
88
|
+
# keyword-style arguments where they're not desired, you can mix
|
89
|
+
# positional and keyword arguments, omitting or including +id+s as
|
90
|
+
# desired.
|
91
|
+
#
|
92
|
+
# Wx::Button.new(parent, 'press me', :style => Wx::BU_RIGHT)
|
93
|
+
|
94
|
+
module Wx
|
95
|
+
module KeywordConstructor
|
96
|
+
module ClassMethods
|
97
|
+
|
98
|
+
# Common Wx constructor argument keywords, with their default values.
|
99
|
+
STANDARD_DEFAULTS = {
|
100
|
+
:id => -1,
|
101
|
+
:size => Wx::DEFAULT_SIZE,
|
102
|
+
:pos => Wx::DEFAULT_POSITION,
|
103
|
+
:style => 0,
|
104
|
+
:title => '',
|
105
|
+
:validator => Wx::DEFAULT_VALIDATOR,
|
106
|
+
:choices => [] # for Choice, ComboBox etc
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
# A named parameter in a Wx constructor parameter list
|
111
|
+
Parameter = Struct.new( :name, :default )
|
112
|
+
|
113
|
+
attr_writer :param_spec
|
114
|
+
def param_spec
|
115
|
+
@param_spec ||= []
|
116
|
+
end
|
117
|
+
|
118
|
+
# Adds a list of named parameters *params* to the parameter
|
119
|
+
# specification for this Wx class's constructor. Each parameter
|
120
|
+
# should be specified as a either a common known symbol, such as
|
121
|
+
# +:size+ or +:pos:+ or +:style:+ (corresponding to the common
|
122
|
+
# constructor arguments in WxWidgets API), or a single-key with the
|
123
|
+
# key the name of the argument, and the value a default value.
|
124
|
+
#
|
125
|
+
# Parameters should be specified in the order they occur in the Wx
|
126
|
+
# API constructor
|
127
|
+
def wx_ctor_params(*params)
|
128
|
+
self.param_spec += params.map do | param |
|
129
|
+
param.kind_of?(Hash) ? Parameter[*param.to_a.flatten] :
|
130
|
+
Parameter[param, STANDARD_DEFAULTS[param] ]
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def args_as_list(*mixed_args)
|
135
|
+
# get keyword arguments from mixed args if supplied, else empty
|
136
|
+
kwa = mixed_args.last.kind_of?(Hash) ? mixed_args.pop : {}
|
137
|
+
out_args = []
|
138
|
+
param_spec.each_with_index do | param, i |
|
139
|
+
if arg = mixed_args[i] # use the supplied list arg
|
140
|
+
out_args << arg
|
141
|
+
elsif kwa.key?(param.name) # use the keyword arg
|
142
|
+
out_args << kwa[param.name]
|
143
|
+
else # use the default argument
|
144
|
+
out_args << param.default
|
145
|
+
end
|
146
|
+
end
|
147
|
+
out_args
|
148
|
+
rescue
|
149
|
+
Kernel.raise ArgumentError,
|
150
|
+
"Bad arg composition of #{mixed_args.inspect}"
|
151
|
+
end
|
152
|
+
|
153
|
+
def args_as_hash(*mixed_args)
|
154
|
+
kwa = mixed_args.last.kind_of?(Hash) ? mixed_args.pop : {}
|
155
|
+
param_spec.zip(mixed_args) do | param, arg |
|
156
|
+
kwa[param.name] = arg if arg
|
157
|
+
end
|
158
|
+
kwa
|
159
|
+
end
|
160
|
+
|
161
|
+
def describe_constructor()
|
162
|
+
param_spec.inject("") do | desc, param |
|
163
|
+
desc << ":#{param.name} => (#{param.default.class.name})\n"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.included(klass)
|
169
|
+
klass.extend ClassMethods
|
170
|
+
klass.module_eval do
|
171
|
+
|
172
|
+
alias :pre_wx_kwctor_init :initialize
|
173
|
+
|
174
|
+
# The new definition of initialize; accepts a parent arg
|
175
|
+
# mixed_args, which may zero or more position args, optionally
|
176
|
+
# terminated with hash keyword args, and an optional block
|
177
|
+
def initialize(parent = :default_ctor, *mixed_args, &block)
|
178
|
+
# allow zero-args ctor for use with XRC
|
179
|
+
if parent == :default_ctor
|
180
|
+
pre_wx_kwctor_init()
|
181
|
+
return
|
182
|
+
end
|
183
|
+
|
184
|
+
real_args = [ parent ] + self.class.args_as_list(*mixed_args)
|
185
|
+
begin
|
186
|
+
pre_wx_kwctor_init(*real_args)
|
187
|
+
rescue => err
|
188
|
+
msg = "Error initializing #{self.inspect}\n"+
|
189
|
+
" : #{err.message} \n" +
|
190
|
+
"Correct parameters for #{self.class.name}.new are:\n" +
|
191
|
+
self.class.describe_constructor()
|
192
|
+
|
193
|
+
new_err = err.class.new(msg)
|
194
|
+
new_err.set_backtrace(caller)
|
195
|
+
Kernel.raise new_err
|
196
|
+
end
|
197
|
+
|
198
|
+
# If a block was given, pass the newly created Window instance
|
199
|
+
# into it; use block
|
200
|
+
if block
|
201
|
+
if block.arity == -1 or block.arity == 0
|
202
|
+
self.instance_eval(&block)
|
203
|
+
elsif block.arity == 1
|
204
|
+
block.call(self)
|
205
|
+
else
|
206
|
+
Kernel.raise ArgumentError,
|
207
|
+
"Block to initialize accepts zero or one arg"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# Any class inheriting from a class including this module must have
|
214
|
+
# its own copy of the param_spec
|
215
|
+
def klass.inherited(sub_klass)
|
216
|
+
sub_klass.instance_variable_set(:@param_spec,
|
217
|
+
instance_variable_get(:@param_spec) )
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|