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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +51 -22
  3. data/README.md +38 -6
  4. data/assets/hello_button-macos.png +0 -0
  5. data/assets/hello_button-msw.png +0 -0
  6. data/assets/hello_button_clicked-macos.png +0 -0
  7. data/assets/hello_button_clicked-msw.png +0 -0
  8. data/assets/hello_button_clicked_combi.png +0 -0
  9. data/assets/hello_world-macos.png +0 -0
  10. data/assets/hello_world-msw.png +0 -0
  11. data/assets/hello_world_combi.png +0 -0
  12. data/lib/wx/core/brush.rb +6 -0
  13. data/lib/wx/core/evthandler.rb +12 -2
  14. data/lib/wx/core/font.rb +22 -14
  15. data/lib/wx/core/helpprovider.rb +2 -2
  16. data/lib/wx/core/menu.rb +5 -0
  17. data/lib/wx/core/pen.rb +6 -0
  18. data/lib/wx/core/window.rb +28 -1
  19. data/lib/wx/doc/app.rb +40 -0
  20. data/lib/wx/doc/brush.rb +17 -0
  21. data/lib/wx/doc/font.rb +27 -0
  22. data/lib/wx/doc/pen.rb +17 -0
  23. data/lib/wx/doc/radio_box.rb +20 -0
  24. data/lib/wx/doc/window.rb +27 -0
  25. data/lib/wx/keyword_defs.rb +77 -76
  26. data/lib/wx/prt/keyword_defs.rb +5 -1
  27. data/lib/wx/version.rb +1 -1
  28. data/rakelib/install.rb +17 -6
  29. data/rakelib/lib/config/linux.rb +4 -2
  30. data/rakelib/lib/config/macosx.rb +120 -1
  31. data/rakelib/lib/config/mingw.rb +6 -1
  32. data/rakelib/lib/config/unixish.rb +26 -11
  33. data/rakelib/lib/config.rb +15 -6
  34. data/rakelib/lib/core/package.rb +1 -1
  35. data/rakelib/lib/core/spec.rb +2 -2
  36. data/rakelib/lib/director/app.rb +30 -1
  37. data/rakelib/lib/director/aui_toolbar.rb +41 -0
  38. data/rakelib/lib/director/brush.rb +10 -1
  39. data/rakelib/lib/director/combobox.rb +1 -1
  40. data/rakelib/lib/director/context_help_button.rb +23 -0
  41. data/rakelib/lib/director/dialog.rb +8 -2
  42. data/rakelib/lib/director/font.rb +12 -3
  43. data/rakelib/lib/director/help_provider.rb +8 -10
  44. data/rakelib/lib/director/hyperlink_event.rb +22 -0
  45. data/rakelib/lib/director/menu.rb +0 -3
  46. data/rakelib/lib/director/menu_bar.rb +3 -0
  47. data/rakelib/lib/director/pen.rb +10 -1
  48. data/rakelib/lib/director/popup_window.rb +18 -0
  49. data/rakelib/lib/director/radio_box.rb +15 -4
  50. data/rakelib/lib/director/searchctrl.rb +2 -1
  51. data/rakelib/lib/director/static_box.rb +1 -1
  52. data/rakelib/lib/director/styled_text_ctrl.rb +1 -1
  53. data/rakelib/lib/director/text_entry.rb +5 -0
  54. data/rakelib/lib/director/textctrl.rb +1 -1
  55. data/rakelib/lib/director/window.rb +37 -1
  56. data/rakelib/lib/generate/doc/context_help_button.yaml +16 -0
  57. data/rakelib/lib/generate/doc/event_blocker.yaml +27 -0
  58. data/rakelib/lib/generate/doc/event_filter.yaml +47 -0
  59. data/rakelib/lib/generate/doc/file_dialog.yaml +68 -0
  60. data/rakelib/lib/generate/doc.rb +1 -1
  61. data/rakelib/lib/generate/interface.rb +11 -10
  62. data/rakelib/lib/specs/interfaces.rb +4 -1
  63. data/samples/aui/aui.rb +432 -363
  64. data/samples/propgrid/propgrid.rb +3 -0
  65. data/samples/sampler/editor.rb +33 -25
  66. data/samples/sampler/sample.rb +2 -2
  67. data/samples/sampler/stc_editor.rb +4 -2
  68. data/tests/lib/item_container_tests.rb +82 -0
  69. data/tests/lib/text_entry_tests.rb +80 -0
  70. data/tests/lib/wxapp_runner.rb +12 -0
  71. data/tests/lib/wxframe_runner.rb +89 -4
  72. data/tests/test_ext_controls.rb +28 -0
  73. data/tests/test_font.rb +239 -0
  74. data/tests/test_intl.rb +5 -1
  75. data/tests/test_std_controls.rb +263 -37
  76. data/tests/test_window.rb +340 -0
  77. metadata +28 -2
