wxruby3 0.9.0.pre.beta.13 → 0.9.0.pre.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/README.md +47 -4
  4. data/assets/hello_button.png +0 -0
  5. data/assets/hello_button_clicked.png +0 -0
  6. data/assets/hello_world.png +0 -0
  7. data/assets/repo-social-preview.png +0 -0
  8. data/ext/wxruby3/include/wxruby-runtime.h +1 -0
  9. data/ext/wxruby3/swig/memory_management.i +6 -10
  10. data/ext/wxruby3/swig/wx.i +17 -6
  11. data/lib/wx/accessors.rb +8 -2
  12. data/lib/wx/core/art_locator.rb +2 -2
  13. data/lib/wx/core/artprovider.rb +2 -2
  14. data/lib/wx/core/bitmap.rb +6 -5
  15. data/lib/wx/core/bitmap_combobox.rb +34 -0
  16. data/lib/wx/core/controlwithitems.rb +52 -14
  17. data/lib/wx/core/cursor.rb +1 -1
  18. data/lib/wx/core/dc.rb +0 -20
  19. data/lib/wx/core/event_blocker.rb +14 -0
  20. data/lib/wx/core/evthandler.rb +36 -0
  21. data/lib/wx/core/find_replace_dialog.rb +24 -0
  22. data/lib/wx/core/icon.rb +1 -1
  23. data/lib/wx/core/image.rb +1 -1
  24. data/lib/wx/core/paintdc.rb +8 -0
  25. data/lib/wx/core/text_entry.rb +15 -0
  26. data/lib/wx/core/v_list_box.rb +13 -0
  27. data/lib/wx/core/window.rb +1 -1
  28. data/lib/wx/doc/busy_info.rb +21 -0
  29. data/lib/wx/doc/client_dc.rb +28 -0
  30. data/lib/wx/doc/controlwithitems.rb +11 -0
  31. data/lib/wx/doc/dc.rb +0 -14
  32. data/lib/wx/doc/event_blocker.rb +27 -0
  33. data/lib/wx/doc/evthandler.rb +4 -0
  34. data/lib/wx/doc/extra/02_lifecycles.md +49 -0
  35. data/lib/wx/doc/extra/10_art.md +1 -1
  36. data/lib/wx/doc/extra/11_drawing_and_dc.md +62 -0
  37. data/lib/wx/doc/memory_dc.rb +75 -0
  38. data/lib/wx/doc/mirror_dc.rb +16 -0
  39. data/lib/wx/doc/prt/printer_dc.rb +26 -0
  40. data/lib/wx/doc/screen_dc.rb +10 -6
  41. data/lib/wx/doc/svg_file_dc.rb +20 -0
  42. data/lib/wx/doc/v_list_box.rb +9 -0
  43. data/lib/wx/doc/window_disabler.rb +10 -0
  44. data/lib/wx/global_const.rb +24 -18
  45. data/lib/wx/html/keyword_defs.rb +6 -7
  46. data/lib/wx/html/require.rb +1 -0
  47. data/lib/wx/html/simple_html_listbox.rb +105 -0
  48. data/lib/wx/keyword_defs.rb +7 -0
  49. data/lib/wx/version.rb +1 -1
  50. data/lib/wx/wxruby/cmd/test.rb +1 -1
  51. data/rakelib/install.rb +3 -1
  52. data/rakelib/lib/core/mapping.rb +5 -5
  53. data/rakelib/lib/core/spec.rb +7 -3
  54. data/rakelib/lib/core/spec_helper.rb +9 -1
  55. data/rakelib/lib/director/accelerator.rb +1 -1
  56. data/rakelib/lib/director/app.rb +25 -3
  57. data/rakelib/lib/director/art_provider.rb +5 -1
  58. data/rakelib/lib/director/aui_pane_info.rb +1 -1
  59. data/rakelib/lib/director/aui_tab_ctrl.rb +1 -1
  60. data/rakelib/lib/director/bitmap.rb +2 -1
  61. data/rakelib/lib/director/bitmap_combobox.rb +32 -0
  62. data/rakelib/lib/director/brush.rb +1 -0
  63. data/rakelib/lib/director/busy_info.rb +1 -1
  64. data/rakelib/lib/director/choice.rb +1 -0
  65. data/rakelib/lib/director/clipboard.rb +1 -1
  66. data/rakelib/lib/director/colour.rb +1 -0
  67. data/rakelib/lib/director/colour_picker_ctrl.rb +1 -1
  68. data/rakelib/lib/director/combobox.rb +1 -2
  69. data/rakelib/lib/director/ctrl_with_items.rb +3 -0
  70. data/rakelib/lib/director/cursor.rb +1 -0
  71. data/rakelib/lib/director/data_object.rb +5 -7
  72. data/rakelib/lib/director/dc.rb +5 -1
  73. data/rakelib/lib/director/defs.rb +3 -0
  74. data/rakelib/lib/director/derived_dc.rb +278 -27
  75. data/rakelib/lib/director/dialog.rb +4 -1
  76. data/rakelib/lib/director/dir_picker_ctrl.rb +1 -1
  77. data/rakelib/lib/director/event.rb +3 -3
  78. data/rakelib/lib/director/event_blocker.rb +41 -0
  79. data/rakelib/lib/director/event_filter.rb +20 -0
  80. data/rakelib/lib/director/event_handler.rb +29 -2
  81. data/rakelib/lib/director/file_picker_ctrl.rb +1 -1
  82. data/rakelib/lib/director/find_replace_data.rb +1 -0
  83. data/rakelib/lib/director/font.rb +2 -1
  84. data/rakelib/lib/director/font_data.rb +1 -0
  85. data/rakelib/lib/director/font_picker_ctrl.rb +1 -1
  86. data/rakelib/lib/director/gdi_object.rb +1 -0
  87. data/rakelib/lib/director/graphics_context.rb +6 -6
  88. data/rakelib/lib/director/grid_table_message.rb +1 -1
  89. data/rakelib/lib/director/html_cell.rb +1 -1
  90. data/rakelib/lib/director/html_data_object.rb +5 -7
  91. data/rakelib/lib/director/html_listbox.rb +65 -1
  92. data/rakelib/lib/director/icon.rb +2 -0
  93. data/rakelib/lib/director/listbox.rb +1 -0
  94. data/rakelib/lib/director/locale.rb +2 -1
  95. data/rakelib/lib/director/palette.rb +1 -0
  96. data/rakelib/lib/director/pen.rb +2 -1
  97. data/rakelib/lib/director/pgproperties.rb +1 -1
  98. data/rakelib/lib/director/pgproperty.rb +1 -1
  99. data/rakelib/lib/director/pgvalidation_info.rb +1 -1
  100. data/rakelib/lib/director/platform_info.rb +1 -1
  101. data/rakelib/lib/director/print_data.rb +1 -1
  102. data/rakelib/lib/director/property_grid_interface.rb +1 -1
  103. data/rakelib/lib/director/property_grid_page_state.rb +1 -1
  104. data/rakelib/lib/director/region.rb +1 -0
  105. data/rakelib/lib/director/ribbon_art_provider.rb +1 -1
  106. data/rakelib/lib/director/richtext_buffer_data_object.rb +5 -7
  107. data/rakelib/lib/director/richtext_header_footer_data.rb +1 -1
  108. data/rakelib/lib/director/searchctrl.rb +24 -0
  109. data/rakelib/lib/director/sizer.rb +2 -2
  110. data/rakelib/lib/director/styled_text_ctrl.rb +2 -0
  111. data/rakelib/lib/director/text_entry.rb +2 -2
  112. data/rakelib/lib/director/tree_ctrl.rb +6 -3
  113. data/rakelib/lib/director/uiaction_simulator.rb +20 -0
  114. data/rakelib/lib/director/variant.rb +1 -1
  115. data/rakelib/lib/director/vlistbox.rb +25 -0
  116. data/rakelib/lib/director/window.rb +0 -6
  117. data/rakelib/lib/director/with_images.rb +1 -1
  118. data/rakelib/lib/director/xml_node.rb +1 -1
  119. data/rakelib/lib/extractor/function.rb +5 -3
  120. data/rakelib/lib/generate/doc/about_dialog_info.yaml +46 -0
  121. data/rakelib/lib/generate/doc/accelerator.yaml +21 -0
  122. data/rakelib/lib/generate/doc/art_provider.yaml +35 -0
  123. data/rakelib/lib/generate/doc/bitmap.yaml +37 -0
  124. data/rakelib/lib/generate/doc/box_sizer.yaml +15 -0
  125. data/rakelib/lib/generate/doc/busy_info.yaml +74 -0
  126. data/rakelib/lib/generate/doc/client_dc.yaml +19 -0
  127. data/rakelib/lib/generate/doc/clipboard.yaml +43 -0
  128. data/rakelib/lib/generate/doc/collapsible_pane.yaml +21 -0
  129. data/rakelib/lib/generate/doc/colour_dialog.yaml +32 -0
  130. data/rakelib/lib/generate/doc/control.yaml +46 -0
  131. data/rakelib/lib/generate/doc/cursor.yaml +40 -0
  132. data/rakelib/lib/generate/doc/data_object.yaml +55 -0
  133. data/rakelib/lib/generate/doc/dc.yaml +14 -0
  134. data/rakelib/lib/generate/doc/dialog.yaml +36 -0
  135. data/rakelib/lib/generate/doc/dir_dialog.yaml +25 -0
  136. data/rakelib/lib/generate/doc/events.yaml +152 -0
  137. data/rakelib/lib/generate/doc/evt_handler.yaml +63 -0
  138. data/rakelib/lib/generate/doc.rb +77 -14
  139. data/rakelib/lib/generate/interface.rb +11 -0
  140. data/rakelib/lib/specs/interfaces.rb +5 -4
  141. data/rakelib/lib/swig_runner.rb +3 -3
  142. data/rakelib/lib/typemap/common.rb +15 -3
  143. data/rakelib/lib/util/string.rb +1 -0
  144. data/rakelib/yard/yard/relative_markdown_links.rb +5 -1
  145. data/samples/bigdemo/wxArtProvider.rbw +5 -4
  146. data/samples/controls/controls.rb +2 -2
  147. data/samples/controls/htlbox.rb +411 -0
  148. data/samples/controls/tn_htlbox.png +0 -0
  149. data/samples/drawing/graphics_drawing.rb +1 -2
  150. data/samples/drawing/{svgtest.rb → image_prt.rb} +49 -18
  151. data/samples/drawing/tn_image_prt.png +0 -0
  152. data/samples/propgrid/propgrid.rb +23 -21
  153. data/samples/ribbon/ribbon.rb +47 -46
  154. data/tests/lib/wxapp_runner.rb +3 -3
  155. data/tests/lib/wxframe_runner.rb +59 -0
  156. data/tests/test_app_event_filter.rb +74 -0
  157. data/tests/test_art_provider.rb +52 -0
  158. data/tests/test_clipboard.rb +2 -1
  159. data/tests/test_event_handling.rb +199 -16
  160. data/tests/test_events.rb +4 -11
  161. data/tests/test_gdi_object.rb +161 -0
  162. data/tests/test_intl.rb +11 -14
  163. data/tests/test_item_data.rb +33 -1
  164. data/tests/test_std_controls.rb +147 -0
  165. metadata +56 -4
  166. data/samples/drawing/tn_svgtest.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 645bdec8f3a721e4e68f128f2cacb72c9b7914e75a53deacec175eccda97383e
