wxruby 1.9.3-universal-darwin
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 +299 -0
- data/lib/wx.rb +42 -0
- data/lib/wx/accessors.rb +52 -0
- data/lib/wx/classes/app.rb +45 -0
- data/lib/wx/classes/artprovider.rb +31 -0
- data/lib/wx/classes/bitmap.rb +23 -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/event.rb +5 -0
- data/lib/wx/classes/evthandler.rb +894 -0
- data/lib/wx/classes/font.rb +118 -0
- data/lib/wx/classes/grid.rb +129 -0
- data/lib/wx/classes/helpcontroller.rb +5 -0
- data/lib/wx/classes/htmlhelpcontroller.rb +5 -0
- data/lib/wx/classes/htmlwindow.rb +6 -0
- data/lib/wx/classes/icon.rb +14 -0
- data/lib/wx/classes/image.rb +14 -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 +5 -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 +69 -0
- data/lib/wx/classes/treectrl.rb +44 -0
- data/lib/wx/classes/window.rb +49 -0
- data/lib/wx/classes/xmlresource.rb +16 -0
- data/lib/wx/keyword_ctors.rb +219 -0
- data/lib/wx/keyword_defs.rb +485 -0
- data/lib/wx/version.rb +3 -0
- data/lib/wxruby2.bundle +0 -0
- data/samples/SAMPLES-LICENSE.TXT +18 -0
- data/samples/aui/aui.rb +1360 -0
- data/samples/bigdemo/About.rbw +39 -0
- data/samples/bigdemo/ColorPanel.rbw +25 -0
- data/samples/bigdemo/GridSimple.rbw +80 -0
- data/samples/bigdemo/MDIDemo.rbw +59 -0
- data/samples/bigdemo/PopupMenu.rbw +151 -0
- data/samples/bigdemo/ShapedWindow.rbw +135 -0
- data/samples/bigdemo/Sizers.rbw +545 -0
- data/samples/bigdemo/bigdemo.rb +826 -0
- data/samples/bigdemo/demoTemplate.rbw +37 -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 +94 -0
- data/samples/bigdemo/tips.txt +7 -0
- data/samples/bigdemo/utils.rb +12 -0
- data/samples/bigdemo/wxArtProvider.rbw +285 -0
- data/samples/bigdemo/wxBitmapButton.rbw +64 -0
- data/samples/bigdemo/wxButton.rbw +66 -0
- data/samples/bigdemo/wxCalendarCtrl.rbw +72 -0
- data/samples/bigdemo/wxCheckBox.rbw +52 -0
- data/samples/bigdemo/wxCheckListBox.rbw +77 -0
- data/samples/bigdemo/wxChoice.rbw +49 -0
- data/samples/bigdemo/wxChoicebook.rbw +80 -0
- data/samples/bigdemo/wxColourDialog.rbw +34 -0
- data/samples/bigdemo/wxComboBox.rbw +79 -0
- data/samples/bigdemo/wxCursor.rbw +140 -0
- data/samples/bigdemo/wxDialog.rbw +92 -0
- data/samples/bigdemo/wxDirDialog.rbw +32 -0
- data/samples/bigdemo/wxDragImage.rbw +74 -0
- data/samples/bigdemo/wxFileDialog.rbw +39 -0
- data/samples/bigdemo/wxFileDialog_Save.rbw +38 -0
- data/samples/bigdemo/wxFindReplaceDialog.rbw +85 -0
- data/samples/bigdemo/wxFontDialog.rbw +176 -0
- data/samples/bigdemo/wxFrame.rbw +55 -0
- data/samples/bigdemo/wxGauge.rbw +73 -0
- data/samples/bigdemo/wxGenericDirCtrl.rbw +78 -0
- data/samples/bigdemo/wxGrid.rbw +68 -0
- data/samples/bigdemo/wxHtmlHelpController.rbw +57 -0
- data/samples/bigdemo/wxListBox.rbw +142 -0
- data/samples/bigdemo/wxListCtrl_virtual.rbw +109 -0
- data/samples/bigdemo/wxMDIWindows.rbw +52 -0
- data/samples/bigdemo/wxMenu.rbw +238 -0
- data/samples/bigdemo/wxMessageDialog.rbw +30 -0
- data/samples/bigdemo/wxMiniFrame.rbw +74 -0
- data/samples/bigdemo/wxMultipleChoiceDialog.rbw +34 -0
- data/samples/bigdemo/wxNotebook.rbw +138 -0
- data/samples/bigdemo/wxProgressDialog.rbw +45 -0
- data/samples/bigdemo/wxRadioBox.rbw +74 -0
- data/samples/bigdemo/wxRadioButton.rbw +127 -0
- data/samples/bigdemo/wxSashWindow.rbw +145 -0
- data/samples/bigdemo/wxScrolledMessageDialog.rbw +59 -0
- data/samples/bigdemo/wxScrolledWindow.rbw +201 -0
- data/samples/bigdemo/wxSingleChoiceDialog.rbw +35 -0
- data/samples/bigdemo/wxSlider.rbw +44 -0
- data/samples/bigdemo/wxSpinButton.rbw +52 -0
- data/samples/bigdemo/wxSpinCtrl.rbw +53 -0
- data/samples/bigdemo/wxSplitterWindow.rbw +65 -0
- data/samples/bigdemo/wxStaticBitmap.rbw +53 -0
- data/samples/bigdemo/wxStaticText.rbw +57 -0
- data/samples/bigdemo/wxStatusBar.rbw +128 -0
- data/samples/bigdemo/wxTextCtrl.rbw +151 -0
- data/samples/bigdemo/wxTextEntryDialog.rbw +34 -0
- data/samples/bigdemo/wxToggleButton.rbw +51 -0
- data/samples/bigdemo/wxToolBar.rbw +133 -0
- data/samples/bigdemo/wxTreeCtrl.rbw +192 -0
- data/samples/calendar/calendar.rb +275 -0
- data/samples/caret/caret.rb +286 -0
- data/samples/caret/mondrian.xpm +44 -0
- data/samples/controls/controls.rb +1140 -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 +724 -0
- data/samples/dialogs/tips.txt +18 -0
- data/samples/drawing/graphics_drawing.rb +232 -0
- data/samples/drawing/images.rb +48 -0
- data/samples/drawing/paperclip.png +0 -0
- data/samples/etc/activation.rb +108 -0
- data/samples/etc/choice.rb +72 -0
- data/samples/etc/miniframe.rb +84 -0
- data/samples/etc/sash.rb +135 -0
- data/samples/etc/scrollwin.rb +116 -0
- data/samples/etc/system_settings.rb +258 -0
- data/samples/etc/threaded.rb +81 -0
- data/samples/etc/wizard.rb +79 -0
- data/samples/event/event.rb +184 -0
- data/samples/grid/grid.rb +202 -0
- data/samples/html/html.rb +264 -0
- data/samples/listbook/listbook.rb +181 -0
- data/samples/listbook/listbook.xrc +370 -0
- data/samples/mdi/mdi.rb +87 -0
- data/samples/media/mediactrl.rb +173 -0
- data/samples/minimal/minimal.rb +85 -0
- data/samples/minimal/mondrian.ico +0 -0
- data/samples/minimal/mondrian.png +0 -0
- data/samples/minimal/nothing.rb +21 -0
- data/samples/opengl/cube.rb +123 -0
- data/samples/printing/mondrian.ico +0 -0
- data/samples/printing/mondrian.xpm +44 -0
- data/samples/printing/printing.rb +484 -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 +174 -0
- data/samples/text/textctrl.rb +124 -0
- data/samples/text/unicode.rb +238 -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 +1180 -0
- data/samples/xrc/samples.xrc +46 -0
- data/samples/xrc/xrc_sample.rb +107 -0
- metadata +296 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# wxRuby2 Sample Code. Copyright (c) 2004-2006 Kevin B. Smith
|
3
|
+
# Freely reusable code: see SAMPLES-LICENSE.TXT for details
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'wx'
|
7
|
+
rescue LoadError => no_wx_err
|
8
|
+
begin
|
9
|
+
require 'rubygems'
|
10
|
+
require 'wx'
|
11
|
+
rescue LoadError
|
12
|
+
raise no_wx_err
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# This simple sample demonstrates how to use Ruby 1.8's lightweight
|
17
|
+
# (green) threads to execute non-GUI code in parallel with a wxRuby
|
18
|
+
# GUI. This strategy is useful in a number of situations:
|
19
|
+
#
|
20
|
+
# * To keep the GUI responsive whilst computationally intensive
|
21
|
+
# operations are carried out in the background
|
22
|
+
# * To keep the GUI responsive while waiting for networking operations
|
23
|
+
# to complete
|
24
|
+
#
|
25
|
+
# The basic problem is that, as with other Ruby GUI toolkits, non-GUI
|
26
|
+
# threads will not, by default, get allocated time to run while Ruby is
|
27
|
+
# busy in Wx code - the main wxRuby event loop. Strategies to deal with
|
28
|
+
# this include using non-blocking IO, and, more generically, using
|
29
|
+
# wxRuby's Timer class to explicitly allocate time for non-GUI threads
|
30
|
+
# to run. The latter technique is shown here.
|
31
|
+
|
32
|
+
# This frame shows a set of progress bars which monitor progress of
|
33
|
+
# long-running tasks. In this example, this long-running task is
|
34
|
+
# emulated by simply sleep-ing for random periods, but could equally be
|
35
|
+
# downloading from a socket or parsing a file.
|
36
|
+
class ProgressFrame < Wx::Frame
|
37
|
+
STEPS = 20
|
38
|
+
def initialize
|
39
|
+
super(nil, :title => 'Threading demo')
|
40
|
+
@gauges = []
|
41
|
+
panel = Wx::Panel.new(self)
|
42
|
+
sizer = Wx::BoxSizer.new(Wx::VERTICAL)
|
43
|
+
# show ten gauges
|
44
|
+
10.times do
|
45
|
+
gauge = Wx::Gauge.new(panel, :range => STEPS)
|
46
|
+
# For each gauge, start a new thread in which the task runs
|
47
|
+
Thread.new do
|
48
|
+
# The long-running task
|
49
|
+
STEPS.times do | i |
|
50
|
+
sleep rand(100) / 50.0
|
51
|
+
# Update the main GUI
|
52
|
+
gauge.value = i + 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
@gauges << gauge
|
56
|
+
sizer.add(gauge, 0, Wx::GROW|Wx::ALL, 2)
|
57
|
+
end
|
58
|
+
panel.sizer = sizer
|
59
|
+
sizer.fit(panel)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# This app class creates a frame, and, importantly, a timer to allow
|
64
|
+
class GaugeApp < Wx::App
|
65
|
+
# Get a guaranteed-unique id
|
66
|
+
THREAD_TIMER_ID = Wx::ID_HIGHEST + 1
|
67
|
+
def on_init
|
68
|
+
# Create a global application timer
|
69
|
+
t = Wx::Timer.new(self, THREAD_TIMER_ID)
|
70
|
+
# When the timer "ticks", switch control to other ruby threads
|
71
|
+
evt_timer(THREAD_TIMER_ID) { Thread.pass }
|
72
|
+
# Start the timer to run every 1/40 second (25ms); higher values
|
73
|
+
# will make the other threads run more often, but will eventually
|
74
|
+
# degrade the responsiveness of the GUI.
|
75
|
+
t.start(25)
|
76
|
+
prog = ProgressFrame.new
|
77
|
+
prog.show
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
GaugeApp.new.main_loop
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# wxRuby2 Sample Code. Copyright (c) 2004-2006 Kevin B. Smith
|
3
|
+
# Freely reusable code: see SAMPLES-LICENSE.TXT for details
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'wx'
|
7
|
+
rescue LoadError => no_wx_err
|
8
|
+
begin
|
9
|
+
require 'rubygems'
|
10
|
+
require 'wx'
|
11
|
+
rescue LoadError
|
12
|
+
raise no_wx_err
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class MyFrame < Wx::Frame
|
17
|
+
def initialize(title, pos, size)
|
18
|
+
super(nil, :title => title, :position => pos, :size => size)
|
19
|
+
|
20
|
+
menuFile = Wx::Menu.new
|
21
|
+
helpMenu = Wx::Menu.new
|
22
|
+
helpMenu.append(Wx::ID_ABOUT, "&About...\tF1", "Show about dialog")
|
23
|
+
menuFile.append(Wx::ID_EXIT, "E&xit\tAlt-X", "Quit this program")
|
24
|
+
menuBar = Wx::MenuBar.new
|
25
|
+
menuBar.append(menuFile, "&File")
|
26
|
+
menuBar.append(helpMenu, "&Help")
|
27
|
+
self.menu_bar = menuBar
|
28
|
+
|
29
|
+
create_status_bar(1)
|
30
|
+
self.status_text = "Welcome to wxRuby!"
|
31
|
+
s = Wx::StaticText.new(self, :label => 'The Wizard has completed')
|
32
|
+
evt_menu Wx::ID_EXIT, :on_quit
|
33
|
+
evt_menu Wx::ID_ABOUT, :on_about
|
34
|
+
|
35
|
+
w = Wx::Wizard.new(self, :title => 'The WxRuby Wizard')
|
36
|
+
p1 = Wx::WizardPageSimple.new(w)
|
37
|
+
s = Wx::StaticText.new(p1, :label => 'This is the first page')
|
38
|
+
|
39
|
+
p2 = Wx::WizardPageSimple.new(w, p1)
|
40
|
+
p1.set_next(p2)
|
41
|
+
s = Wx::StaticText.new(p2, :label => 'This is the second page')
|
42
|
+
|
43
|
+
p3 = Wx::WizardPageSimple.new(w, p2)
|
44
|
+
p2.set_next(p3)
|
45
|
+
s = Wx::StaticText.new(p3, :label => 'This is the final page')
|
46
|
+
|
47
|
+
evt_wizard_page_changed(w) { p "page changed" }
|
48
|
+
evt_wizard_page_changing(w) { p "page changing" }
|
49
|
+
evt_wizard_help(w) { p "wizard help" }
|
50
|
+
evt_wizard_cancel(w) { p "wizard cancelled" }
|
51
|
+
evt_wizard_finished(w) { p "wizard finished" }
|
52
|
+
|
53
|
+
w.run_wizard(p1)
|
54
|
+
end
|
55
|
+
|
56
|
+
def on_quit
|
57
|
+
close(true)
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_about
|
61
|
+
msg = sprintf("This is the About dialog of the wizard sample.\n" \
|
62
|
+
"Welcome to %s", Wx::VERSION_STRING)
|
63
|
+
Wx::message_box(msg, "About Wizard", Wx::OK|Wx::ICON_INFORMATION, self)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class RbApp < Wx::App
|
68
|
+
def on_init
|
69
|
+
frame = MyFrame.new("Wizard wxRuby App",
|
70
|
+
Wx::Point.new(50, 50),
|
71
|
+
Wx::Size.new(450, 340))
|
72
|
+
frame.show(true)
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
app = RbApp.new
|
78
|
+
app.main_loop()
|
79
|
+
|
@@ -0,0 +1,184 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# wxRuby2 Sample Code. Copyright (c) 2004-2007 wxRuby development team
|
3
|
+
# Freely reusable code: see SAMPLES-LICENSE.TXT for details
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'rubygems'
|
7
|
+
require 'wx'
|
8
|
+
rescue LoadError
|
9
|
+
require 'wx'
|
10
|
+
end
|
11
|
+
|
12
|
+
# This sample demonstrates how to dynamically connect and disconnect
|
13
|
+
# event handlers, and how to create custom event types and listeners
|
14
|
+
# associated with user-defined control classes.
|
15
|
+
|
16
|
+
# A custom type of event associated with a target control. Note that for
|
17
|
+
# user-defined controls, the associated event should inherit from
|
18
|
+
# Wx::CommandEvent rather than Wx::Event.
|
19
|
+
class TargetHitEvent < Wx::CommandEvent
|
20
|
+
# Create a new unique constant identifier, associate this class
|
21
|
+
# with events of that identifier, and create a shortcut 'evt_target'
|
22
|
+
# method for setting up this handler.
|
23
|
+
EVT_HIT_TARGET = Wx::EvtHandler.register_class(self, nil, 'evt_target', 1)
|
24
|
+
|
25
|
+
def initialize(target, score, distance)
|
26
|
+
# The constant id is the arg to super
|
27
|
+
super(EVT_HIT_TARGET)
|
28
|
+
# client_data should be used to store any information associated
|
29
|
+
# with the event.
|
30
|
+
self.client_data = { :score => score, :distance => distance }
|
31
|
+
self.id = target.get_id
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the points score associated with this event
|
35
|
+
def score
|
36
|
+
client_data[:score]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the distance (in pixels) from the centre of the target
|
40
|
+
def distance
|
41
|
+
client_data[:distance]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# An example of a simple user-written control, which displays a
|
46
|
+
# "bulls-eye" like target, and sends events with a score and distance
|
47
|
+
class TargetControl < Wx::Window
|
48
|
+
TargetCircle = Struct.new(:radius, :score, :brush)
|
49
|
+
|
50
|
+
def initialize(parent, *args)
|
51
|
+
super(parent, *args)
|
52
|
+
|
53
|
+
# Set up the scores and sizes of the rings
|
54
|
+
@radii = [
|
55
|
+
TargetCircle[ 0.1, 20, Wx::RED_BRUSH ],
|
56
|
+
TargetCircle[ 0.25, 10, Wx::BLUE_BRUSH ],
|
57
|
+
TargetCircle[ 0.4, 5, Wx::GREEN_BRUSH ] ]
|
58
|
+
evt_paint { | e | on_paint(e) }
|
59
|
+
evt_left_down { | e | on_left_down(e) }
|
60
|
+
end
|
61
|
+
|
62
|
+
# What point is at the centre (assuming this control is always square)
|
63
|
+
def centre_point
|
64
|
+
size.width / 2
|
65
|
+
end
|
66
|
+
|
67
|
+
# Called whenever the target is repainted, draws a series of
|
68
|
+
# concentric circles
|
69
|
+
def on_paint(evt)
|
70
|
+
paint do | dc |
|
71
|
+
dc.clear
|
72
|
+
@radii.reverse_each do | circ |
|
73
|
+
dc.brush = circ.brush
|
74
|
+
dc.draw_circle(centre_point, centre_point,
|
75
|
+
( size.width * circ.radius).to_i )
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Test if the target was hit, and generate a TargetHitEvent if so
|
81
|
+
def on_left_down(evt)
|
82
|
+
# quick bit of pythagoras...
|
83
|
+
distance = Math.sqrt( ( evt.x - centre_point ) ** 2 +
|
84
|
+
( evt.y - centre_point ) ** 2 )
|
85
|
+
# See which target ring, if any, was hit by the event
|
86
|
+
@radii.each do | circ |
|
87
|
+
if distance < ( size.width * circ.radius)
|
88
|
+
# Create an instance of the event
|
89
|
+
evt = TargetHitEvent.new(self, circ.score, distance)
|
90
|
+
# This sends the event for processing by listeners
|
91
|
+
event_handler.process_event(evt)
|
92
|
+
break
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Container frame for the target control
|
99
|
+
class TargetFrame < Wx::Frame
|
100
|
+
def initialize(title)
|
101
|
+
super(nil, :title => title, :size => [300, 300])
|
102
|
+
@tgt = TargetControl.new(self)
|
103
|
+
# This user-defined event handling method was set up by
|
104
|
+
# EvtHandler.register_class, above
|
105
|
+
evt_target(@tgt.get_id) { | e | on_target(e) }
|
106
|
+
@listening = true
|
107
|
+
evt_size { | e | on_size(e) }
|
108
|
+
setup_menus
|
109
|
+
create_status_bar
|
110
|
+
end
|
111
|
+
|
112
|
+
# What's done when the target is hit
|
113
|
+
def on_target(evt)
|
114
|
+
msg = "Target hit for score %i, %.2f pixels from centre" %
|
115
|
+
[ evt.score, evt.distance ]
|
116
|
+
self.status_text = msg
|
117
|
+
end
|
118
|
+
|
119
|
+
# Keep the target centred and square
|
120
|
+
def on_size(evt)
|
121
|
+
smaller = [ evt.size.width, evt.size.height ].min
|
122
|
+
@tgt.centre
|
123
|
+
@tgt.size = Wx::Size.new(smaller, smaller)
|
124
|
+
@tgt.refresh
|
125
|
+
end
|
126
|
+
|
127
|
+
# Toggle whether or not we are listening for events from the bulls-eye
|
128
|
+
# target
|
129
|
+
def on_toggle_connect
|
130
|
+
if @listening
|
131
|
+
# Remove :evt_target event handler for the @tgt
|
132
|
+
disconnect(@tgt.get_id, Wx::ID_ANY, :evt_target)
|
133
|
+
menu_bar.check(TOGGLE_LISTEN, false)
|
134
|
+
self.status_text = "Ignoring target events"
|
135
|
+
@listening = false
|
136
|
+
else
|
137
|
+
# Restore evt_target event handler for the @tgt
|
138
|
+
evt_target(@tgt.get_id) { | e | on_target(e) }
|
139
|
+
menu_bar.check(TOGGLE_LISTEN, true)
|
140
|
+
self.status_text = ''
|
141
|
+
@listening = true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def on_about
|
146
|
+
msg = sprintf("This is the About dialog of the event handling sample.\n" \
|
147
|
+
"Welcome to wxRuby, version %s", Wx::WXRUBY_VERSION)
|
148
|
+
|
149
|
+
about_dlg = Wx::MessageDialog.new( self, msg, 'About Event Handling',
|
150
|
+
Wx::OK|Wx::ICON_INFORMATION )
|
151
|
+
about_dlg.show_modal
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
TOGGLE_LISTEN = 1001
|
156
|
+
def setup_menus
|
157
|
+
menu_file = Wx::Menu.new
|
158
|
+
menu_help = Wx::Menu.new
|
159
|
+
menu_help.append(Wx::ID_ABOUT, "&About...\tF1", "Show about dialog")
|
160
|
+
evt_menu(Wx::ID_ABOUT) { on_about }
|
161
|
+
menu_file.append(Wx::ID_EXIT, "E&xit\tAlt-X", "Quit this program")
|
162
|
+
evt_menu(Wx::ID_EXIT) { self.close }
|
163
|
+
menu_file.append_check_item(TOGGLE_LISTEN, "L&isten for events",
|
164
|
+
"Toggle listening for target events")
|
165
|
+
evt_menu(TOGGLE_LISTEN) { on_toggle_connect }
|
166
|
+
|
167
|
+
menu_bar = Wx::MenuBar.new
|
168
|
+
menu_bar.append(menu_file, "&File")
|
169
|
+
menu_bar.append(menu_help, "&Help")
|
170
|
+
|
171
|
+
self.menu_bar = menu_bar
|
172
|
+
menu_bar.check(TOGGLE_LISTEN, true)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class TargetApp < Wx::App
|
177
|
+
def on_init
|
178
|
+
TargetFrame.new("Event Handling Sample").show
|
179
|
+
return true
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
a = TargetApp.new
|
184
|
+
a.main_loop()
|
@@ -0,0 +1,202 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
begin
|
3
|
+
require 'wx'
|
4
|
+
rescue LoadError => no_wx_err
|
5
|
+
begin
|
6
|
+
require 'rubygems'
|
7
|
+
load 'wx'
|
8
|
+
rescue
|
9
|
+
raise no_wx_err
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
class GridFrame < Wx::Frame
|
15
|
+
|
16
|
+
def initialize(parent, id = -1, title = "MyFrame",
|
17
|
+
pos = Wx::DEFAULT_POSITION,
|
18
|
+
size = Wx::DEFAULT_SIZE,
|
19
|
+
style = Wx::DEFAULT_FRAME_STYLE)
|
20
|
+
|
21
|
+
super(parent, id, title, pos, size, style)
|
22
|
+
sizer = Wx::BoxSizer.new(Wx::VERTICAL)
|
23
|
+
create_status_bar()
|
24
|
+
set_status_text(Wx::VERSION_STRING)
|
25
|
+
|
26
|
+
# panel = Wx::Panel.new(self)
|
27
|
+
sel_menu = Wx::Menu.new
|
28
|
+
sel_menu.append(1002, 'Select all', 'Select all')
|
29
|
+
evt_menu(1002) { @grid.select_all }
|
30
|
+
sel_menu.append(1003, 'Select row 2', 'Select row 2')
|
31
|
+
evt_menu(1003) { @grid.select_row(1) }
|
32
|
+
sel_menu.append(1004, 'Select column 4', 'Select col 4')
|
33
|
+
evt_menu(1004) { @grid.select_col(3) }
|
34
|
+
sel_menu.append(1005, 'Select block', 'Select block')
|
35
|
+
evt_menu(1005) { @grid.select_block(1, 1, 6, 3) }
|
36
|
+
menu_bar = Wx::MenuBar.new
|
37
|
+
menu_bar.append(sel_menu, 'Select')
|
38
|
+
set_menu_bar(menu_bar)
|
39
|
+
|
40
|
+
make_grid(self)
|
41
|
+
sizer.add(@grid, 1, Wx::ALL|Wx::GROW, 4)
|
42
|
+
set_sizer(sizer)
|
43
|
+
|
44
|
+
evt_grid_cell_left_click() do |evt|
|
45
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} is clicked")
|
46
|
+
evt.skip
|
47
|
+
end
|
48
|
+
|
49
|
+
evt_grid_cell_right_click() do |evt|
|
50
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} is right clicked")
|
51
|
+
evt.skip
|
52
|
+
end
|
53
|
+
|
54
|
+
evt_grid_cell_left_dclick() do |evt|
|
55
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} is double clicked")
|
56
|
+
evt.skip
|
57
|
+
end
|
58
|
+
|
59
|
+
evt_grid_cell_right_dclick() do |evt|
|
60
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} is right double clicked")
|
61
|
+
evt.skip
|
62
|
+
end
|
63
|
+
|
64
|
+
evt_grid_label_left_click() do |evt|
|
65
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} label is clicked")
|
66
|
+
evt.skip
|
67
|
+
end
|
68
|
+
|
69
|
+
evt_grid_label_right_click() do |evt|
|
70
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} label is right clicked")
|
71
|
+
evt.skip
|
72
|
+
end
|
73
|
+
|
74
|
+
evt_grid_label_left_dclick() do |evt|
|
75
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} labelis double clicked")
|
76
|
+
evt.skip
|
77
|
+
end
|
78
|
+
|
79
|
+
evt_grid_label_right_dclick() do |evt|
|
80
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} label is right double clicked")
|
81
|
+
evt.skip
|
82
|
+
end
|
83
|
+
|
84
|
+
evt_grid_select_cell() do |evt|
|
85
|
+
set_status_text("#{evt.get_row} x #{evt.get_col} cell is selected")
|
86
|
+
evt.skip
|
87
|
+
end
|
88
|
+
|
89
|
+
evt_grid_row_size do |evt|
|
90
|
+
set_status_text("Row #{evt.get_row_or_col} size changed")
|
91
|
+
evt.skip
|
92
|
+
end
|
93
|
+
|
94
|
+
evt_grid_col_size do |evt|
|
95
|
+
set_status_text("Column #{evt.get_row_or_col} size changed")
|
96
|
+
evt.skip
|
97
|
+
end
|
98
|
+
|
99
|
+
evt_grid_editor_shown do |evt|
|
100
|
+
set_status_text("Begin editing")
|
101
|
+
evt.skip
|
102
|
+
end
|
103
|
+
|
104
|
+
evt_grid_editor_hidden do |evt|
|
105
|
+
set_status_text("End editing")
|
106
|
+
evt.skip
|
107
|
+
end
|
108
|
+
|
109
|
+
evt_grid_range_select do |evt|
|
110
|
+
top = evt.get_top_left_coords
|
111
|
+
bottom = evt.get_bottom_right_coords
|
112
|
+
set_status_text("[ #{top[0].to_s} x #{top[1].to_s} ] to [ #{bottom[0].to_s} x #{bottom[1].to_s} ] is selected")
|
113
|
+
end
|
114
|
+
|
115
|
+
evt_grid_editor_created do |evt|
|
116
|
+
set_status_text("Control #{evt.get_control} created")
|
117
|
+
evt.skip
|
118
|
+
end
|
119
|
+
|
120
|
+
evt_grid_cell_change() do |evt|
|
121
|
+
set_status_text("Cell #{evt.get_row} x #{evt.get_col} has changed")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Create a wxGrid object
|
126
|
+
def make_grid(panel)
|
127
|
+
@grid = Wx::Grid.new(panel, -1)
|
128
|
+
|
129
|
+
# Then we call CreateGrid to set the dimensions of the grid
|
130
|
+
# (11 rows and 12 columns in this example)
|
131
|
+
@grid.create_grid( 20, 12 )
|
132
|
+
@grid.set_default_cell_background_colour(Wx::WHITE)
|
133
|
+
# We can set the sizes of individual rows and columns
|
134
|
+
# in pixels, and the label value string
|
135
|
+
@grid.set_row_size( 0, 60 )
|
136
|
+
@grid.set_row_label_value( 0, "Row1" )
|
137
|
+
@grid.set_row_label_alignment(Wx::ALIGN_CENTRE, Wx::ALIGN_CENTRE)
|
138
|
+
|
139
|
+
@grid.set_col_size( 0, 120 )
|
140
|
+
@grid.set_col_label_value( 0, "Col1" )
|
141
|
+
@grid.set_col_label_alignment(Wx::ALIGN_CENTRE, Wx::ALIGN_CENTRE)
|
142
|
+
|
143
|
+
# And set grid cell contents as strings
|
144
|
+
@grid.set_cell_value( 0, 0, "wxGrid is good" )
|
145
|
+
|
146
|
+
# We can specify that some cells are read-only
|
147
|
+
@grid.set_cell_value( 0, 2, "Read-only" )
|
148
|
+
@grid.set_read_only( 0, 2 )
|
149
|
+
|
150
|
+
# Colours can be specified for grid cell contents
|
151
|
+
@grid.set_cell_value(1, 1, "white on red")
|
152
|
+
@grid.set_cell_text_colour(1, 1, Wx::WHITE)
|
153
|
+
@grid.set_cell_background_colour(1, 1, Wx::RED)
|
154
|
+
|
155
|
+
# We can specify the some cells will store numeric
|
156
|
+
# values rather than strings. Here we set grid column 6
|
157
|
+
# to hold floating point values displayed with width
|
158
|
+
# of 2 and precision of 2. The column is highlighted in light grey
|
159
|
+
cell_attr = Wx::GridCellAttr.new
|
160
|
+
cell_attr.set_background_colour( Wx::LIGHT_GREY )
|
161
|
+
cell_attr.set_renderer( Wx::GridCellFloatRenderer.new(2, 2) )
|
162
|
+
|
163
|
+
@grid.set_col_attr(5, cell_attr)
|
164
|
+
@grid.set_cell_value(0, 5, "3.1415")
|
165
|
+
@grid.set_cell_value(0, 6,
|
166
|
+
"The whole column to the left uses float format")
|
167
|
+
|
168
|
+
# Custom Editors Can be used
|
169
|
+
editor = Wx::GridCellNumberEditor.new(5, 20)
|
170
|
+
@grid.set_cell_value(3, 1, 'Number editor below')
|
171
|
+
@grid.set_cell_editor(4, 1, editor)
|
172
|
+
|
173
|
+
editor = Wx::GridCellFloatEditor.new(4, 2)
|
174
|
+
@grid.set_cell_value(3, 2, 'Float editor below')
|
175
|
+
@grid.set_cell_editor(4, 2, editor)
|
176
|
+
|
177
|
+
editor = Wx::GridCellChoiceEditor.new(['foo', 'bar', 'baz'])
|
178
|
+
@grid.set_cell_value(3, 3, 'Choice editor below')
|
179
|
+
@grid.set_cell_editor(4, 3, editor)
|
180
|
+
|
181
|
+
@grid.auto_size_row(3, true)
|
182
|
+
|
183
|
+
# Display of cells can be customised
|
184
|
+
@grid.set_cell_editor(6, 0, Wx::GridCellBoolEditor.new)
|
185
|
+
@grid.set_cell_renderer(6, 0, Wx::GridCellBoolRenderer.new)
|
186
|
+
@grid.set_cell_value(6, 1, 'Cell to the left displayed as boolean')
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
class GridApp < Wx::App
|
192
|
+
def on_init
|
193
|
+
frame = GridFrame.new(nil, -1, "Grid Sample",
|
194
|
+
Wx::Point.new(10, 100),
|
195
|
+
Wx::Size.new(630,400))
|
196
|
+
|
197
|
+
set_top_window(frame)
|
198
|
+
frame.show()
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
GridApp.new.main_loop()
|