@@ -3,4 +3,123 @@
3
3
  # Copyright (c) M.J.N. Corino, The Netherlands
4
4
  ###
5
5
 
6
- raise "MacOSX platform is unsupported as yet."
6
+ require_relative './unixish'
7
+
8
+ module WXRuby3
9
+
10
+ module Config
11
+
12
+ module Platform
13
+
14
+ def self.included(base)
15
+ base.class_eval do
16
+ include Config::UnixLike
17
+
18
+ def debug_command(*args)
19
+ args.unshift(FileUtils::RUBY)
20
+ args.unshift('--')
21
+ args.unshift('lldb')
22
+ args.join(' ')
23
+ end
24
+
25
+ def dll_mask
26
+ "{#{dll_ext},dylib}"
27
+ end
28
+
29
+ def get_rpath_origin
30
+ "@loader_path"
31
+ end
32
+
33
+ def check_rpath_patch
34
+ # no need to check anything; install_name_tool is part of XCode cmdline tools
35
+ # and without these we couldn't build anything
36
+ true
37
+ end
38
+
39
+ def patch_rpath(shlib, *rpath)
40
+ # don't leave old rpath-s behind
41
+ sh("install_name_tool -delete_rpath '@loader_path/../lib' #{shlib} 2>/dev/null", verbose: false) { |_,_| }
42
+ # add deployment rpath-s
43
+ sh("install_name_tool #{rpath.collect {|rp| "-add_rpath '#{rp}'"}.join(' ')} #{shlib} 2>/dev/null", verbose: false) { |_,_| }
44
+ true
45
+ end
46
+
47
+ def update_shlib_loadpaths(shlib, deplibs)
48
+ changes = deplibs.collect { |dl| "-change '#{dl}' '@rpath/#{File.basename(dl)}'"}
49
+ sh("install_name_tool #{changes.join(' ')} #{shlib} 2>/dev/null", verbose: false) { |_,_| }
50
+ true
51
+ end
52
+
53
+ def get_wx_libs
54
+ wx_libset = ::Set.new
55
+ lib_list = wx_config("--libs all").split(' ')
56
+ until lib_list.empty?
57
+ s = lib_list.shift
58
+ if s == '-framework'
59
+ wx_libset << "#{s} #{lib_list.shift}"
60
+ else
61
+ wx_libset << s
62
+ end
63
+ end
64
+ # some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
65
+ if features_set?('wxUSE_MEDIACTRL')
66
+ lib_list = wx_config("--libs media").split(' ')
67
+ until lib_list.empty?
68
+ s = lib_list.shift
69
+ if s == '-framework'
70
+ wx_libset << "#{s} #{lib_list.shift}"
71
+ else
72
+ wx_libset << s
73
+ end
74
+ end
75
+ end
76
+ wx_libset.collect { |s| s.dup }
77
+ end
78
+
79
+ def do_link(pkg)
80
+ objs = pkg.all_obj_files.collect { |o| File.join('..', o) }.join(' ') + ' '
81
+ sh "cd lib && #{WXRuby3.config.ld} #{WXRuby3.config.ldflags(pkg.lib_target)} #{objs} " +
82
+ "#{WXRuby3.config.libs} #{WXRuby3.config.link_output_flag}#{pkg.lib_target}"
83
+ end
84
+
85
+ private
86
+
87
+ def wx_configure
88
+ bash('./configure --disable-sys-libs --without-liblzma --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info')
89
+ end
90
+
91
+ def wx_make
92
+ bash('make -j$(sysctl -n hw.logicalcpu) && make install')
93
+ end
94
+ end
95
+ end
96
+
97
+ def init_platform
98
+ init_unix_platform
99
+
100
+ @dll_pfx = 'lib'
101
+
102
+ if @wx_version
103
+ @cpp.sub!(/-std=gnu\+\+11/, '-std=gnu++14')
104
+ @ld.sub!(/-o\s*\Z/, '')
105
+
106
+ @extra_cflags.concat %w[-Wno-unused-function -Wno-conversion-null -Wno-sometimes-uninitialized
107
+ -Wno-overloaded-virtual -Wno-deprecated-copy]
108
+ @extra_cflags << ' -Wno-deprecated-declarations' unless @no_deprecated
109
+
110
+ # create a .dylib binary
111
+ @extra_ldflags << '-dynamic -bundle'
112
+
113
+ unless @wx_path.empty?
114
+ libdirs = @wx_libs.select {|s| s.start_with?('-L')}.collect {|s| s.sub(/^-L/,'')}
115
+ @exec_env['DYLD_LIBRARY_PATH'] = "#{ENV['DYLD_LIBRARY_PATH']}:#{dest_dir}:#{libdirs.join(':')}"
116
+ end
117
+ end
118
+ end
119
+ private :init_platform
120
+
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -21,8 +21,8 @@ module WXRuby3
21
21
  module Platform