4
- data.tar.gz: 593fd0f67994779741e55272bb3d72c8c3111f87f8f0138ff5dcd545908deb52
3
+ metadata.gz: a325622c35b3b6321d220fe21ef12c341dc640487529e05ae5cc3775b0685c50
4
+ data.tar.gz: af2bfd3115f68d2ac2485dad07ede48f45cba4e64fbbfae19d3756dc3c6e9176
5
5
  SHA512:
6
- metadata.gz: 62ae88eea950c8e3914d35095e8d18d8ff0bb6f33a6ae6dbd8dca292a6ff9f09329da82803425461f00942495ec4401faf20a1f69fc12e1c8636c2a2320590b7
7
- data.tar.gz: feee980c9c1d19d5942e70871a1541d5518b1bd175ccfc7ea93e8edc93760a8962b156aa8cc7ef8bdbbb32741504e35d90124770c8a6e11a7f2817fb16ba7792
6
+ metadata.gz: 8dcc66a0505ea81a55aa8f22b2692ac83c4c055252691ec1122dc8ee11b7119bad00a6bd79cdb8e4cbab7d03f33912818b3c1a6b77f6c7dcddec5b5bd99d62a1
7
+ data.tar.gz: 9894a71c94deaef52479339f540cbdff8a02c301bc80c927bd96590c1366d893690eebd7d526ee09d90abe568dcec289233ffc717b4cad123c47e597f44c534b
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/README.md CHANGED
@@ -13,12 +13,53 @@ Reviving wxRuby
13
13
 
