wxruby3 0.9.0.pre.rc.1 → 0.9.0.pre.rc.2
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.
- checksums.yaml +4 -4
- data/INSTALL.md +51 -22
- data/README.md +38 -6
- data/assets/hello_button-macos.png +0 -0
- data/assets/hello_button-msw.png +0 -0
- data/assets/hello_button_clicked-macos.png +0 -0
- data/assets/hello_button_clicked-msw.png +0 -0
- data/assets/hello_button_clicked_combi.png +0 -0
- data/assets/hello_world-macos.png +0 -0
- data/assets/hello_world-msw.png +0 -0
- data/assets/hello_world_combi.png +0 -0
- data/lib/wx/core/brush.rb +6 -0
- data/lib/wx/core/evthandler.rb +12 -2
- data/lib/wx/core/font.rb +22 -14
- data/lib/wx/core/helpprovider.rb +2 -2
- data/lib/wx/core/menu.rb +5 -0
- data/lib/wx/core/pen.rb +6 -0
- data/lib/wx/core/window.rb +28 -1
- data/lib/wx/doc/app.rb +40 -0
- data/lib/wx/doc/brush.rb +17 -0
- data/lib/wx/doc/font.rb +27 -0
- data/lib/wx/doc/pen.rb +17 -0
- data/lib/wx/doc/radio_box.rb +20 -0
- data/lib/wx/doc/window.rb +27 -0
- data/lib/wx/keyword_defs.rb +77 -76
- data/lib/wx/prt/keyword_defs.rb +5 -1
- data/lib/wx/version.rb +1 -1
- data/rakelib/install.rb +17 -6
- data/rakelib/lib/config/linux.rb +4 -2
- data/rakelib/lib/config/macosx.rb +120 -1
- data/rakelib/lib/config/mingw.rb +6 -1
- data/rakelib/lib/config/unixish.rb +26 -11
- data/rakelib/lib/config.rb +15 -6
- data/rakelib/lib/core/package.rb +1 -1
- data/rakelib/lib/core/spec.rb +2 -2
- data/rakelib/lib/director/app.rb +30 -1
- data/rakelib/lib/director/aui_toolbar.rb +41 -0
- data/rakelib/lib/director/brush.rb +10 -1
- data/rakelib/lib/director/combobox.rb +1 -1
- data/rakelib/lib/director/context_help_button.rb +23 -0
- data/rakelib/lib/director/dialog.rb +8 -2
- data/rakelib/lib/director/font.rb +12 -3
- data/rakelib/lib/director/help_provider.rb +8 -10
- data/rakelib/lib/director/hyperlink_event.rb +22 -0
- data/rakelib/lib/director/menu.rb +0 -3
- data/rakelib/lib/director/menu_bar.rb +3 -0
- data/rakelib/lib/director/pen.rb +10 -1
- data/rakelib/lib/director/popup_window.rb +18 -0
- data/rakelib/lib/director/radio_box.rb +15 -4
- data/rakelib/lib/director/searchctrl.rb +2 -1
- data/rakelib/lib/director/static_box.rb +1 -1
- data/rakelib/lib/director/styled_text_ctrl.rb +1 -1
- data/rakelib/lib/director/text_entry.rb +5 -0
- data/rakelib/lib/director/textctrl.rb +1 -1
- data/rakelib/lib/director/window.rb +37 -1
- data/rakelib/lib/generate/doc/context_help_button.yaml +16 -0
- data/rakelib/lib/generate/doc/event_blocker.yaml +27 -0
- data/rakelib/lib/generate/doc/event_filter.yaml +47 -0
- data/rakelib/lib/generate/doc/file_dialog.yaml +68 -0
- data/rakelib/lib/generate/doc.rb +1 -1
- data/rakelib/lib/generate/interface.rb +11 -10
- data/rakelib/lib/specs/interfaces.rb +4 -1
- data/samples/aui/aui.rb +432 -363
- data/samples/propgrid/propgrid.rb +3 -0
- data/samples/sampler/editor.rb +33 -25
- data/samples/sampler/sample.rb +2 -2
- data/samples/sampler/stc_editor.rb +4 -2
- data/tests/lib/item_container_tests.rb +82 -0
- data/tests/lib/text_entry_tests.rb +80 -0
- data/tests/lib/wxapp_runner.rb +12 -0
- data/tests/lib/wxframe_runner.rb +89 -4
- data/tests/test_ext_controls.rb +28 -0
- data/tests/test_font.rb +239 -0
- data/tests/test_intl.rb +5 -1
- data/tests/test_std_controls.rb +263 -37
- data/tests/test_window.rb +340 -0
- metadata +28 -2
@@ -14,7 +14,8 @@ module WXRuby3
|
|
14
14
|
def setup
|
15
15
|
super
|
16
16
|
# mixin TextEntry
|
17
|
-
spec.include_mixin 'wxSearchCtrl', 'Wx::TextEntry'
|
17
|
+
spec.include_mixin 'wxSearchCtrl', { 'Wx::TextEntry' => 'wxTextEntryBase' }
|
18
|
+
spec.suppress_warning(473, 'wxSearchCtrl::GetMenu')
|
18
19
|
spec.override_inheritance_chain('wxSearchCtrl', %w[wxControl wxWindow wxEvtHandler wxObject])
|
19
20
|
end
|
20
21
|
end # class SearchCtrl
|
@@ -13,7 +13,7 @@ module WXRuby3
|
|
13
13
|
|
14
14
|
def setup
|
15
15
|
super
|
16
|
-
if Config.instance.wx_port == :wxQT
|
16
|
+
if Config.instance.wx_port == :wxQT || Config.platform == :macosx
|
17
17
|
# missing from implementation currently
|
18
18
|
spec.ignore 'wxStaticBox::wxStaticBox(wxWindow *, wxWindowID, wxWindow *, const wxPoint &, const wxSize &, long, const wxString &)',
|
19
19
|
'wxStaticBox::Create(wxWindow *, wxWindowID, wxWindow *, const wxPoint &, const wxSize &, long, const wxString &)'
|
@@ -15,7 +15,7 @@ module WXRuby3
|
|
15
15
|
super
|
16
16
|
spec.override_inheritance_chain('wxStyledTextCtrl', %w[wxControl wxWindow wxEvtHandler wxObject])
|
17
17
|
# mixin TextEntry
|
18
|
-
spec.include_mixin 'wxStyledTextCtrl', 'Wx::TextEntry'
|
18
|
+
spec.include_mixin 'wxStyledTextCtrl', { 'Wx::TextEntry' => 'wxTextEntryBase' }
|
19
19
|
spec.map 'int *', 'long *', as: 'Integer' do
|
20
20
|
map_in ignore: true, temp: '$*1_ltype a', code: '$1 = &a;'
|
21
21
|
map_argout code: <<~__CODE
|
@@ -16,6 +16,11 @@ module WXRuby3
|
|
16
16
|
spec.gc_as_untracked 'wxTextEntry' # actually no GC control necessary as this is a mixin only
|
17
17
|
# turn wxTextEntry into a mixin module
|
18
18
|
spec.make_mixin 'wxTextEntry'
|
19
|
+
# !!NOTE!!
|
20
|
+
# This is not very nice but it is the easiest way to work around the problem that
|
21
|
+
# what we actually want as native type is wxTextEntryBase (because of some bad implementation decisions in wxw)
|
22
|
+
# and what is documented is wxTextEntry.
|
23
|
+
spec.add_header_code '#define wxTextEntry wxTextEntryBase'
|
19
24
|
spec.disown 'wxTextCompleter *completer' # managed by wxWidgets after passing in
|
20
25
|
spec.map_apply 'long * OUTPUT' => 'long *' # for GetSelection
|
21
26
|
end
|
@@ -14,7 +14,7 @@ module WXRuby3
|
|
14
14
|
def setup
|
15
15
|
super
|
16
16
|
# mixin TextEntry
|
17
|
-
spec.include_mixin 'wxTextCtrl', 'Wx::TextEntry'
|
17
|
+
spec.include_mixin 'wxTextCtrl', { 'Wx::TextEntry' => 'wxTextEntryBase' }
|
18
18
|
spec.override_inheritance_chain('wxTextCtrl', %w[wxControl wxWindow wxEvtHandler wxObject])
|
19
19
|
spec.ignore 'wxTextCtrl::HitTest(const wxPoint &,long *)'
|
20
20
|
if Config.instance.wx_port == :wxQT
|
@@ -132,8 +132,28 @@ module WXRuby3
|
|
132
132
|
'wxWindow::GetTextExtent(const wxString &,int *,int *,int *,int *,const wxFont *)',
|
133
133
|
'wxWindow::SendIdleEvents',
|
134
134
|
'wxWindow::ClientToScreen(int*,int*)', # no need; prefer the wxPoint version
|
135
|
-
'wxWindow::ScreenToClient(int*,int*)' # no need; prefer the wxPoint version
|
135
|
+
'wxWindow::ScreenToClient(int*,int*)', # no need; prefer the wxPoint version
|
136
136
|
]
|
137
|
+
# redefine these so a nil parent is accepted
|
138
|
+
spec.ignore %w[wxWindow::FindWindowById wxWindow::FindWindowByLabel wxWindow::FindWindowByName], ignore_doc: false
|
139
|
+
# overrule common typemap to allow default NULL
|
140
|
+
spec.map 'wxWindow* find_from_parent' do
|
141
|
+
map_check code: ''
|
142
|
+
end
|
143
|
+
spec.add_extend_code 'wxWindow', <<~__HEREDOC
|
144
|
+
static wxWindow* find_window_by_id(long id, const wxWindow *find_from_parent=0)
|
145
|
+
{
|
146
|
+
return wxWindow::FindWindowById(id, find_from_parent);
|
147
|
+
}
|
148
|
+
static wxWindow* find_window_by_label(const wxString &label, const wxWindow *find_from_parent=0)
|
149
|
+
{
|
150
|
+
return wxWindow::FindWindowByLabel(label, find_from_parent);
|
151
|
+
}
|
152
|
+
static wxWindow* find_window_by_name(const wxString &name, const wxWindow *find_from_parent=0)
|
153
|
+
{
|
154
|
+
return wxWindow::FindWindowByName(name, find_from_parent);
|
155
|
+
}
|
156
|
+
__HEREDOC
|
137
157
|
if Config.instance.wx_port == :wxQT
|
138
158
|
# protected for wxQT; ignore for now
|
139
159
|
spec.ignore 'wxWindow::EnableTouchEvents'
|
@@ -257,6 +277,22 @@ module WXRuby3
|
|
257
277
|
# update generated code for all windows
|
258
278
|
spec.post_processors << :update_window
|
259
279
|
end
|
280
|
+
|
281
|
+
def process(gendoc: false)
|
282
|
+
defmod = super
|
283
|
+
if spec.module_name == 'wxWindow'
|
284
|
+
# special processing to ignore the non-static versions of methods FromDIP,ToDIP,FromPhys,ToPhys
|
285
|
+
# as SWIG cannot handle identically named static & non-static methods
|
286
|
+
# will handle that in pure Ruby
|
287
|
+
%w[FromDIP ToDIP FromPhys ToPhys].each do |mtd|
|
288
|
+
if (item = defmod.find("wxWindow::#{mtd}"))
|
289
|
+
item.all.each { |ovl| ovl.ignore(true, ignore_doc: false) unless ovl.is_static }
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
defmod
|
294
|
+
end
|
295
|
+
|
260
296
|
end # class Window
|
261
297
|
|
262
298
|
end # class Director
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
:wxContextHelp:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /.*/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
# puts the application into a 'context-sensitive help mode' for my_window
|
11
|
+
context_help = Wx::ContextHelp.new(my_window)
|
12
|
+
...
|
13
|
+
...
|
14
|
+
# ends the 'context-sensitive help mode' for my_window
|
15
|
+
context_help.end_context_help
|
16
|
+
```
|
@@ -0,0 +1,27 @@
|
|
1
|
+
---
|
2
|
+
:wxEventBlocker:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /.*/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
class MyWindow
|
11
|
+
|
12
|
+
...
|
13
|
+
|
14
|
+
def do_something
|
15
|
+
# block all events directed to this window
|
16
|
+
Wx::EventBlocker.blocked_for(self) do
|
17
|
+
# while we do 1000 function_that_sends_events calls
|
18
|
+
1000.times { |i| function_that_sends_events(i) }
|
19
|
+
end
|
20
|
+
# old event handler restored; generated event(s) from next call will be processed
|
21
|
+
function_that_sends_events(0)
|
22
|
+
end
|
23
|
+
|
24
|
+
...
|
25
|
+
|
26
|
+
end
|
27
|
+
```
|
@@ -0,0 +1,47 @@
|
|
1
|
+
---
|
2
|
+
:wxEventFilter:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /.*/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
# This class allows determining the last time the user has worked with
|
11
|
+
# this application:
|
12
|
+
class LastActivityTimeDetector < Wx::EventFilter
|
13
|
+
def initialize
|
14
|
+
Wx::EvtHandler.add_filter(self)
|
15
|
+
|
16
|
+
@last = Time.now
|
17
|
+
end
|
18
|
+
|
19
|
+
def clear
|
20
|
+
Wx::EvtHandler.remove_filter(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def filter_event(event)
|
24
|
+
# Update the last user activity
|
25
|
+
t = event.get_event_type
|
26
|
+
case t
|
27
|
+
when Wx::EVT_KEY_DOWN,
|
28
|
+
Wx::EVT_MOTION,
|
29
|
+
Wx::EVT_LEFT_DOWN,
|
30
|
+
Wx::EVT_RIGHT_DOWN,
|
31
|
+
Wx::EVT_MIDDLE_DOWN
|
32
|
+
@last = Time.now
|
33
|
+
end
|
34
|
+
|
35
|
+
# Continue processing the event normally as well.
|
36
|
+
Event_Skip
|
37
|
+
end
|
38
|
+
|
39
|
+
# This function could be called periodically from some timer to
|
40
|
+
# do something (e.g. hide sensitive data or log out from remote
|
41
|
+
# server) if the user has been inactive for some time period.
|
42
|
+
def is_inactive_for?(diff)
|
43
|
+
(Time.now - diff) > @last
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
```
|
@@ -0,0 +1,68 @@
|
|
1
|
+
---
|
2
|
+
:wxFileDialog:
|
3
|
+
:detail:
|
4
|
+
:pre:
|
5
|
+
:programlisting:
|
6
|
+
- :pattern: !ruby/regexp /MyFrame::OnOpen/
|
7
|
+
:replace: |
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
class MyFrame
|
11
|
+
...
|
12
|
+
def on_open(event)
|
13
|
+
if (...current content has not been saved...)
|
14
|
+
if Wx.message_box('Current content has not been saved! Proceed?', 'Please confirm',
|
15
|
+
Wx::ICON_QUESTION | Wx::YES_NO, self) == Wx::NO
|
16
|
+
return
|
17
|
+
#else: proceed asking to the user the new file to open
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Wx::FileDialog(self, "Open XYZ file", "", "",
|
22
|
+
"XYZ files (*.xyz)|*.xyz", Wx::FD_OPEN|Wx::FD_FILE_MUST_EXIST) do |dlg|
|
23
|
+
return if dlg.show_modal == Wx::ID_CANCEL # the user changed idea...?
|
24
|
+
|
25
|
+
# proceed loading the file chosen by the user
|
26
|
+
file = File.open(dlg.path, 'r') rescue nil
|
27
|
+
unless file
|
28
|
+
Wx.log_error("Cannot open file '#{dlg.path}'.")
|
29
|
+
return
|
30
|
+
end
|
31
|
+
...
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
```
|
37
|
+
- :pattern: !ruby/regexp /MyFrame::OnSaveAs/
|
38
|
+
:replace: |
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
class MyFrame
|
42
|
+
...
|
43
|
+
def on_save_as(event)
|
44
|
+
Wx::FileDialog(self, "Save XYZ file", "", "",
|
45
|
+
"XYZ files (*.xyz)|*.xyz", Wx::FD_SAVE|Wx::FD_OVERWRITE_PROMPT) do |dlg|
|
46
|
+
return if dlg.show_modal == Wx::ID_CANCEL # the user changed idea...?
|
47
|
+
|
48
|
+
# save the current contents in the file
|
49
|
+
begin
|
50
|
+
File.open(dlg.path, 'w+') do |f|
|
51
|
+
# save to file
|
52
|
+
end
|
53
|
+
rescue
|
54
|
+
Wx.log_error("Cannot save current contents in file '#{dlg.path}'.")
|
55
|
+
return
|
56
|
+
end
|
57
|
+
end
|
58
|
+
...
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
```
|
63
|
+
- :pattern: !ruby/regexp /wxSystemOptions::SetOption/
|
64
|
+
:replace: |
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
Wx::SystemOptions.set_option(Wx::OSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1)
|
68
|
+
```
|
data/rakelib/lib/generate/doc.rb
CHANGED
@@ -860,7 +860,7 @@ module WXRuby3
|
|
860
860
|
|
861
861
|
# mixin includes
|
862
862
|
if included_mixins.has_key?(item.name)
|
863
|
-
included_mixins[item.name].each { |mod| fdoc.iputs "include #{mod}" }
|
863
|
+
included_mixins[item.name].keys.each { |mod| fdoc.iputs "include #{mod}" }
|
864
864
|
fdoc.puts
|
865
865
|
end
|
866
866
|
|
@@ -99,18 +99,19 @@ module WXRuby3
|
|
99
99
|
__HEREDOC
|
100
100
|
end
|
101
101
|
|
102
|
-
def gen_mixin_convert_code(fout, cls, mod)
|
102
|
+
def gen_mixin_convert_code(fout, cls, mod, ctype)
|
103
103
|
rb_mod_name = mod.split('::').last
|
104
|
+
ctype ||= "wx#{rb_mod_name}"
|
104
105
|
decl_flag = (mod.start_with?(package.fullname) ? 'WXRB_EXPORT_FLAG' : 'WXRB_IMPORT_FLAG') # same package (dll) or import?
|
105
106
|
fout.puts
|
106
107
|
fout << <<~__HEREDOC
|
107
|
-
// Mixin converter for
|
108
|
-
typedef
|
108
|
+
// Mixin converter for #{ctype} (#{mod}) included in #{cls}
|
109
|
+
typedef #{ctype}* (*wx_#{underscore(rb_mod_name)}_convert_fn)(void*);
|
109
110
|
#{decl_flag} void wxRuby_Register_#{rb_mod_name}_Include(swig_class* cls_info,
|
110
111
|
wx_#{underscore(rb_mod_name)}_convert_fn converter);
|
111
|
-
static
|
112
|
+
static #{ctype}* wxRuby_ConvertTo_#{rb_mod_name}(void* ptr)
|
112
113
|
{
|
113
|
-
return ((
|
114
|
+
return ((#{ctype}*) static_cast<#{cls}*> (ptr));
|
114
115
|
}
|
115
116
|
__HEREDOC
|
116
117
|
end
|
@@ -147,7 +148,7 @@ module WXRuby3
|
|
147
148
|
mixins.each { |name| gen_mixin_code(fout, name) }
|
148
149
|
end
|
149
150
|
unless included_mixins.empty?
|
150
|
-
included_mixins.each_pair {|cls, mods| mods.
|
151
|
+
included_mixins.each_pair {|cls, mods| mods.each_pair { |mod, ctype| gen_mixin_convert_code(fout, cls, mod, ctype) } }
|
151
152
|
end
|
152
153
|
fout.puts "%}"
|
153
154
|
end
|
@@ -215,8 +216,8 @@ module WXRuby3
|
|
215
216
|
end
|
216
217
|
unless included_mixins.empty?
|
217
218
|
fout.puts
|
218
|
-
included_mixins.each_pair do |cls,
|
219
|
-
|
219
|
+
included_mixins.each_pair do |cls, modules|
|
220
|
+
modules.keys.each { |m| fout.puts %Q{%mixin #{cls} "#{m}";} }
|
220
221
|
end
|
221
222
|
end
|
222
223
|
end
|
@@ -240,8 +241,8 @@ module WXRuby3
|
|
240
241
|
end
|
241
242
|
unless included_mixins.empty?
|
242
243
|
fout.puts
|
243
|
-
included_mixins.each_pair do |cls,
|
244
|
-
|
244
|
+
included_mixins.each_pair do |cls, modules|
|
245
|
+
modules.keys.each do |modname|
|
245
246
|
m = modname.split('::').last
|
246
247
|
fout.puts %Q{wxRuby_Register_#{m}_Include(&SwigClassWx#{rb_wx_name(cls)}, wxRuby_ConvertTo_#{m});}
|
247
248
|
end
|
@@ -177,7 +177,7 @@ module WXRuby3
|
|
177
177
|
Director.Spec(pkg, 'wxDataObjectSimpleBase', requirements: %w[wxUSE_CLIPBOARD])
|
178
178
|
Director.Spec(pkg, 'wxClipboard', requirements: %w[wxUSE_CLIPBOARD])
|
179
179
|
Director.Spec(pkg, 'wxDragDrop', requirements: %w[wxUSE_DRAG_AND_DROP])
|
180
|
-
Director.Spec(pkg, 'wxContextHelpButton',
|
180
|
+
Director.Spec(pkg, 'wxContextHelpButton', requirements: %w[wxUSE_HELP])
|
181
181
|
Director.Spec(pkg, 'wxHelpProvider', requirements: %w[wxUSE_HELP])
|
182
182
|
Director.Spec(pkg, 'wxHelpController', requirements: %w[wxUSE_HELP])
|
183
183
|
Director.Spec(pkg, 'wxExtHelpController', director: Director::HelpController, requirements: %w[wxUSE_HELP])
|
@@ -200,6 +200,9 @@ module WXRuby3
|
|
200
200
|
Director.Spec(pkg, 'wxPlatformInfo')
|
201
201
|
Director.Spec(pkg, 'wxSplashScreen', requirements: %w[wxUSE_SPLASH])
|
202
202
|
Director.Spec(pkg, 'wxUIActionSimulator', requirements: %w[wxUSE_UIACTIONSIMULATOR])
|
203
|
+
Director.Spec(pkg, 'wxActivityIndicator', director: Director::Window, requirements: %w[wxUSE_ACTIVITYINDICATOR])
|
204
|
+
Director.Spec(pkg, 'wxHyperlinkCtrl', director: Director::Window, requirements: %w[wxUSE_HYPERLINKCTRL])
|
205
|
+
Director.Spec(pkg, 'wxHyperlinkEvent', requirements: %w[wxUSE_HYPERLINKCTRL])
|
203
206
|
}
|
204
207
|
|
205
208
|
Director.Package('Wx::PRT', 'wxUSE_PRINTING_ARCHITECTURE') do |pkg|
|