22
22
 
23
23
  def self.included(base)
24
- base.include Config::UnixLike
25
24
  base.class_eval do
25
+ include Config::UnixLike
26
26
 
27
27
  attr_reader :rescomp
28
28
 
@@ -52,6 +52,10 @@ module WXRuby3
52
52
 
53
53
  private
54
54
 
55
+ def wx_make
56
+ bash('make && make install')
57
+ end
58
+
55
59
  def wx_generate_xml
56
60
  chdir(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen')) do
57
61
  sh({ 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, 'regen.bat xml')
@@ -107,6 +111,7 @@ module WXRuby3
107
111
 
108
112
  @ruby_ldflags.each { |flags| flags.sub!(' $(DEFFILE)', '') } # cleanup for older RubyInstaller versions
109
113
  @ruby_ldflags.each { |flags| flags.gsub!(/-s(\s|\Z)/, '') } if @debug_build # do not strip debug symbols for debug build
114
+ @ruby_ldflags << '-s' if @release_build # strip debug symbols for release build
110
115
  @ruby_cppflags << RB_CONFIG['debugflags'] if @debug_build
111
116
  @ruby_cppflags.each { |flags| flags.gsub!(/-O\d/, '-O0') } if @debug_build # disable optimizations for debug build
112
117
 
@@ -52,6 +52,10 @@ module WXRuby3
52
52
  "#{WXRuby3.config.libs} #{WXRuby3.config.link_output_flag}#{pkg.lib_target}"
53
53
  end
54
54
 
55
+ def get_rpath_origin
56
+ "$ORIGIN"
57
+ end
58
+
55
59
  private
56
60
 
57
61
  def wx_checkout
@@ -76,6 +80,14 @@ module WXRuby3
76
80
  end
77
81
  end
78
82
 
83
+ def wx_configure
84
+ bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info')
85
+ end
86
+
87
+ def wx_make
88
+ bash('make -j$(nproc) && make install')
89
+ end
90
+
79
91
  def wx_build
80
92
  # initialize submodules
81
93
  unless sh('git submodule update --init')
@@ -83,12 +95,12 @@ module WXRuby3
83
95
  exit(1)
84
96
  end
85
97
  # configure wxWidgets
86
- unless bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info')
98
+ unless wx_configure
87
99
  STDERR.puts "ERROR: Failed to configure wxWidgets."
88
100
  exit(1)
89
101
  end
90
102
  # make and install wxWidgets
91
- unless bash('make && make install')
103
+ unless wx_make
92
104
  STDERR.puts "ERROR: Failed to build wxWidgets libraries."
93
105
  exit(1)
94
106
  end
@@ -117,6 +129,16 @@ module WXRuby3
117
129
  get_cfg_string('wxxml')
118
130
  end
119
131
 
132
+ def get_wx_libs
133
+ wx_libset = ::Set.new
134
+ wx_libset.merge wx_config("--libs all").split(' ')
135
+ # some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
136
+ if features_set?('wxUSE_MEDIACTRL')
137
+ wx_libset.merge wx_config("--libs media").split(' ')
138
+ end
139
+ wx_libset.collect { |s| s.dup }
140
+ end
141
+
120
142
  def init_unix_platform
121
143
  # Allow specification of custom wxWidgets build (mostly useful for
122
144
  # static wxRuby3 builds)
@@ -155,13 +177,7 @@ module WXRuby3
155
177
 
156
178
  @cpp = wx_config("--cxx")
157
179
  @ld = wx_config("--ld")
158
- wx_libset = ::Set.new
159
- wx_libset.merge wx_config("--libs all").split(' ')
160
- # some weird thing with this; at least sometimes '--libs all' will not output media library even if feature active
161
- if features_set?('wxUSE_MEDIACTRL')
162
- wx_libset.merge wx_config("--libs media").split(' ')
163
- end
164
- @wx_libs = wx_libset.collect { |s| s.dup }
180
+ @wx_libs = get_wx_libs
165
181
 
166
182
  # remove all warning flags provided by Ruby config
167
183
  @ruby_cppflags = @ruby_cppflags.collect { |flags| flags.split(' ') }.flatten.
@@ -169,8 +185,7 @@ module WXRuby3
169
185
  @ruby_cppflags.concat %w[-Wall -Wextra -Wno-unused-parameter] # only keep these
170
186
  # add include flags
171
187
  @ruby_cppflags.concat ['-I.', *@ruby_includes.collect { |inc| "-I#{inc}" }]
172
- @ruby_ldflags << '-s' if @release_build # strip debug symbols for release build
173
- @ruby_ldflags << "-Wl,-rpath,\\$ORIGIN/../lib" # add default rpath
188
+ @ruby_ldflags << "-Wl,-rpath,'#{get_rpath_origin}/../lib'" # add default rpath
174
189
  @ruby_libs << "-L#{RB_CONFIG['libdir']}" # add ruby lib dir
175
190
  # add ruby defined shared ruby lib(s); not any other flags
176
191
  @ruby_libs.concat RB_CONFIG['LIBRUBYARG_SHARED'].split(' ').select { |s| s.start_with?('-l')}
@@ -245,11 +245,19 @@ module WXRuby3
245
245
  def do_link(_pkg)
246
246
  end
247
247
 
248
+ def get_rpath_origin
249
+ ''
250
+ end
251
+
248
252
  def check_rpath_patch
249
253
  true
250
254
  end
251
255
 
252
- def patch_rpath(_shlib, _rpath)
256
+ def patch_rpath(_shlib, *)
257
+ true
258
+ end
259
+
260
+ def update_shlib_loadpaths(_shlib, _deplibs)
253
261
  true
254
262
  end
255
263
 
@@ -389,11 +397,12 @@ module WXRuby3
389
397
  @rb_docgen_path = File.join(Config.wxruby_root, @rb_docgen_dir)
390
398
 
391
399
  # Extra swig helper files to be built
392
- @helper_modules = if macosx?
393
- %w|RubyStockObjects Mac|
394
- else
395
- %w|RubyStockObjects|
396
- end
400
+ @helper_modules = %w|RubyStockObjects|
401
+ # if macosx?
402
+ # %w|RubyStockObjects Mac|
403
+ # else
404
+ # %w|RubyStockObjects|
405
+ # end
397
406
  # helper to initialize on startup (stock objects can only be initialized after App creation)
398
407
  @helper_inits = @helper_modules - %w|RubyStockObjects|
399
408
 
@@ -182,7 +182,7 @@ module WXRuby3
182
182
  # any included mixins for this class?
183
183
  !mixins.has_key?(cls) ||
184
184
  # if so, are all initialized?
185
- mixins[cls].all? do |modname|
185
+ mixins[cls].keys.all? do |modname|
186
186
  # same package?
187
187
  if modname.start_with?(cls_helper.package.fullname)
188
188
  wx_name = "wx#{modname.split('::').last}"
@@ -299,8 +299,8 @@ module WXRuby3
299
299
  @mixins.include?(cls)
300
300
  end
301
301
 
302
- def include_mixin(cls, *module_names)
303
- (@included_mixins[cls] ||= ::Set.new).merge module_names.flatten
302
+ def include_mixin(cls, mixin_module)
303
+ (@included_mixins[cls] ||= {}).merge!(mixin_module.is_a?(::Hash) ? mixin_module : {mixin_module => nil})
304
304
  self
305
305
  end
306
306
 
@@ -71,6 +71,35 @@ module WXRuby3
71
71
  return dynamic_cast<const wxRubyApp*>(self)->IsRunning();
72
72
  }
73
73
  __HEREDOC
74
+ if Config.platform == :macosx
75
+ # add accessor methods for the standard OSX menu items
76
+ spec.add_extend_code 'wxApp', <<~__HEREDOC
77
+ void set_mac_about_menu_itemid(long menu_itemid)
78
+ {
79
+ $self->s_macAboutMenuItemId = menu_itemid;
80
+ }
81
+ long get_mac_about_menu_itemid(long menu_itemid)
82
+ {
83
+ return $self->s_macAboutMenuItemId;
84
+ }
85
+ void set_mac_preferences_menu_itemid(long menu_itemid)
86
+ {
87
+ $self->s_macPreferencesMenuItemId = menu_itemid;
88
+ }
89
+ long get_mac_preferences_menu_itemid(long menu_itemid)
90
+ {
91
+ return $self->s_macPreferencesMenuItemId;
92
+ }
93
+ void set_mac_exit_menu_itemid(long menu_itemid)
94
+ {
95
+ $self->s_macExitMenuItemId = menu_itemid;
96
+ }
97
+ long get_mac_exit_menu_itemid(long menu_itemid)
98
+ {
99
+ return $self->s_macExitMenuItemId;
100
+ }
101
+ __HEREDOC
102
+ end
74
103
  spec.ignore [
75
104
  'wxEntry(int &,wxChar **)',
76
105
  'wxEntry(HINSTANCE,HINSTANCE,char *,int)'
@@ -339,7 +368,7 @@ module WXRuby3
339
368
  }
340
369
 
341
370
  // actually implemented in ruby in classes/app.rb
342
- virtual void OnAssertFailure(const wxChar *file, int line, const wxChar *func, const wxChar *cond, const wxChar *msg)
371
+ virtual void OnAssertFailure(const wxChar *file, int line, const wxChar *func, const wxChar *cond, const wxChar *msg) override
343
372
  {
344
373
  VALUE rb_app = SWIG_RubyInstanceFor(this);
345
374
  if (rb_during_gc() || NIL_P(rb_app))
@@ -13,6 +13,47 @@ module WXRuby3
13
13
 
14
14
  def setup
15
15
  super
16
+ # for #set_custom_overflow_items
17
+ spec.map 'const wxAuiToolBarItemArray&' => 'Array<Wx::AUI::AuiToolbarItem>,nil' do
18
+ map_in temp: 'wxAuiToolBarItemArray tmp', code: <<~__CODE
19
+ if (!NIL_P($input))
20
+ {
21
+ if (TYPE($input) == T_ARRAY)
22
+ {
23
+ for (int i=0; i<RARRAY_LEN($input) ;++i)
24
+ {
25
+ VALUE rb_el = rb_ary_entry($input, i);
26
+ void* ptr = 0;
27
+ int res = SWIG_ConvertPtr(rb_el, &ptr, SWIGTYPE_p_wxAuiToolBarItem, 0);
28
+ if (!SWIG_IsOK(res) || ptr == 0)
29
+ {
30
+ const char* msg;
31
+ VALUE rb_msg;
32
+ if (ptr)
33
+ {
34
+ rb_msg = rb_inspect(rb_el);
35
+ msg = StringValuePtr(rb_msg);
36
+ }
37
+ else
38
+ {
39
+ msg = "null reference";
40
+ }
41
+ rb_raise(rb_eTypeError, "$symname : expected Wx::AUI::AuiToolbarItem for array element for $argnum but got %s",
42
+ msg);
43
+ }
44
+ tmp.Add(*reinterpret_cast< wxAuiToolBarItem * >(ptr));
45
+ }
46
+ }
47
+ else
48
+ {
49
+ VALUE msg = rb_inspect($input);
50
+ rb_raise(rb_eArgError, "$symname : expected array for $argnum but got %s",
51
+ StringValuePtr(msg));
52
+ }
53
+ }
54
+ $1 = &tmp;
55
+ __CODE
56
+ end
16
57
  spec.do_not_generate(:variables, :defines, :enums, :functions) # with AuiToolBarEvent
17
58
  end
18
59
  end # class AuiToolBar
@@ -20,7 +20,16 @@ module WXRuby3
20
20
  # these are defined and loaded in RubyStockObjects.i
21
21
  spec.ignore %w[
22
22
  wxBLUE_BRUSH wxGREEN_BRUSH wxYELLOW_BRUSH wxWHITE_BRUSH wxBLACK_BRUSH wxGREY_BRUSH
23
- wxMEDIUM_GREY_BRUSH wxLIGHT_GREY_BRUSH wxTRANSPARENT_BRUSH wxCYAN_BRUSH wxRED_BRUSH wxTheBrushList]
23
+ wxMEDIUM_GREY_BRUSH wxLIGHT_GREY_BRUSH wxTRANSPARENT_BRUSH wxCYAN_BRUSH wxRED_BRUSH]
24
+ # do not expose this
25
+ spec.ignore 'wxTheBrushList'
26
+ # provide it's functionality as a class method of Brush instead
27
+ spec.add_extend_code 'wxBrush', <<~__HEREDOC
28
+ static wxBrush* find_or_create_brush(const wxColour &colour, wxBrushStyle style=wxBRUSHSTYLE_SOLID)
29
+ {
30
+ return wxTheBrushList->FindOrCreateBrush(colour, style);
31
+ }
32
+ __HEREDOC
24
33
  end
25
34
  end # class Brush
26
35
 
@@ -15,7 +15,7 @@ module WXRuby3
15
15
  super
16
16
  setup_ctrl_with_items('wxComboBox')
17
17
  # mixin TextEntry
18
- spec.include_mixin 'wxComboBox', 'Wx::TextEntry'
18
+ spec.include_mixin 'wxComboBox', { 'Wx::TextEntry' => 'wxTextEntryBase' }
19
19
  spec.override_inheritance_chain('wxComboBox',
20
20
  %w[wxControlWithItems
21
21
  wxControl
@@ -0,0 +1,23 @@
1
+ ###
2
+ # wxRuby3 wxWidgets interface director
3
+ # Copyright (c) M.J.N. Corino, The Netherlands
4
+ ###
5
+
6
+ require_relative './button'
7
+
8
+ module WXRuby3
9
+
10
+ class Director
11
+
12
+ class ContextHelpButton < Button
13
+
14
+ def setup
15
+ super
16
+ spec.items << 'wxContextHelp'
17
+ spec.no_proxy 'wxContextHelp'
18
+ end
19
+ end # class ContextHelpButton
20
+
21
+ end # class Director
22
+
23
+ end # module WXRuby3
@@ -30,8 +30,14 @@ module WXRuby3
30
30
  when 'wxMessageDialog'
31
31
  when 'wxFontDialog'
32
32
  # ignore the non-const version
33
- spec.ignore 'wxFontDialog::GetFontData'
34
- spec.regard 'wxFontDialog::GetFontData() const'
33
+ if Config.platform == :macosx && Config.instance.wx_version < '3.3'
34
+ # MacOSX implementation is incorrect so we need to use
35
+ # the non-const definition here
36
+ spec.ignore 'wxFontDialog::GetFontData() const'
37
+ else
38
+ spec.ignore 'wxFontDialog::GetFontData'
39
+ spec.regard 'wxFontDialog::GetFontData() const'
40
+ end
35
41
  when 'wxFileDialog'
36
42
  # override the wxArrayString& typemap for GetFilenames and GetPaths
37
43
  spec.map 'wxArrayString&' => 'Array<String>' do
@@ -24,9 +24,7 @@ module WXRuby3
24
24
  'wxFont::GetDefaultEncoding',
25
25
  'wxFont::SetDefaultEncoding'
26
26
  spec.rename_for_ruby 'create' => 'wxFont::New'
27
- spec.ignore %w[
28
- wxFont::SetNativeFontInfo wxFont::GetNativeFontInfo wxFont::operator!=
29
- ]
27
+ spec.ignore [ 'wxFont::SetNativeFontInfo(const wxNativeFontInfo &)', 'wxFont::GetNativeFontInfo', 'wxFont::operator!=' ]
30
28
  spec.ignore 'wxFont::wxFont(const wxNativeFontInfo &)'
31
29
  if Config.instance.wx_port == :wxQT
32
30
  # not implemented
@@ -87,6 +85,17 @@ module WXRuby3
87
85
  return SWIG_NewPointerObj(new wxFont(font), SWIGTYPE_p_wxFont, SWIG_POINTER_OWN);
88
86
  }
89
87
  __HEREDOC
88
+ # implement wxTheFontList methods as static methods of Wx::Font
89
+ spec.add_extend_code 'wxFont', <<~__HEREDOC
90
+ static wxFont * find_or_create_font(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
91
+ {
92
+ return wxTheFontList->FindOrCreateFont(point_size, family, style, weight, underline, facename, encoding);
93
+ }
94
+ static wxFont * find_or_create_font(const wxFontInfo &fontInfo)
95
+ {
96
+ return wxTheFontList->FindOrCreateFont(fontInfo);
97
+ }
98
+ __HEREDOC
90
99
  spec.do_not_generate :functions
91
100
  end
92
101
 
@@ -27,7 +27,7 @@ module WXRuby3
27
27
  public:
28
28
  // This is pure virtual in base Wx class, so won't compile unless an
29
29
  // implementation is provided
30
- wxString GetHelp(const wxWindowBase* window)
30
+ wxString GetHelp(const wxWindowBase* window) override
31
31
  {
32
32
  static WxRuby_ID get_help_id("get_help");
33
33
 
@@ -50,7 +50,7 @@ module WXRuby3
50
50
  // RemoveHelp is called by Wx after the window deletion event has been
51
51
  // handled. A standard director here re-wraps the already destroyed
52
52
  // object, which will cause rapid segfaults when it is later marked.
53
- void RemoveHelp(wxWindowBase* window)
53
+ void RemoveHelp(wxWindowBase* window) override
54
54
  {
55
55
  static WxRuby_ID remove_help_id("remove_help");
56
56
 
@@ -64,13 +64,8 @@ module WXRuby3
64
64
  };
65
65
  __HEREDOC
66
66
  spec.add_swig_code <<~__HEREDOC
67
+ GC_MANAGE_AS_OBJECT(wxRubyHelpProvider);
67
68
  typedef wxWindow wxWindowBase;
68
-
69
- %ignore wxHelpProvider::GetHelp; // Must be supplied in Ruby
70
-
71
- // Need to avoid standard director as it will call with destroyed
72
- // objects
73
- %feature("nodirector") wxHelpProvider::RemoveHelp;
74
69
  __HEREDOC
75
70
  spec.map 'wxWindowBase' => 'Wx::Window', swig: false do
76
71
  map_in
@@ -88,8 +83,11 @@ module WXRuby3
88
83
  static wxRubyHelpProvider* Get();
89
84
  virtual void AddHelp(wxWindowBase* window, const wxString& text);
90
85
  virtual void AddHelp(wxWindowID id, const wxString& text);
91
- virtual wxString GetHelp(const wxWindowBase* window);
92
- virtual void RemoveHelp(wxWindowBase* window);
86
+ // we do not include the declaration of GetHelp here because
87
+ // we do not want a default implementation or director as we have
88
+ // a fixed director implementation above and the rest is pure Ruby
89
+ // virtual wxString GetHelp(const wxWindowBase* window);
90
+ void RemoveHelp(wxWindowBase* window); // no virtual as we have fixed director impl above
93
91
  virtual bool ShowHelp(wxWindowBase* window);
94
92
  virtual bool ShowHelpAtPoint(wxWindowBase* window, const wxPoint point,
95
93
  wxHelpEvent::Origin origin);
@@ -0,0 +1,22 @@
1
+ ###
2
+ # wxRuby3 wxWidgets interface director
3
+ # Copyright (c) M.J.N. Corino, The Netherlands
4
+ ###
5
+
6
+ require_relative './event'
7
+
8
+ module WXRuby3
9
+
10
+ class Director
11
+
12
+ class HyperlinkEvent < Event
13
+
14
+ def setup
15
+ super
16
+ spec.do_not_generate :variables, :enums, :defines, :functions # with HyperlinkCtrl
17
+ end
18
+ end # class HyperlinkEvent
19
+
20
+ end # class Director
21
+
22
+ end # module WXRuby3
@@ -30,9 +30,6 @@ module WXRuby3
30
30
  __HEREDOC
31
31
  # make Ruby director and wrappers use custom implementation
32
32
  spec.use_class_implementation('wxMenu', 'wxRubyMenu')
33
- spec.rename_for_ruby(
34
- 'AppendItem' =>
35
- 'wxMenu::Append(wxMenuItem *item)')
36
33
  # ignore non-const version as that has no benefits in Ruby
37
34
  spec.ignore 'wxMenu::GetMenuItems()'
38
35
  # Fix for GetMenuItems - converts list of MenuItems to Array
@@ -19,6 +19,9 @@ module WXRuby3
19
19
  'wxMenuBar::GetLabelTop',
20
20
  'wxMenuBar::SetLabelTop',
21
21
  'wxMenuBar::Refresh')
22
+ unless Config.instance.wx_version >= '3.3' || Config.instance.wx_abi_version > '3.0.0'
23
+ spec.ignore 'wxMenuBar::OSXGetAppleMenu'
24
+ end
22
25
  super
23
26
  end
24
27
  end # class MenuBar
@@ -166,7 +166,16 @@ module WXRuby3
166
166
  # these are defined and loaded in RubyStockObjects.i
167
167
  spec.ignore %w[
168
168
  wxRED_PEN wxBLUE_PEN wxCYAN_PEN wxGREEN_PEN wxYELLOW_PEN wxBLACK_PEN wxWHITE_PEN
169
- wxTRANSPARENT_PEN wxBLACK_DASHED_PEN wxGREY_PEN wxMEDIUM_GREY_PEN wxLIGHT_GREY_PEN wxThePenList]
169
+ wxTRANSPARENT_PEN wxBLACK_DASHED_PEN wxGREY_PEN wxMEDIUM_GREY_PEN wxLIGHT_GREY_PEN]
170
+ # do not expose this
171
+ spec.ignore 'wxThePenList'
172
+ # provide it's functionality as a class method of Pen instead
173
+ spec.add_extend_code 'wxPen', <<~__HEREDOC
174
+ static wxPen* find_or_create_pen(const wxColour &colour, int width=1, wxPenStyle style=wxPENSTYLE_SOLID)
175
+ {
176
+ return wxThePenList->FindOrCreatePen(colour, width, style);
177
+ }
178
+ __HEREDOC
170
179
  end
171
180
  end # class Pen
172
181
 
@@ -14,6 +14,24 @@ module WXRuby3
14
14
  def setup
15
15
  spec.items << 'wxPopupTransientWindow'
16
16
  super
17
+ spec.items.each do |itm|
18
+ spec.no_proxy("#{itm}::ClearBackground",
19
+ "#{itm}::Enable",
20
+ "#{itm}::GetHelpTextAtPoint",
21
+ "#{itm}::GetMaxSize",
22
+ "#{itm}::GetMinSize",
23
+ "#{itm}::Refresh",
24
+ "#{itm}::Update")
25
+ end
26
+ # add these to the generated interface to be parsed by SWIG
27
+ # the wxWidgets docs are flawed in this respect that several reimplemented
28
+ # virtual methods are not documented at the reimplementing class as such
29
+ # that would cause them missing from the interface which would cause a problem
30
+ # for a SWIG director redirecting to the Ruby class as the SWIG wrappers
31
+ # redirect explicitly to the implementation at the same class level as the wrapper
32
+ # for upcalls
33
+ spec.extend_interface('wxPopupWindow',
34
+ 'virtual bool Show(bool show = true) override')
17
35
  end
18
36
 
19
37
  end # class PopupWindow
@@ -14,22 +14,33 @@ module WXRuby3
14
14
  spec.items << 'wxItemContainerImmutable'
15
15
  spec.fold_bases('wxRadioBox' => 'wxItemContainerImmutable')
16
16
  spec.override_inheritance_chain('wxRadioBox', %w[wxControl wxWindow wxEvtHandler wxObject])
17
- # ignore overload hiding common Window method
18
- spec.ignore('wxRadioBox::Enable')
17
+ # ignore overloads hiding common Window method
18
+ spec.ignore('wxRadioBox::Enable', 'wxRadioBox::Show')
19
19
  spec.add_extend_code 'wxRadioBox', <<~__HEREDOC
20
- // add custom method to reach common Window method
20
+ // add custom method to reach common Window method overload
21
21
  bool EnableWindow(bool enable=true)
22
22
  {
23
- return $self->wxWindow::Enable(enable);
23
+ return $self->Enable(enable);
24
24
  }
25
25
  // add right method to enable/disable items
26
26
  bool EnableItem(unsigned int n, bool enable=true)
27
27
  {
28
28
  return $self->Enable(n, enable);
29
29
  }
30
+ // add custom method to reach common Window method overload
31
+ bool ShowWindow(bool show=true)
32
+ {
33
+ return $self->Show(show);
34
+ }
35
+ // add right method to show/hide items
36
+ bool ShowItem(unsigned int n, bool show=true)
37
+ {
38
+ return $self->Show(n, show);
39
+ }
30
40
  __HEREDOC
31
41
  # rename common method
32
42
  spec.rename_for_ruby('Enable' => 'wxRadioBox::EnableWindow')
43
+ spec.rename_for_ruby('Show' => 'wxRadioBox::ShowWindow')
33
44
  super
34
45
  end
35
46
  end # class Window