14
14
  ## Introduction
15
15
 
16
- wxRuby3 is a cross-platform GUI library for Ruby, based on the [wxWidgets](https://wxwidgets.org)
16
+ wxRuby3 is a cross-platform GUI library for Ruby, based on the mature [wxWidgets](https://wxwidgets.org)
17
17
  GUI toolkit for C++. It uses native widgets wherever possible, providing
18
18
  the correct look, feel and behaviour to GUI applications on Windows, OS
19
19
  X and Linux/GTK. wxRuby aims to provide a comprehensive solution to
20
20
  developing professional-standard desktop applications in Ruby.
21
21
 
22
+ ## Usage examples
23
+
24
+ ### Hello world
25
+
26
+ wxRuby3 is very easy to use.
27
+
28
+ ```ruby
29
+ require 'wx'
30
+
31
+ Wx::App.run do
32
+ Wx::Frame.new(nil, title: 'Hello world!').show
33
+ end
34
+ ```
35
+
36
+ ![Hello_World](assets/hello_world.png "Hello World sample")
37
+
38
+ ### Hello Button
39
+
40
+ Anyone who is familiar with wxWidgets should feel right at home since the API may be Ruby-fied, it is still easily
41
+ recognizable (but being Ruby-fied allowing for elegant and compact coding). And for those that do not have previous
42
+ experience do not fear, wxRuby3 comes with detailed [documentation](https://mcorino.github.io/wxRuby3/file.00_starting.html) and lots of examples and test.
43
+
44
+ ```ruby
45
+ require 'wx'
46
+
47
+ class TheFrame < Wx::Frame
48
+ def initialize(title)
49
+ super(nil, title: title)
50
+ panel = Wx::Panel.new(self)
51
+ button = Wx::Button.new(panel, label: 'Click me')
52
+ button.evt_button(Wx::ID_ANY) { Wx.message_box('Hello. Thanks for clicking me!', 'Hello Button sample') }
53
+ end
54
+ end
55
+
56
+ Wx::App.run { TheFrame.new('Hello world!').show }
57
+ ```
58
+
59
+ ![Hello_Button](assets/hello_button.png "Hello Button sample")
60
+ ![Hello_Button_Clicked](assets/hello_button_clicked.png "Hello Button sample clicked")
61
+
62
+
22
63
  ## wxRuby3 licence
23
64
 
24
65
  wxRuby3 is free and open-source. It is distributed under the liberal
@@ -54,8 +95,10 @@ of these products.
54
95
 
55
96
  Currently the following are fully supported:
56
97
 
57
- * Windows 10 (RubyInstaller MSYS2-DevKit) / Ruby >= 2.5 / wxWidgets >= 3.2
58
- * Linux (i686 + AMD-64) / Ruby >= 2.5 / wxWidgets >= 3.2
98
+ | Platform | Ruby version(s) | wxWidgets version(s) |
99
+ |----------------------------------------------------------------------------|-----------------| --- |
100
+ | Windows 10 (tested)<br>(most likely also Windows 11) | Ruby >= 2.5<br>(RubyInstaller MSYS2-DevKit) | wxWidgets >= 3.2 |
101
+ | Linux (tested; any AMD-64 distribution)<br>(most likely also i686 and ARM) | Ruby >= 2.5 | wxWidgets >= 3.2 |
59
102
 
60
103
  Support for other platforms is not being actively developed at present,
61
104
  but patches are welcome. It is likely to be much simpler to get wxRuby
@@ -109,7 +152,7 @@ which may be relevant.
109
152
 
110
153
  ### What wxWidgets features are supported by wxRuby3?
111
154
 
112
- wxRuby supports almost all of the wxWidgets 3.x GUI API, providing over
155
+ wxRuby supports almost all of the wxWidgets 3.2+ GUI API, providing over
113
156
  600 classes in total. wxWidgets classes that provide general and/or non-GUI
114
157
  programming support features, such as strings, networking, threading, database
115
158
  access and such are not and will never be ported, as it's assumed that
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
  {
data/lib/wx/accessors.rb CHANGED
@@ -56,8 +56,14 @@ module WxRubyStyleAccessors
56
56
 
57
57
  def self.included(mod)
58
58
  mod.extend WxRubyStyleAccessors
59
- mod.constants.collect { | c | mod.const_get(c) }.grep(Module).each do |mod|
60
- mod.include WxRubyStyleAccessors if mod.name.start_with?('Wx::') # only setup Wx namespace
59
+ org_verbose = $VERBOSE
60
+ begin
61
+ $VERBOSE = nil
62
+ mod.constants.collect { | c | mod.const_get(c) }.grep(Module).each do |mod|
63
+ mod.include WxRubyStyleAccessors if mod.name.start_with?('Wx::') # only setup Wx namespace
64
+ end
65
+ ensure
66
+ $VERBOSE = org_verbose
61
67
  end
62
68
  end
63
69
  end
@@ -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
@@ -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
data/lib/wx/core/dc.rb CHANGED
@@ -69,24 +69,4 @@ module Wx
69
69
 
70
70
  end
71
71
 
72
- class MemoryDC
73
-
74
- # convenience method for drawing on a temporary memory DC
75
- def self.draw_on(arg)
76
- dc = case arg
77
- when Wx::Bitmap, Wx::DC
78
- self.new(arg)
79
- else
80
- ::Kernel.raise ArgumentError, 'Expected Wx::Bitmap or Wx::DC'
81
- end
82
- begin
83
- yield(dc) if block_given?
84
- ensure
85
- dc.select_object(Wx::NULL_BITMAP)
86
- end
87
- nil
88
- end
89
-
90
- end
91
-
92
72
  end
@@ -0,0 +1,14 @@
1
+
2
+ module Wx
3
+
4
+ class EventBlocker
5
+
6
+ class << self
7
+
8
+ alias :block_for :blocked_for
9
+
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -17,9 +17,45 @@ class Wx::EvtHandler
17
17
 
18
18
  # Fast look-up hash to map event type ids to ruby event classes
19
19
  EVENT_TYPE_CLASS_MAP = {}
20
+ private_constant :EVENT_TYPE_CLASS_MAP
20
21
  # Hash to look up EVT constants from symbol names of evt handler
21
22
  # methods; used internally by disconnect (see EvtHandler.i)
22
23
  EVENT_NAME_TYPE_MAP = {}
24
+ private_constant :EVENT_NAME_TYPE_MAP
25
+
26
+ class << self
27
+
28
+ def get_event_type_class_map
29
+ EVENT_TYPE_CLASS_MAP
30
+ end
31
+ private :get_event_type_class_map
32
+
33
+ # Add caching for added event filters as we need to keep these alive
34
+ # for as long as they are registered
35
+
36
+ def event_filters
37
+ @event_filters ||= []
38
+ end
39
+ private :event_filters
40
+
41
+ wx_add_filter = instance_method :add_filter
42
+ define_method :add_filter do |filter|
43
+ wx_add_filter.bind(self).call(filter)
44
+ event_filters << filter
45
+ end
46
+
47
+ wx_remove_filter = instance_method :remove_filter
48
+ define_method :remove_filter do |filter|
49
+ wx_remove_filter.bind(self).call(filter)
50
+ event_filters.delete(filter)
51
+ end
52
+
53
+ def clear_filters
54
+ event_filters.each { |f| remove_filter(f) }
55
+ event_filters.clear
56
+ end
57
+
58
+ end
23
59
 
24
60
  # Given a Wx EventType id (eg Wx::EVT_MENU), returns a WxRuby Event
25
61
  # class which should be passed to event handler blocks. The actual
@@ -0,0 +1,24 @@
1
+
2
+ module Wx
3
+
4
+ class FindReplaceDialog < Wx::Dialog
5
+
6
+ # add caching for FindReplaceData object
7
+ # dialog does not take over ownership but does allow referencing
8
+ # the data object so we need to keep it alive here
9
+
10
+ wx_initialize = instance_method :initialize
11
+ define_method :initialize do |parent, data, *args|
12
+ wx_initialize.bind(self).call(parent, data, *args)
13
+ @fr_data = data
14
+ end
15
+
16
+ wx_set_data = instance_method :set_data
17
+ define_method :set_data do |data|
18
+ wx_set_data.bind(self).call(data)
19
+ @fr_data = data
20
+ end
21
+
22
+ end
23
+
24
+ end
data/lib/wx/core/icon.rb CHANGED
@@ -51,7 +51,7 @@ module Wx
51
51
  end
52
52
 
53
53
  def self.Icon(name, bmp_type = nil, *rest)
54
- art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path)
54
+ art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path || caller_locations(1).first.path)
55
55
  art_owner = File.basename(caller_path, '.*')
56
56
  art_file = ArtLocator.find_art(name, art_type: :icon, art_path: art_path, art_section: art_owner, bmp_type: bmp_type)
57
57
  ::Kernel.raise ArgumentError, "Cannot locate art file for #{name}:Icon" unless art_file
data/lib/wx/core/image.rb CHANGED
@@ -69,7 +69,7 @@ module Wx
69
69
  end
70
70
 
71
71
  def self.Image(name, bmp_type = nil, *rest)
72
- art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path)
72
+ art_path = File.dirname(caller_path = caller_locations(1).first.absolute_path || caller_locations(1).first.path)
73
73
  art_owner = File.basename(caller_path, '.*')
74
74
  art_file = ArtLocator.find_art(name, art_type: :image, art_path: art_path, art_section: art_owner, bmp_type: bmp_type)
75
75
  ::Kernel.raise ArgumentError, "Cannot locate art file for #{name}:Image" unless art_file
@@ -0,0 +1,8 @@
1
+
2
+ class Wx::PaintDC
3
+
4
+ def self.draw_on(win, &block)
5
+ win.paint(&block) if block
6
+ end
7
+
8
+ end
@@ -0,0 +1,15 @@
1
+
2
+ module Wx
3
+
4
+ module TextEntry
5
+
6
+ wx_auto_complete = instance_method :auto_complete
7
+ define_method :auto_complete do |completer|
8
+ if wx_auto_complete.bind(self).call(completer)
9
+ @completer = completer # keep the Ruby object alive
10
+ end
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,13 @@
1
+
2
+ class Wx::VListBox
3
+
4
+ wx_each_selected = instance_method :each_selected
5
+ define_method :each_selected do |&block|
6
+ if block
7
+ wx_each_selected.bind(self).call(&block)
8
+ else
9
+ ::Enumerator.new { |y| wx_each_selected.bind(self).call { |sel| y << sel } }
10
+ end
11
+ end
12
+
13
+ end
@@ -49,7 +49,7 @@ class Wx::Window
49
49
  # This modified version of evt_paint sets a variable indicating that a
50
50
  # paint event is being handled just before running the event
51
51
  # handler. This ensures that any call to Window#paint within the
52
- # handler will supply a Wx::PaintDC (see swig/Window.i).
52
+ # handler will supply a Wx::PaintDC (see Window SWIG director).
53
53
  def evt_paint(meth = nil, &block)
54
54
  paint_proc = acquire_handler(meth, block)
55
55
  wrapped_block = proc do | event |
@@ -0,0 +1,21 @@
1
+
2
+ module Wx
3
+
4
+ class BusyInfo
5
+
6
+ # @overload busy(message, parent=nil)
7
+ # Shows busy info window with message, blocks event handling and calls the given block
8
+ # passing the BusyInfo instance as argument.
9
+ # @param [String] message
10
+ # @param [Wx::Window,nil] parent
11
+ # @yieldparam [Wx::BusyInfo] bi BusyInfo instance
12
+ # @overload busy(busy_info)
13
+ # Shows busy info window according to busy_info settings, blocks event handling and calls the given block
14
+ # passing the BusyInfo instance as argument.
15
+ # @param [Wx::BusyInfoFlags] busy_info
16
+ # @yieldparam [Wx::BusyInfo] bi BusyInfo instance
17
+ def self.busy(*args) end
18
+
19
+ end
20
+
21
+ end