wxruby3 0.9.0.pre.beta.14 → 0.9.0.pre.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/INSTALL.md +51 -22
  4. data/README.md +81 -6
  5. data/assets/hello_button-macos.png +0 -0
  6. data/assets/hello_button-msw.png +0 -0
  7. data/assets/hello_button.png +0 -0
  8. data/assets/hello_button_clicked-macos.png +0 -0
  9. data/assets/hello_button_clicked-msw.png +0 -0
  10. data/assets/hello_button_clicked.png +0 -0
  11. data/assets/hello_button_clicked_combi.png +0 -0
  12. data/assets/hello_world-macos.png +0 -0
  13. data/assets/hello_world-msw.png +0 -0
  14. data/assets/hello_world.png +0 -0
  15. data/assets/hello_world_combi.png +0 -0
  16. data/assets/repo-social-preview.png +0 -0
  17. data/ext/wxruby3/include/wxruby-runtime.h +1 -0
  18. data/ext/wxruby3/swig/memory_management.i +6 -10
  19. data/ext/wxruby3/swig/wx.i +17 -6
  20. data/lib/wx/core/art_locator.rb +2 -2
  21. data/lib/wx/core/artprovider.rb +2 -2
  22. data/lib/wx/core/bitmap.rb +6 -5
  23. data/lib/wx/core/bitmap_combobox.rb +34 -0
  24. data/lib/wx/core/brush.rb +6 -0
  25. data/lib/wx/core/controlwithitems.rb +52 -14
  26. data/lib/wx/core/cursor.rb +1 -1
  27. data/lib/wx/core/dc.rb +0 -20
  28. data/lib/wx/core/event_blocker.rb +14 -0
  29. data/lib/wx/core/evthandler.rb +48 -2
  30. data/lib/wx/core/find_replace_dialog.rb +24 -0
  31. data/lib/wx/core/font.rb +22 -14
  32. data/lib/wx/core/helpprovider.rb +2 -2
  33. data/lib/wx/core/icon.rb +1 -1
  34. data/lib/wx/core/image.rb +1 -1
  35. data/lib/wx/core/menu.rb +5 -0
  36. data/lib/wx/core/paintdc.rb +8 -0
  37. data/lib/wx/core/pen.rb +6 -0
  38. data/lib/wx/core/text_entry.rb +15 -0
  39. data/lib/wx/core/v_list_box.rb +13 -0
  40. data/lib/wx/core/window.rb +29 -2
  41. data/lib/wx/doc/app.rb +40 -0
  42. data/lib/wx/doc/brush.rb +17 -0
  43. data/lib/wx/doc/busy_info.rb +21 -0
  44. data/lib/wx/doc/client_dc.rb +28 -0
  45. data/lib/wx/doc/controlwithitems.rb +11 -0
  46. data/lib/wx/doc/dc.rb +0 -14
  47. data/lib/wx/doc/event_blocker.rb +27 -0
  48. data/lib/wx/doc/evthandler.rb +4 -0
  49. data/lib/wx/doc/extra/02_lifecycles.md +49 -0
  50. data/lib/wx/doc/extra/10_art.md +1 -1
  51. data/lib/wx/doc/extra/11_drawing_and_dc.md +62 -0
  52. data/lib/wx/doc/font.rb +27 -0
  53. data/lib/wx/doc/memory_dc.rb +75 -0
  54. data/lib/wx/doc/mirror_dc.rb +16 -0
  55. data/lib/wx/doc/pen.rb +17 -0
  56. data/lib/wx/doc/prt/printer_dc.rb +26 -0
  57. data/lib/wx/doc/radio_box.rb +20 -0
  58. data/lib/wx/doc/screen_dc.rb +10 -6
  59. data/lib/wx/doc/svg_file_dc.rb +20 -0
  60. data/lib/wx/doc/v_list_box.rb +9 -0
  61. data/lib/wx/doc/window.rb +27 -0
  62. data/lib/wx/doc/window_disabler.rb +10 -0
  63. data/lib/wx/html/keyword_defs.rb +6 -7
  64. data/lib/wx/html/require.rb +1 -0
  65. data/lib/wx/html/simple_html_listbox.rb +105 -0
  66. data/lib/wx/keyword_defs.rb +83 -75
  67. data/lib/wx/prt/keyword_defs.rb +5 -1
  68. data/lib/wx/version.rb +1 -1
  69. data/lib/wx/wxruby/cmd/test.rb +1 -1
  70. data/rakelib/install.rb +20 -7
  71. data/rakelib/lib/config/linux.rb +4 -2
  72. data/rakelib/lib/config/macosx.rb +120 -1
  73. data/rakelib/lib/config/mingw.rb +6 -1
  74. data/rakelib/lib/config/unixish.rb +26 -11
  75. data/rakelib/lib/config.rb +15 -6
  76. data/rakelib/lib/core/mapping.rb +5 -5
  77. data/rakelib/lib/core/package.rb +1 -1
  78. data/rakelib/lib/core/spec.rb +9 -5
  79. data/rakelib/lib/core/spec_helper.rb +9 -1
  80. data/rakelib/lib/director/accelerator.rb +1 -1
  81. data/rakelib/lib/director/app.rb +55 -4
  82. data/rakelib/lib/director/art_provider.rb +5 -1
  83. data/rakelib/lib/director/aui_pane_info.rb +1 -1
  84. data/rakelib/lib/director/aui_tab_ctrl.rb +1 -1
  85. data/rakelib/lib/director/aui_toolbar.rb +41 -0
  86. data/rakelib/lib/director/bitmap.rb +2 -1
  87. data/rakelib/lib/director/bitmap_combobox.rb +32 -0
  88. data/rakelib/lib/director/brush.rb +11 -1
  89. data/rakelib/lib/director/busy_info.rb +1 -1
  90. data/rakelib/lib/director/choice.rb +1 -0
  91. data/rakelib/lib/director/clipboard.rb +1 -1
  92. data/rakelib/lib/director/colour.rb +1 -0
  93. data/rakelib/lib/director/colour_picker_ctrl.rb +1 -1
  94. data/rakelib/lib/director/combobox.rb +2 -3
  95. data/rakelib/lib/director/context_help_button.rb +23 -0
  96. data/rakelib/lib/director/ctrl_with_items.rb +3 -0
  97. data/rakelib/lib/director/cursor.rb +1 -0
  98. data/rakelib/lib/director/data_object.rb +5 -7
  99. data/rakelib/lib/director/dc.rb +5 -1
  100. data/rakelib/lib/director/defs.rb +3 -0
  101. data/rakelib/lib/director/derived_dc.rb +278 -27
  102. data/rakelib/lib/director/dialog.rb +12 -3
  103. data/rakelib/lib/director/dir_picker_ctrl.rb +1 -1
  104. data/rakelib/lib/director/event.rb +3 -3
  105. data/rakelib/lib/director/event_blocker.rb +41 -0
  106. data/rakelib/lib/director/event_filter.rb +20 -0
  107. data/rakelib/lib/director/event_handler.rb +29 -2
  108. data/rakelib/lib/director/file_picker_ctrl.rb +1 -1
  109. data/rakelib/lib/director/find_replace_data.rb +1 -0
  110. data/rakelib/lib/director/font.rb +14 -4
  111. data/rakelib/lib/director/font_data.rb +1 -0
  112. data/rakelib/lib/director/font_picker_ctrl.rb +1 -1
  113. data/rakelib/lib/director/gdi_object.rb +1 -0
  114. data/rakelib/lib/director/graphics_context.rb +6 -6
  115. data/rakelib/lib/director/grid_table_message.rb +1 -1
  116. data/rakelib/lib/director/help_provider.rb +8 -10
  117. data/rakelib/lib/director/html_cell.rb +1 -1
  118. data/rakelib/lib/director/html_data_object.rb +5 -7
  119. data/rakelib/lib/director/html_listbox.rb +65 -1
  120. data/rakelib/lib/director/hyperlink_event.rb +22 -0
  121. data/rakelib/lib/director/icon.rb +2 -0
  122. data/rakelib/lib/director/listbox.rb +1 -0
  123. data/rakelib/lib/director/locale.rb +2 -1
  124. data/rakelib/lib/director/menu.rb +0 -3
  125. data/rakelib/lib/director/menu_bar.rb +3 -0
  126. data/rakelib/lib/director/palette.rb +1 -0
  127. data/rakelib/lib/director/pen.rb +12 -2
  128. data/rakelib/lib/director/pgproperties.rb +1 -1
  129. data/rakelib/lib/director/pgproperty.rb +1 -1
  130. data/rakelib/lib/director/pgvalidation_info.rb +1 -1
  131. data/rakelib/lib/director/platform_info.rb +1 -1
  132. data/rakelib/lib/director/popup_window.rb +18 -0
  133. data/rakelib/lib/director/print_data.rb +1 -1
  134. data/rakelib/lib/director/property_grid_interface.rb +1 -1
  135. data/rakelib/lib/director/property_grid_page_state.rb +1 -1
  136. data/rakelib/lib/director/radio_box.rb +15 -4
  137. data/rakelib/lib/director/region.rb +1 -0
  138. data/rakelib/lib/director/ribbon_art_provider.rb +1 -1
  139. data/rakelib/lib/director/richtext_buffer_data_object.rb +5 -7
  140. data/rakelib/lib/director/richtext_header_footer_data.rb +1 -1
  141. data/rakelib/lib/director/searchctrl.rb +25 -0
  142. data/rakelib/lib/director/sizer.rb +2 -2
  143. data/rakelib/lib/director/static_box.rb +1 -1
  144. data/rakelib/lib/director/styled_text_ctrl.rb +2 -0
  145. data/rakelib/lib/director/text_entry.rb +7 -2
  146. data/rakelib/lib/director/textctrl.rb +1 -1
  147. data/rakelib/lib/director/tree_ctrl.rb +6 -3
  148. data/rakelib/lib/director/uiaction_simulator.rb +20 -0
  149. data/rakelib/lib/director/variant.rb +1 -1
  150. data/rakelib/lib/director/vlistbox.rb +25 -0
  151. data/rakelib/lib/director/window.rb +37 -7
  152. data/rakelib/lib/director/with_images.rb +1 -1
  153. data/rakelib/lib/director/xml_node.rb +1 -1
  154. data/rakelib/lib/extractor/function.rb +5 -3
  155. data/rakelib/lib/generate/doc/about_dialog_info.yaml +46 -0
  156. data/rakelib/lib/generate/doc/accelerator.yaml +21 -0
  157. data/rakelib/lib/generate/doc/art_provider.yaml +35 -0
  158. data/rakelib/lib/generate/doc/bitmap.yaml +37 -0
  159. data/rakelib/lib/generate/doc/box_sizer.yaml +15 -0
  160. data/rakelib/lib/generate/doc/busy_info.yaml +74 -0
  161. data/rakelib/lib/generate/doc/client_dc.yaml +19 -0
  162. data/rakelib/lib/generate/doc/clipboard.yaml +43 -0
  163. data/rakelib/lib/generate/doc/collapsible_pane.yaml +21 -0
  164. data/rakelib/lib/generate/doc/colour_dialog.yaml +32 -0
  165. data/rakelib/lib/generate/doc/context_help_button.yaml +16 -0
  166. data/rakelib/lib/generate/doc/control.yaml +46 -0
  167. data/rakelib/lib/generate/doc/cursor.yaml +40 -0
  168. data/rakelib/lib/generate/doc/data_object.yaml +55 -0
  169. data/rakelib/lib/generate/doc/dc.yaml +14 -0
  170. data/rakelib/lib/generate/doc/dialog.yaml +36 -0
  171. data/rakelib/lib/generate/doc/dir_dialog.yaml +25 -0
  172. data/rakelib/lib/generate/doc/event_blocker.yaml +27 -0
  173. data/rakelib/lib/generate/doc/event_filter.yaml +47 -0
  174. data/rakelib/lib/generate/doc/events.yaml +152 -0
  175. data/rakelib/lib/generate/doc/evt_handler.yaml +63 -0
  176. data/rakelib/lib/generate/doc/file_dialog.yaml +68 -0
  177. data/rakelib/lib/generate/doc.rb +77 -14
  178. data/rakelib/lib/generate/interface.rb +22 -10
  179. data/rakelib/lib/specs/interfaces.rb +9 -5
  180. data/rakelib/lib/swig_runner.rb +3 -3
  181. data/rakelib/lib/typemap/common.rb +15 -3
  182. data/rakelib/lib/util/string.rb +1 -0
  183. data/rakelib/yard/yard/relative_markdown_links.rb +5 -1
  184. data/samples/aui/aui.rb +432 -363
  185. data/samples/bigdemo/wxArtProvider.rbw +5 -4
  186. data/samples/controls/controls.rb +2 -2
  187. data/samples/controls/htlbox.rb +411 -0
  188. data/samples/controls/tn_htlbox.png +0 -0
  189. data/samples/drawing/graphics_drawing.rb +1 -2
  190. data/samples/drawing/{svgtest.rb → image_prt.rb} +49 -18
  191. data/samples/drawing/tn_image_prt.png +0 -0
  192. data/samples/propgrid/propgrid.rb +26 -21
  193. data/samples/ribbon/ribbon.rb +47 -46
  194. data/samples/sampler/editor.rb +33 -25
  195. data/samples/sampler/sample.rb +2 -2
  196. data/samples/sampler/stc_editor.rb +4 -2
  197. data/tests/lib/item_container_tests.rb +82 -0
  198. data/tests/lib/text_entry_tests.rb +80 -0
  199. data/tests/lib/wxapp_runner.rb +15 -3
  200. data/tests/lib/wxframe_runner.rb +144 -0
  201. data/tests/test_app_event_filter.rb +74 -0
  202. data/tests/test_art_provider.rb +52 -0
  203. data/tests/test_clipboard.rb +2 -1
  204. data/tests/test_event_handling.rb +199 -16
  205. data/tests/test_events.rb +4 -11
  206. data/tests/test_ext_controls.rb +28 -0
  207. data/tests/test_font.rb +239 -0
  208. data/tests/test_gdi_object.rb +161 -0
  209. data/tests/test_intl.rb +16 -15
  210. data/tests/test_item_data.rb +33 -1
  211. data/tests/test_std_controls.rb +373 -0
  212. data/tests/test_window.rb +340 -0
  213. metadata +82 -4
  214. data/samples/drawing/tn_svgtest.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e6a85a400700ba48119fc656cf79208b3f5f603eaafb01d30206de46876dbf1
4
- data.tar.gz: ffe7e7cde7840f547efe45893162bfc54e2bd9402d7aaf975a98f298fbdbdf8e
3
+ metadata.gz: 9bc61b2275cfa2dd3f0616b3b899a0bdc8c006cb0f06d77b150cf1f596d3874e
4
+ data.tar.gz: 5c4ecc0394f8aeb5257f243adf488991add90a3f4f6fbe77e91d06e0f08abde6
5
5
  SHA512:
6
- metadata.gz: 86dc10b04a49bd56825267b23117720fa5b2398cb01194cdd050fa9d8f6c81ba5a80426447a82fa747a725cdb1802bc0138ebd43322c7c162104a14c5a71ebb3
7
- data.tar.gz: e9aa356d29c7d571f68a99dbd33041aed71d770951cca3d32a37b5eab634da938b9da931dad7fefafb67ad33401535357c27db647798e764abdd0def4133f09a
6
+ metadata.gz: e765d9941397f20fc0f770bbfc5e2e0a73ca00b76101c098d84a9802a5d3f924ea52f65ea8f960f3a1269f30aaa3fb5636aef61bf064784dc0716eb31ac27ab2
7
+ data.tar.gz: 994a3226ca8f8d61fc0bdff11fa1bce572614d40b6f351b49dea7f6b2ce0f2a4915114dbfccd20562c7a236280ce7575ef779cc358f628d5188613abee37d060
data/.yardopts CHANGED
@@ -1,6 +1,7 @@
1
1
  --load rakelib/yard/yard-relative_markdown_links.rb
2
2
  --load rakelib/yard/yard-custom-templates.rb
3
3
  --charset UTF-8
4
+ --markup markdown
4
5
  --readme README.md
5
6
  --title "wxRuby3 API Documentation"
6
7
  --output-dir rdoc
data/INSTALL.md CHANGED
@@ -4,32 +4,45 @@
4
4
 
5
5
  # Installation of wxRuby3
6
6
 
7
+ ## Minimal requirements for installing wxRuby3
8
+
9
+ The minimal requirements for installing any source based setup (gem, source package or Github clone) of wxRuby3 are:
10
+
11
+ | Sofware | Notes |
12
+ |-----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
13
+ | Ruby | A supported version of the Ruby interpreter needs to be installed. |
14
+ | C++ compiler<br>(incl. dev tools like `make`) | On linux a recent version of the GNU C++ compiler (with c++-14 support) needs to be installed<br>On Windows the RubyInstaller MSYS2-Devkit needs to be installed<br>On MacOS XCode with commandline tools needs to be installed |
15
+ | Git version control toolkit | |
16
+ | SWIG >= 3.0.12 | On MacOS install [Homebrew](https://brew.sh/) and than `brew install swig` |
17
+ | Doxygen (>= 1.9.1, <= 1.9.6) | Doxygen > 1.9.6 has changes that cause problems with the wxWidgets doxygen files.<br>On MacOS: `brew tap mcorino/wxruby3` and than `brew install doxygen@1.9.6` (default brew recipe installs 1.9.7) |
18
+
19
+ The wxRuby3 build process requires `git` to clone a copy of the wxWidgets Github repository to extract the interface
20
+ specifications from.<br>
21
+ The wxRuby3 build process needs doxygen to generated XML files containing wxWidgets interface specs which are used to
22
+ generate SWIG interface definitions from which SWIG to generates C++ source code for the wrapper interfaces from
23
+ which the native extension is compiled.
24
+
7
25
  ## Installation of a wxRuby3 Gem
8
26
 
9
27
  The wxRuby3 project provides gems on [RubyGems](https://rubygems.org) which can be installed with the
10
28
  standard `gem install` command line this:
11
29
 
12
- ```sh
30
+ ```shell
13
31
  gem install wxruby3
14
32
  ```
15
33
 
16
34
  On Linux systems this will install the source based gem which will automatically build the native wxruby3 extension
17
35
  for the platform on which wxRuby3 is being installed.
18
36
  On Windows systems a prebuilt binary gem is available for the latest stable release(s) of [RubyInstaller](https://rubyinstaller.org)
19
- installed rubies that will be installed by default if installing for that platform. Alternatively the source gem can be
20
- installed on Windows by installing with explicit platform specification like this:
37
+ installed rubies that will be installed by default if installing for that platform (including an embedded, latest
38
+ stable version, wxWidgets installation).<br>
39
+ Alternatively the source gem can be installed on Windows by installing with explicit platform specification like this:
21
40
 
22
- ```sh
41
+ ```shell
23
42
  gem install wxruby3 --platform=ruby
24
43
  ```
25
44
 
26
- When installing the source gem the following basic requirements apply:
27
-
28
- - Git version control toolkit
29
- - Ruby 2.5 or later (including development package)
30
- - GNU g++ 4.8 or later on Linux, RubyInstaller+DevKit on Windows
31
- - [SWIG](https://www.swig.org) 3.0.12 or later
32
- - [Doxygen](https://www.doxygen.nl/)
45
+ When installing the source gem the minimal requirements listed above apply.
33
46
 
34
47
  Also a wxWidgets installation (version 3.2 or later) is required for which there are multiple options.
35
48
 
@@ -39,38 +52,54 @@ Also a wxWidgets installation (version 3.2 or later) is required for which there
39
52
  The wxRuby build procedure will determine the availability and version of wxWidgets by locating and calling
40
53
  the `wx-config` utility script. In case no (compatible) wxWidgets version is found installation ends with an error.<br>
41
54
  Please note that even with this method a copy of the wxWidgets project will be checked out from GitHUb as the wxRuby3
42
- build procedure requires access to the wxWidgets interface specification sources (see [here](TODO) for more details).
55
+ build procedure requires access to the wxWidgets interface specification sources which are not normally part of any of
56
+ the standard distribution packages.
43
57
 
44
58
 
45
59
  2. User installed wxWidgets version<br>
46
60
  <br>
47
- In case the being system installed on does not provide (a compatible) wxWidgets version or a specific (possibly updated)
61
+ In case the system being installed on does not provide (a compatible) wxWidgets version or a specific (possibly updated)
48
62
  wxWidgets version is required the source gem can be installed using a user installed version like this (where the
49
63
  `WXWIN` path should provide the location where the wxWidgets binaries are installed under `<wxwin path>/bin`):<br>
50
64
 
51
- ```sh
65
+ ```shell
52
66
  gem install wxruby3 -- WXWIN=/path/to/wx/install
53
67
  ```
54
68
 
55
- 3. Automatic installed wxWidgets version<br>
69
+ 3. Automatic installed, embedded, wxWidgets version<br>
56
70
  <br>
57
- This is the easiest method when the being system installed on does not provide (a compatible) wxWidgets version (and
71
+ This is the easiest method when the system being installed on does not provide (a compatible) wxWidgets version (and
58
72
  no specific user defined version is required) and can be used by installing the source gem like this (which will
59
- cause automatic checkout and building of the latest wxWidgets release (>= 3.2) from GitHub:
60
-
73
+ cause automatic checkout and building of the latest stable wxWidgets release (>= 3.2) from GitHub:
61
74
 
62
- ```sh
75
+ ```shell
63
76
  gem install wxruby3 -- WITH_WXWIN=1
64
77
  ```
65
78
 
79
+ In case of option **2** it is also possible to do the doxygen XML generation as part of the wxWidgets user installation
80
+ and use that for the gem installation. In that case the user is required to generate the XML interface specs using the
81
+ `regen` script found in the `docs/doxygen` folder of the wxWidgets installation after which the XML output folder can be
82
+ provided to the gem installation as follows:
83
+
84
+ ```shell
85
+ gem install wxruby3 -- WXWIN=/path/to/wx/install WXXML=/path/to/wx/doxygen/xml
86
+ ```
87
+
88
+ Please also not that in case of option two the user is responsible to make sure the wxWidgets shared libraries can be
89
+ found by the system's dynamic loader at runtime.
90
+
66
91
  > **NOTE:** Be patient when installing the source gem. Building wxRuby3 takes a while and when wxWidgets is included event more.
67
92
 
93
+ > **NOTE:** Be aware that for prerelease versions of the gem you should add the `--pre` argument to the `gem install` command.
94
+
68
95
  ## Building from source
69
96
 
70
- Checkout the wxRuby3 sources from [GitHub](https://github.com/mcorino/wxRuby3).
97
+ Checkout the wxRuby3 sources from [GitHub](https://github.com/mcorino/wxRuby3) or download and unpack a release package.
71
98
 
72
- Basic requirements are the same as for installing the source gem. Gem dependencies are listed in the Gemfile in the root
73
- of the wxRuby3 tree.
99
+ Requirements are the same as for installing the source gem. Gem dependencies are listed in the Gemfile in the root
100
+ of the wxRuby3 tree and should be installed by executing `bundle install`.<br>
101
+ To be able to generate HTML documentation the optional `:documentation` group should be included.<br>
102
+ To be able to run the Rake memory check task the option `:develop` group should be included.
74
103
 
75
104
  The wxRuby3 project provides a Rake based build system. Call `rake help` to get an overview of the available commands.
76
105
  As mentioned there the `rake configure` command is required as the very first command. Call `rake configure[--help]` to
data/README.md CHANGED
@@ -1,9 +1,11 @@
1
1
  [![Linux wxGTK](https://github.com/mcorino/wxRuby3/actions/workflows/linux.yml/badge.svg)](https://github.com/mcorino/wxRuby3/actions/workflows/linux.yml)
2
2
  [![Windows wxMSW](https://github.com/mcorino/wxRuby3/actions/workflows/msw.yml/badge.svg)](https://github.com/mcorino/wxRuby3/actions/workflows/msw.yml)
3
+ [![Mac wxOSX](https://github.com/mcorino/wxRuby3/actions/workflows/mac.yml/badge.svg)](https://github.com/mcorino/wxRuby3/actions/workflows/mac.yml)
4
+
3
5
  [![License](https://img.shields.io/badge/license-MIT-yellowgreen.svg)](LICENSE)
4
6
  [![Gem Version](https://badge.fury.io/rb/wxruby3.svg)](https://badge.fury.io/rb/wxruby3)
5
-
6
7
  [![Documentation](https://img.shields.io/badge/docs-pages-blue.svg)](https://mcorino.github.io/wxRuby3)
8
+ [![Chat](https://img.shields.io/gitter/room/mcorino/wxruby)](https://gitter.im/mcorino/wxruby3)
7
9
 
8
10
  # README for wxRuby3
9
11
 
@@ -13,12 +15,52 @@ Reviving wxRuby
13
15
 
14
16
  ## Introduction
15
17
 
16
- wxRuby3 is a cross-platform GUI library for Ruby, based on the [wxWidgets](https://wxwidgets.org)
18
+ wxRuby3 is a cross-platform GUI library for Ruby, based on the mature [wxWidgets](https://wxwidgets.org)
17
19
  GUI toolkit for C++. It uses native widgets wherever possible, providing
18
20
  the correct look, feel and behaviour to GUI applications on Windows, OS
19
21
  X and Linux/GTK. wxRuby aims to provide a comprehensive solution to
20
22
  developing professional-standard desktop applications in Ruby.
21
23
 
24
+ ## Usage examples
25
+
26
+ ### Hello world
27
+
28
+ wxRuby3 is very easy to use.
29
+
30
+ ```ruby
31
+ require 'wx'
32
+
33
+ Wx::App.run do
34
+ Wx::Frame.new(nil, title: 'Hello world!').show
35
+ end
36
+ ```
37
+
38
+ ![Hello_World](assets/hello_world_combi.png "Hello World sample")
39
+
40
+ ### Hello Button
41
+
42
+ Anyone who is familiar with wxWidgets should feel right at home since the API may be Ruby-fied, it is still easily
43
+ recognizable (but being Ruby-fied allowing for elegant and compact coding). And for those that do not have previous
44
+ experience, do not fear, wxRuby3 comes with detailed [documentation](https://mcorino.github.io/wxRuby3/file.00_starting.html) and lots of examples and tests.
45
+
46
+ ```ruby
47
+ require 'wx'
48
+
49
+ class TheFrame < Wx::Frame
50
+ def initialize(title)
51
+ super(nil, title: title)
52
+ panel = Wx::Panel.new(self)
53
+ button = Wx::Button.new(panel, label: 'Click me')
54
+ button.evt_button(Wx::ID_ANY) { Wx.message_box('Hello. Thanks for clicking me!', 'Hello Button sample') }
55
+ end
56
+ end
57
+
58
+ Wx::App.run { TheFrame.new('Hello world!').show }
59
+ ```
60
+
61
+ ![Hello_Button_Clicked](assets/hello_button_clicked_combi.png "Hello Button sample clicked")
62
+
63
+
22
64
  ## wxRuby3 licence
23
65
 
24
66
  wxRuby3 is free and open-source. It is distributed under the liberal
@@ -54,14 +96,43 @@ of these products.
54
96
 
55
97
  Currently the following are fully supported:
56
98
 
57
- * Windows 10 (RubyInstaller MSYS2-DevKit) / Ruby >= 2.5 / wxWidgets >= 3.2
58
- * Linux (i686 + AMD-64) / Ruby >= 2.5 / wxWidgets >= 3.2
99
+ | Platform | Ruby version(s) | wxWidgets version(s) |
100
+ |----------------------------------------------------------------------------|-----------------| --- |
101
+ | Windows 10 (tested)<br>(most likely also Windows 11) | Ruby >= 2.5<br>(RubyInstaller MSYS2-DevKit) | wxWidgets >= 3.2 |
102
+ | Linux (tested; any AMD-64 distribution)<br>(most likely also i686 and ARM) | Ruby >= 2.5 | wxWidgets >= 3.2 |
103
+ | MacOS >= 10.10 using Cocoa (tested on AMD-64) | Ruby >= 2.5 | wxWidgets >= 3.2 |
59
104
 
60
105
  Support for other platforms is not being actively developed at present,
61
106
  but patches are welcome. It is likely to be much simpler to get wxRuby
62
107
  working on similar modern systems (eg FreeBSD or Solaris with GTK) than
63
108
  on legacy systems (eg Windows 98, Mac OS 9).
64
109
 
110
+ ### How can I install wxRuby3?
111
+
112
+ wxRuby3 is distributed as a Ruby gem on [RubyGems](https://rubygems.org).<br>
113
+ Apart from a regular source-only version of the gem there is also a binary gem version for Windows 10 provided (for the
114
+ latest stable Ruby version at the time of publishing) which includes an embedded wxWidgets installation (also latest
115
+ stable version).
116
+
117
+ Installing the binary gem version on Windows requires no additional software to be installed except for a supported
118
+ version of the Ruby interpreter.<br>
119
+ To install the source-only gem the following software is required:
120
+
121
+ | Sofware | Notes |
122
+ |-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
123
+ | Ruby | A supported version of the Ruby interpreter needs to be installed. |
124
+ | C++ compiler<br>(incl. dev tools like `make`) | On linux a recent version of the GNU C++ compiler (with c++-14 support) needs to be installed<br>On Windows the RubyInstaller MSYS2-Devkit needs to be installed<br>On MacOS XCode with commandline tools needs to be installed |
125
+ | Git version control toolkit | |
126
+ | SWIG >= 3.0.12 | On MacOS install [Homebrew](https://brew.sh/) and than `brew install swig` |
127
+ | Doxygen (>= 1.9.1, <= 1.9.6) | Doxygen > 1.9.6 has changes that cause problems with the wxWidgets doxygen files.<br>On MacOS: `brew tap mcorino/wxruby3` and than `brew install doxygen@1.9.6` (default brew recipe installs 1.9.7) |
128
+ | wxWidgets >= 3.2 (*OPTIONAL*) | On Linux most distributions provide system installable (development) packages for wxWidgets providing a supported version. Alternatively you can fairly easily install your own preferred version manually (see the [wxWidgets](https://wxwidgets.org) project for details).<br>On Windows and MacOS the process is less straightforward (also here see the [wxWidgets](https://wxwidgets.org) project for details).<br>The wxRuby3 source-only gem can also be installed using a private local wxWidgets installation or an embedded installation (most likely preferred on Windows and MacOS). See [INSTALL](INSTALL.md) for more details. |
129
+
130
+ In case the prerequisites above are met the (source-only or binary) gem can be installed executing the following command:
131
+
132
+ ```shell
133
+ gem install wxruby3
134
+ ```
135
+
65
136
  ### Where can I ask a question, or report a bug?
66
137
 
67
138
  Use GitHUb Issues.
@@ -109,7 +180,7 @@ which may be relevant.
109
180
 
110
181
  ### What wxWidgets features are supported by wxRuby3?
111
182
 
112
- wxRuby supports almost all of the wxWidgets 3.x GUI API, providing over
183
+ wxRuby supports almost all of the wxWidgets 3.2+ GUI API, providing over
113
184
  600 classes in total. wxWidgets classes that provide general and/or non-GUI
114
185
  programming support features, such as strings, networking, threading, database
115
186
  access and such are not and will never be ported, as it's assumed that
@@ -137,5 +208,9 @@ maintainable solution.
137
208
 
138
209
  ### I am getting an error trying to install or compile wxRuby3
139
210
 
140
- Please double-check the [INSTALL](INSTALL.md) documents, and search issue archives. If
211
+ Please double-check the instructions above and in the [INSTALL](INSTALL.md) document and search issue archives. If
141
212
  this doesn't help, please post your question using GitHub Issues.
213
+
214
+ ### Is there another, more declarative way, for writing wxRuby3 desktop GUI applications?
215
+
216
+ Yes. [Glimmer DSL for WX](https://github.com/AndyObtiva/glimmer-dsl-wx) enables software engineers to build GUI using wxruby3 following the Ruby way with the least amount of code possible. That is by offering a minimalistic declarative high-level DSL that maps visually to the way software engineers think about the GUI hierarchy in addition to adopting Rails' strategy of Convention over Configuration via smart defaults and automation of wxruby3 low-level details. You can check out the [Glimmer DSL for WX README "Coming From wxruby3" section](https://github.com/AndyObtiva/glimmer-dsl-wx#coming-from-wxruby3) for more information on how to translate wxruby3 apps to [Glimmer DSL for WX](https://github.com/AndyObtiva/glimmer-dsl-wx) syntax.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -57,6 +57,7 @@ WXRUBY_EXPORT bool GC_IsWindowDeleted(void *ptr);
57
57
  // Defined in wx.i; getting, setting and using swig_type <-> ruby class
58
58
  // mappings
59
59
  WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClass(VALUE cls);
60
+ WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClassName(const char* clsname);
60
61
  WXRUBY_EXPORT void wxRuby_SetSwigTypeForClass(VALUE cls, swig_type_info* ty);
61
62
 
62
63
  // Common wrapping functions
@@ -97,14 +97,11 @@ GC_NEVER(kls);
97
97
  %enddef
98
98
 
99
99
  // Strategy for objects whose pointer / id identity does not matter,
100
- // only their attributes: Size, Point and Rect. They are commonly
101
- // created as temporary objects on the stack in C++ and then passed into
100
+ // only their attributes and/or methods like DC (and derivatives) Size, Point and Rect. They are commonly
101
+ // created as temporary objects (mostly on the stack) in C++ and then passed into
102
102
  // director methods. Once the director method has run they should no
103
103
  // longer be referenced in ruby.
104
- %define GC_MANAGE_AS_FUNGIBLE_OBJECT(kls)
105
- %enddef
106
-
107
- %define GC_MANAGE_AS_TEMP(kls)
104
+ %define GC_MANAGE_AS_UNTRACKED(kls)
108
105
  %enddef
109
106
 
110
107
  // Sizers attached to windows are automatically destroyed by wxWidgets,
@@ -133,10 +130,9 @@ GC_NEVER(kls);
133
130
  %enddef
134
131
 
135
132
 
136
- // All other classes - mainly helper classes (eg Sizer, GridCellxxx) and
137
- // informational classes eg Point, Size, Rect. These are tracked but
138
- // sometimes later disowned once passed into a widget, and thenceforth
139
- // managed by WxWidgets
133
+ // All other classes - mainly helper classes (eg Sizer, GridCellxxx).
134
+ // These are tracked but sometimes later disowned once passed into a
135
+ // widget, and thenceforth managed by WxWidgets
140
136
  %define GC_MANAGE(kls)
141
137
  GC_MANAGE_AS_OBJECT(kls)
142
138
  %enddef
@@ -32,17 +32,24 @@ RbClassToSwigTypeHash Global_Type_Map;
32
32
 
33
33
  // Record swig_type_info for a wxRuby class; called in class
34
34
  // initialisation
35
- WXRUBY_EXPORT void wxRuby_SetSwigTypeForClass(VALUE cls, swig_type_info* ty) {
35
+ WXRUBY_EXPORT void wxRuby_SetSwigTypeForClass(VALUE cls, swig_type_info* ty)
36
+ {
36
37
  Global_Type_Map[cls] = ty;
37
38
  }
38
39
 
39
40
  // Retrieve swig_type_info for a ruby class - needed by functions which
40
41
  // wrap objects whose type is not known in advance - eg
41
42
  // Window#find_window_by_index (see Window.i)
42
- WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClass(VALUE cls) {
43
+ WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClass(VALUE cls)
44
+ {
43
45
  return Global_Type_Map[cls];
44
46
  }
45
47
 
48
+ WXRUBY_EXPORT swig_type_info* wxRuby_GetSwigTypeForClassName(const char* clsname)
49
+ {
50
+ return wxRuby_GetSwigTypeForClass(rb_const_get(wxRuby_Core(), rb_intern(clsname)));
51
+ }
52
+
46
53
  // Overriding standard SWIG tracking - SWIG's implementation is not
47
54
  // compatible with ruby 1.8.7 / 1.9.x as it can allocate BigNum objects
48
55
  // during GC , which is an error. So instead we provide a C++ ptr->Ruby
@@ -52,7 +59,8 @@ WX_DECLARE_VOIDPTR_HASH_MAP(VALUE,
52
59
  PtrToRbObjHash Global_Ptr_Map;
53
60
 
54
61
  // Add a tracking from ptr -> object
55
- WXRUBY_EXPORT void wxRuby_AddTracking(void* ptr, VALUE object) {
62
+ WXRUBY_EXPORT void wxRuby_AddTracking(void* ptr, VALUE object)
63
+ {
56
64
  #ifdef __WXRB_DEBUG__
57
65
  if (wxRuby_TraceLevel()>1)
58
66
  {
@@ -68,7 +76,8 @@ WXRUBY_EXPORT void wxRuby_AddTracking(void* ptr, VALUE object) {
68
76
  }
69
77
 
70
78
  // Return the ruby object for ptr
71
- WXRUBY_EXPORT VALUE wxRuby_FindTracking(void* ptr) {
79
+ WXRUBY_EXPORT VALUE wxRuby_FindTracking(void* ptr)
80
+ {
72
81
  if ( Global_Ptr_Map.count(ptr) == 0 )
73
82
  return Qnil;
74
83
  else
@@ -76,7 +85,8 @@ WXRUBY_EXPORT VALUE wxRuby_FindTracking(void* ptr) {
76
85
  }
77
86
 
78
87
  // Remove the tracking for ptr
79
- WXRUBY_EXPORT void wxRuby_RemoveTracking(void* ptr) {
88
+ WXRUBY_EXPORT void wxRuby_RemoveTracking(void* ptr)
89
+ {
80
90
  #ifdef __WXRB_DEBUG__
81
91
  if (wxRuby_TraceLevel()>1)
82
92
  std::wcout << "< wxRuby_RemoveTracking(" << ptr << ")" << std::endl;
@@ -85,7 +95,8 @@ WXRUBY_EXPORT void wxRuby_RemoveTracking(void* ptr) {
85
95
  }
86
96
 
87
97
  // Iterate over all the trackings, calling the passed-in method on each
88
- WXRUBY_EXPORT void wxRuby_IterateTracking( void(*meth)(void* ptr, VALUE obj) ) {
98
+ WXRUBY_EXPORT void wxRuby_IterateTracking( void(*meth)(void* ptr, VALUE obj) )
99
+ {
89
100
  PtrToRbObjHash::iterator it;
90
101
  for( it = Global_Ptr_Map.begin(); it != Global_Ptr_Map.end(); ++it )
91
102
  {
@@ -54,7 +54,7 @@ module Wx
54
54
  private :search_paths
55
55
 
56
56
  def add_search_path(*paths)
57
- paths.flatten.each { |p| paths << s.to_s unless paths.include?(s.to_s) }
57
+ paths.flatten.each { |p| search_paths << p.to_s unless search_paths.include?(p.to_s) }
58
58
  end
59
59
  alias :add_search_paths :add_search_path
60
60
 
@@ -74,7 +74,7 @@ module Wx
74
74
 
75
75
  def find_art(art_name, art_type: nil, art_path: nil, art_section: nil, bmp_type: nil)
76
76
  unless art_path
77
- caller_path = caller_locations(1).first.absolute_path
77
+ caller_path = caller_locations(1).first.absolute_path || caller_locations(1).first.path
78
78
  art_path = File.dirname(caller_path)
79
79
  art_section ||= File.basename(caller_path, '.*')
80
80
  end
@@ -7,7 +7,7 @@ class Wx::ArtProvider
7
7
  wx_push_back = instance_method(:push_back)
8
8
  define_method(:push_back) do | art_prov |
9
9
  wx_push_back.bind(self).call(art_prov)
10
- @__art_provs.unshift(art_prov)
10
+ @__art_provs.push(art_prov)
11
11
  end
12
12
 
13
13
  wx_pop = instance_method(:pop)
@@ -19,7 +19,7 @@ class Wx::ArtProvider
19
19
  wx_push = instance_method(:push)
20
20
  define_method(:push) do | art_prov |
21
21
  wx_push.bind(self).call(art_prov)
22
- @__art_provs.push(art_prov)
22
+ @__art_provs.unshift(art_prov)
23
23
  end
24
24
 
25
25
  wx_delete = instance_method(:delete)
@@ -86,15 +86,16 @@ module Wx
86
86
  # Accepts a block, which will be passed a device context which can be
87
87
  # used to draw upon the Bitmap
88
88
  def draw
89
- dc = Wx::MemoryDC.new
90
- dc.select_object(self)
91
- yield dc
92
- dc.select_object( Wx::NULL_BITMAP )
89
+ return unless block_given?
90
+ Wx::MemoryDC.draw_on(self) do |dc|
91
+ dc.select_object(self)
92
+ yield dc
93
+ end
93
94
  end
94
95
  end
95
96
 
96
97
  def self.Bitmap(name, bmp_type = nil)
97
- art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path)
98
+ art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path || caller_locations(1).first.path)
98
99
  art_owner = File.basename(caller_path, '.*')
99
100
  art_file = ArtLocator.find_art(name, art_type: :bitmap, art_path: art_path, art_section: art_owner, bmp_type: bmp_type)
100
101
  ::Kernel.raise ArgumentError, "Cannot locate art file for #{name}:Bitmap" unless art_file
@@ -0,0 +1,34 @@
1
+
2
+ module Wx
3
+
4
+ class BitmapCombobox < Wx::ComboBox
5
+
6
+ # We need to cache client data in Ruby variables as we cannot access items
7
+ # during the GC mark phase as for some platforms (WXMSW at least) that would
8
+ # involve calling methods that would break in that phase.
9
+
10
+ wx_append = instance_method :append
11
+ define_method :append do |item, bitmap=Wx::NULL_BITMAP, data=nil|
12
+ itm_pos = if data
13
+ wx_append.bind(self).call(item, bitmap, data)
14
+ else
15
+ wx_append.bind(self).call(item, bitmap)
16
+ end
17
+ client_data_store.insert(itm_pos, data)
18
+ itm_pos
19
+ end
20
+
21
+ wx_insert = instance_method :insert
22
+ define_method :insert do |item, bitmap, pos, data=nil|
23
+ itm_pos = if data
24
+ wx_insert.bind(self).call(item, bitmap, pos, data)
25
+ else
26
+ wx_insert.bind(self).call(item, bitmap, pos)
27
+ end
28
+ client_data_store.insert(itm_pos, data)
29
+ itm_pos
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,6 @@
1
+
2
+ module Wx
3
+
4
+ TheBrushList = Wx::Brush
5
+
6
+ end
@@ -32,6 +32,7 @@ class Wx::ControlWithItems
32
32
 
33
33
  wx_append = instance_method :append
34
34
  define_method :append do |item, data=nil|
35
+ itm_pos = -1
35
36
  if data
36
37
  if ::Array === item
37
38
  if !(::Array === data)
@@ -39,21 +40,42 @@ class Wx::ControlWithItems
39
40
  elsif data.size != item.size
40
41
  ::Kernel.raise ::ArgumentError.new("item and data array must be equal size")
41
42
  end
42
- offs = get_count
43
- wx_append.bind(self).call(item)
44
- item.size.times { |ix| set_client_data(offs+ix, data[ix]) }
43
+ if sorted?
44
+ item.each_with_index do |itm, ix|
45
+ itm_pos = wx_append.bind(self).call(itm, data[ix])
46
+ client_data_store.insert(itm_pos, data[ix])
47
+ end
48
+ else
49
+ offs = get_count
50
+ itm_pos = wx_append.bind(self).call(item)
51
+ item.size.times { |ix| set_client_data(offs+ix, data[ix]) }
52
+ end
45
53
  else
46
- wx_append.bind(self).call(item, data)
47
- client_data_store[get_count-1] = data
54
+ itm_pos = wx_append.bind(self).call(item, data)
55
+ client_data_store.insert(itm_pos, data)
48
56
  end
49
57
  else
50
- wx_append.bind(self).call(item)
51
- # no changes to data store
58
+ if ::Array === item
59
+ if sorted?
60
+ item.each_with_index do |itm, ix|
61
+ itm_pos = wx_append.bind(self).call(itm, data[ix])
62
+ client_data_store.insert(itm_pos, nil)
63
+ end
64
+ else
65
+ itm_pos = wx_append.bind(self).call(item)
66
+ client_data_store.concat(::Array.new(item.size))
67
+ end
68
+ else
69
+ itm_pos = wx_append.bind(self).call(item)
70
+ client_data_store.insert(itm_pos, nil)
71
+ end
52
72
  end
73
+ itm_pos
53
74
  end
54
75
 
55
76
  wx_insert = instance_method :insert
56
77
  define_method :insert do |item, pos, data=nil|
78
+ itm_pos = -1
57
79
  if data
58
80
  if ::Array === item
59
81
  if !(::Array === data)
@@ -61,21 +83,37 @@ class Wx::ControlWithItems
61
83
  elsif data.size != item.size
62
84
  ::Kernel.raise ::ArgumentError.new("item and data array must be equal size")
63
85
  end
64
- wx_insert.bind(self).call(item, pos)
65
- client_data_store.insert(pos, *::Array.new(item.size))
66
- item.size.times { |ix| set_client_data(pos+ix, data[ix]) }
86
+ if sorted?
87
+ item.each_with_index do |itm, ix|
88
+ itm_pos = wx_insert.bind(self).call(itm, data[ix])
89
+ client_data_store.insert(itm_pos, data[ix])
90
+ end
91
+ else
92
+ itm_pos = wx_insert.bind(self).call(item, pos)
93
+ client_data_store.insert(pos, *::Array.new(item.size))
94
+ item.size.times { |ix| set_client_data(pos+ix, data[ix]) }
95
+ end
67
96
  else
68
- wx_insert.bind(self).call(item, pos, data)
69
- client_data_store.insert(pos, data)
97
+ itm_pos = wx_insert.bind(self).call(item, pos, data)
98
+ client_data_store.insert(itm_pos, data)
70
99
  end
71
100
  else
72
- wx_insert.bind(self).call(item, pos)
73
101
  if ::Array === item
74
- client_data_store.insert(pos, *::Array.new(item.size))
102
+ if sorted?
103
+ item.each_with_index do |itm, ix|
104
+ itm_pos = wx_insert.bind(self).call(itm)
105
+ client_data_store.insert(itm_pos, nil)
106
+ end
107
+ else
108
+ itm_pos = wx_insert.bind(self).call(item, pos)
109
+ client_data_store.insert(pos, *::Array.new(item.size))
110
+ end
75
111
  else
112
+ itm_pos = wx_insert.bind(self).call(item, pos)
76
113
  client_data_store.insert(pos, nil)
77
114
  end
78
115
  end
116
+ itm_pos
79
117
  end
80
118
 
81
119
  wx_set = instance_method :set
@@ -2,7 +2,7 @@
2
2
  module Wx
3
3
 
4
4
  def self.Cursor(name, bmp_type = nil, *rest)
5
- art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path)
5
+ art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path || caller_locations(1).first.path)
6
6
  art_owner = File.basename(caller_path, '.*')
7
7
  art_file = ArtLocator.find_art(name, art_type: :icon, art_path: art_path, art_section: art_owner, bmp_type: bmp_type)
8
8
  ::Kernel.raise ArgumentError, "Cannot locate art file for #{name}:Cursor" unless art_file