wxruby3 0.9.4 → 0.9.5

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.
@@ -0,0 +1,135 @@
1
+ ---
2
+ :wxComboCtrl:
3
+ :detail:
4
+ :pre:
5
+ :programlisting:
6
+ - :pattern: !ruby/regexp /wxDECLARE_EVENT_TABLE/
7
+ :replace: |
8
+
9
+ ```ruby
10
+ class ListViewComboPopup < Wx::ListView
11
+
12
+ include Wx::ComboPopup
13
+
14
+ # Allow only default ctor
15
+ def initialize
16
+ # call default control ctor; need to call Wx::ListView#create later
17
+ super
18
+ end
19
+
20
+ # Initialize member variables
21
+ def init
22
+ @value = -1
23
+ end
24
+
25
+ # Create popup control
26
+ def create(parent)
27
+ # need to finish creating the list view here
28
+ # as calling super here would just call Wx::ComboPopup#create and not Wx::ListView#create
29
+ # we need to use Ruby magic
30
+ wx_lv_create = (Wx::ListView.instance_method :create).bind(self)
31
+ wx_lv_create.call(parent, 1, [0,0], Wx::DEFAULT_SIZE)
32
+ evt_motion :on_mouse_move
33
+ evt_left_up :on_mouse_click
34
+ end
35
+
36
+ # Return pointer to the created control
37
+ def get_control
38
+ self
39
+ end
40
+
41
+ def lv_find_item(*args)
42
+ unless @wx_lv_find_item
43
+ @wx_lv_find_item = (Wx::ListView.instance_method :find_item).bind(self)
44
+ end
45
+ @wx_lv_find_item.call(*args)
46
+ end
47
+ protected :lv_find_item
48
+
49
+ # Translate string into a list selection
50
+ def set_string_value(s)
51
+ n = lv_find_item(-1, s)
52
+ if n >= 0 && n < get_item_count
53
+ select(n)
54
+ @value = n
55
+ end
56
+ end
57
+
58
+ # Get list selection as a string
59
+ def get_string_value
60
+ return get_item_text(@value) if @value >= 0
61
+ ''
62
+ end
63
+
64
+ # Do mouse hot-tracking (which is typical in list popups)
65
+ def on_mouse_move(event)
66
+ # Move selection to cursor ...
67
+ end
68
+
69
+ # On mouse left up, set the value and close the popup
70
+ def on_mouse_click(_event)
71
+ @value = get_first_selected
72
+
73
+ # Send event as well ...
74
+
75
+ dismiss
76
+ end
77
+
78
+ end
79
+ ```
80
+ - :pattern: !ruby/regexp /wxComboCtrl/
81
+ :replace: |
82
+
83
+ ```ruby
84
+ comboCtrl = Wx::ComboCtrl.new(self, Wx::ID_ANY, '')
85
+
86
+ popupCtrl = ListViewComboPopup.new
87
+
88
+ # It is important to call #set_popup_control as soon as possible
89
+ comboCtrl.set_popup_control(popupCtrl)
90
+
91
+ # Populate using Wx::ListView methods
92
+ popupCtrl.insert_item((popupCtrl.item_count, 'First Item')
93
+ popupCtrl.insert_item((popupCtrl.item_count, 'Second Item')
94
+ popupCtrl.insert_item((popupCtrl.item_count, 'Third Item')
95
+ ```
96
+ :wxComboCtrl.SetMainControl:
97
+ :detail:
98
+ :pre:
99
+ :programlisting:
100
+ - :pattern: !ruby/regexp /.*/
101
+ :replace: |
102
+
103
+ ```ruby
104
+ # Create the combo control using its default ctor.
105
+ combo = Wx::ComboCtrl.new
106
+
107
+ # Create the custom main control using its default ctor too.
108
+ main = SomeWindow.new
109
+
110
+ # Set the custom main control before creating the combo.
111
+ combo.set_main_control(main)
112
+
113
+ # And only create it now: Wx::TextCtrl won't be unnecessarily
114
+ # created because the combo already has a main window.
115
+ combo.create(panel, Wx::ID_ANY, '')
116
+
117
+ # Finally create the main window itself, now that its parent was
118
+ # created.
119
+ main.create(combo, ...)
120
+ ```
121
+ :wxComboCtrl.SetTextCtrlStyle:
122
+ :detail:
123
+ :pre:
124
+ :programlisting:
125
+ - :pattern: !ruby/regexp /.*/
126
+ :replace: |
127
+
128
+ ```ruby
129
+ comboCtrl = Wx::ComboCtrl.new
130
+
131
+ # Let's make the text right-aligned
132
+ comboCtrl.set_text_ctrl_style(Wx::TE_RIGHT)
133
+
134
+ comboCtrl.create(parent, Wx::ID_ANY, '')
135
+ ```
@@ -0,0 +1,62 @@
1
+ ---
2
+ :wxFileDialogCustomizeHook:
3
+ :detail:
4
+ :pre:
5
+ :programlisting:
6
+ - :pattern: !ruby/regexp /.*/
7
+ :replace: |
8
+
9
+ ```ruby
10
+ class EncryptHook < Wx::FileDialogCustomizeHook
11
+
12
+ attr_reader :encrypt
13
+
14
+ # Override to add custom controls using the provided customizer object.
15
+ def add_custom_controls(customizer)
16
+ # Suppose we can encrypt files when saving them.
17
+ @checkbox = customizer.add_check_box('Encrypt')
18
+
19
+ # While @checkbox is not a Wx::CheckBox, it looks almost like one
20
+ # and, in particular, we can bind to custom control events as usual.
21
+ @checkbox.evt_checkbox(Wx::ID_ANY) do |event|
22
+ # We can also call Wx::Window-like functions on them.
23
+ @button.enable(event.checked?)
24
+ end
25
+
26
+ # The encryption parameters can be edited in a dedicated dialog.
27
+ @button = customizer.add_button('Parameters...')
28
+ @button.evt_button(Wx::ID_ANY) do |event|
29
+ # ... show the encryption parameters dialog here ...
30
+ end
31
+ end
32
+
33
+ # Override to save the values of the custom controls.
34
+ def transfer_data_from_custom_controls
35
+ # Save the checkbox value, as we won't be able to use it any more
36
+ # once this function returns.
37
+ @encrypt = @checkbox.get_value
38
+ end
39
+
40
+ end
41
+
42
+ # ...
43
+
44
+ def some_method
45
+ Wx.FileDialog(nil, 'Save document', '', 'file.my',
46
+ 'My files (*.my)|*.my',
47
+ Wx::FD_SAVE | Wx::FD_OVERWRITE_PROMPT) do |dialog|
48
+
49
+ # This object may be destroyed before the dialog, but must remain
50
+ # alive until #show_modal returns.
51
+ customize_hook = EncryptHook.new
52
+ dialog.set_customize_hook(custom_hook)
53
+
54
+ if dialog.show_modal == Wx::ID_OK
55
+ if customize_hook.encrypt
56
+ # ... save with encryption ...
57
+ else
58
+ # ... save without encryption ...
59
+ end
60
+ end
61
+ end
62
+ ```
@@ -0,0 +1,28 @@
1
+ ---
2
+ :wxFileSystemHandler.CanOpen:
3
+ :detail:
4
+ :pre:
5
+ :para:
6
+ - :pattern: !ruby/regexp /Example:/
7
+ :subst: ''
8
+ :programlisting:
9
+ - :pattern: !ruby/regexp /.*/
10
+ :replace: ''
11
+ :wxFileSystemHandler.GetMimeTypeFromExt:
12
+ :detail:
13
+ :pre:
14
+ :para:
15
+ - :pattern: !ruby/regexp /Example:/
16
+ :subst: ''
17
+ :programlisting:
18
+ - :pattern: !ruby/regexp /.*/
19
+ :replace: ''
20
+ :wxMemoryFSHandler:
21
+ :detail:
22
+ :pre:
23
+ :para:
24
+ - :pattern: !ruby/regexp /Example:/
25
+ :subst: ''
26
+ :programlisting:
27
+ - :pattern: !ruby/regexp /.*/
28
+ :replace: ''
@@ -547,10 +547,18 @@ module WXRuby3
547
547
  if Extractor::EnumDef === item && !item.ignored && !item.items.all? {|e| e.ignored }
548
548
  fout.puts
549
549
  fout.puts "// from enum #{item.is_anonymous ? '' : item.name}"
550
- fout.puts "enum #{item.name};" unless item.is_anonymous
551
- item.items.each do |e|
552
- unless e.ignored
553
- fout.puts "%constant int #{e.name} = #{e.fqn};"
550
+ if item.is_anonymous
551
+ item.items.each do |e|
552
+ unless e.ignored
553
+ fout.puts "%constant int #{e.name} = #{e.fqn};"
554
+ end
555
+ end
556
+ else
557
+ fout.puts "enum #{item.name};"
558
+ item.items.each do |e|
559
+ unless e.ignored
560
+ fout.puts "%constant int #{item.name}_#{e.name} = #{e.fqn};"
561
+ end
554
562
  end
555
563
  end
556
564
  end
@@ -262,7 +262,7 @@ module WXRuby3
262
262
  def_items.each do |item|
263
263
  case item
264
264
  when Extractor::EnumDef
265
- item.items.each { |e| enumerators[rb_wx_name(e.name)] = item } if item.is_type
265
+ item.items.each { |e| enumerators["#{rb_wx_name(item.name)}_#{e.name}"] = item } if item.is_type
266
266
  when Extractor::ClassDef
267
267
  item.items.select { |itm| Extractor::EnumDef === itm }.each do |enum|
268
268
  enum.items.each { |e| enumerators[rb_wx_name(e.name)] = enum } if enum.is_type
@@ -334,6 +334,7 @@ module WXRuby3
334
334
  fix_enum = true
335
335
  enum_item = enum_table[md[2]]
336
336
  enum_name = rb_wx_name(enum_item.name)
337
+ enumerator_name = rb_wx_name(md[2].sub(/\A#{enum_name}_/, ''))
337
338
  enum_id = enum_item.scope.empty? ? enum_name : "#{rb_wx_name(enum_item.scope)}::#{enum_name}"
338
339
  enum_var = enum_id.gsub('::', '_')
339
340
  line = [
@@ -343,7 +344,7 @@ module WXRuby3
343
344
  # add enum class constant to current module (use unscoped name)
344
345
  " rb_define_const(#{md[1]}, \"#{enum_name}\", cWx#{enum_var}); // Inserted by fixmodule.rb",
345
346
  # create enumerator value const under new enum class
346
- " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{md[2]}\"#{md[3]} // Updated by fixmodule.rb"
347
+ " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{enumerator_name}\"#{md[3]} // Updated by fixmodule.rb"
347
348
  ].join("\n")
348
349
  end
349
350
  else
@@ -352,13 +353,15 @@ module WXRuby3
352
353
  # of the same enum?
353
354
  if enum_item && enum_table[md[2]] == enum_item
354
355
  enum_name = rb_wx_name(enum_item.name)
356
+ enumerator_name = rb_wx_name(md[2].sub(/\A#{enum_name}_/, ''))
355
357
  enum_id = enum_item.scope.empty? ? enum_name : "#{rb_wx_name(enum_item.scope)}::#{enum_name}"
356
358
  enum_var = enum_id.gsub('::', '_')
357
359
  # create enumerator value const under new enum class
358
- line = " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{md[2]}\"#{md[3]} // Updated by fixmodule.rb"
360
+ line = " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{enumerator_name}\"#{md[3]} // Updated by fixmodule.rb"
359
361
  else # we found the start of another enum
360
362
  enum_item = enum_table[md[2]]
361
363
  enum_name = rb_wx_name(enum_item.name)
364
+ enumerator_name = rb_wx_name(md[2].sub(/\A#{enum_name}_/, ''))
362
365
  enum_id = enum_item.scope.empty? ? enum_name : "#{rb_wx_name(enum_item.scope)}::#{enum_name}"
363
366
  enum_var = enum_id.gsub('::', '_')
364
367
  line = [
@@ -368,7 +371,7 @@ module WXRuby3
368
371
  # add enum class constant to current module (use unscoped name)
369
372
  " rb_define_const(#{md[1]}, \"#{enum_name}\", cWx#{enum_var}); // Inserted by fixmodule.rb",
370
373
  # create enumerator value const under new enum class
371
- " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{md[2]}\"#{md[3]} // Updated by fixmodule.rb"
374
+ " wxRuby_AddEnumValue(cWx#{enum_var}, \"#{enumerator_name}\"#{md[3]} // Updated by fixmodule.rb"
372
375
  ].join("\n")
373
376
  end
374
377
  else # end of enum def
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ ###
6
+ # wxRuby3 wxComboPopup typemap definition
7
+ ###
8
+
9
+ require_relative '../core/mapping'
10
+
11
+ module WXRuby3
12
+
13
+ module Typemap
14
+
15
+ module ComboPopup
16
+
17
+ include Typemap::Module
18
+
19
+ define do
20
+
21
+ # for DoSetPopupControl
22
+ map 'wxComboPopup* popup' => 'Wx::ComboPopup,nil' do
23
+
24
+ add_header_code <<~__CODE
25
+ #include <wx/combo.h>
26
+
27
+ WXRUBY_EXPORT wxComboPopup* wxRuby_ComboPopupFromRuby(VALUE popup);
28
+ WXRUBY_EXPORT VALUE wxRuby_ComboPopupToRuby(wxComboPopup* popup);
29
+ __CODE
30
+
31
+ map_in code: '$1 = wxRuby_ComboPopupFromRuby($input);'
32
+
33
+ map_directorin code: '$input = wxRuby_ComboPopupToRuby($1);'
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,196 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ require_relative './lib/wxframe_runner'
6
+ require_relative './lib/text_entry_tests'
7
+
8
+ class ComboCtrlCtrlTests < WxRuby::Test::GUITests
9
+
10
+ include TextEntryTests
11
+
12
+ class LVComboPopup < Wx::ListView
13
+
14
+ include Wx::ComboPopup
15
+
16
+ def initialize
17
+ # call default control ctor; need to call Wx::ListView#create later
18
+ super
19
+ end
20
+
21
+ def init
22
+ @value = -1
23
+ end
24
+
25
+ def create(parent)
26
+ # need to finish creating the list view here
27
+ # as calling super here would just call Wx::ComboPopup#create and not Wx::ListView#create
28
+ # we need to use Ruby magic
29
+ wx_lv_create = (Wx::ListView.instance_method :create).bind(self)
30
+ wx_lv_create.call(parent, 1, [0,0], Wx::DEFAULT_SIZE)
31
+ evt_motion :on_mouse_move
32
+ evt_left_up :on_mouse_click
33
+ end
34
+
35
+ # Return pointer to the created control
36
+ def get_control
37
+ self
38
+ end
39
+
40
+ def lv_find_item(*args)
41
+ unless @wx_lv_find_item
42
+ @wx_lv_find_item = (Wx::ListView.instance_method :find_item).bind(self)
43
+ end
44
+ @wx_lv_find_item.call(*args)
45
+ end
46
+ protected :lv_find_item
47
+
48
+ # Translate string into a list selection
49
+ def set_string_value(s)
50
+ n = lv_find_item(-1, s)
51
+ if n >= 0 && n < get_item_count
52
+ select(n)
53
+ @value = n
54
+ end
55
+ end
56
+
57
+ # Get list selection as a string
58
+ def get_string_value
59
+ return get_item_text(@value) if @value >= 0
60
+ ''
61
+ end
62
+
63
+ # Do mouse hot-tracking (which is typical in list popups)
64
+ def on_mouse_move(event)
65
+ # Move selection to cursor ...
66
+ end
67
+
68
+ # On mouse left up, set the value and close the popup
69
+ def on_mouse_click(_event)
70
+ @value = get_first_selected
71
+
72
+ # Send event as well ...
73
+
74
+ dismiss
75
+ end
76
+
77
+ end
78
+
79
+ def setup
80
+ super
81
+ @combo = Wx::ComboCtrl.new(frame_win, name: 'ComboCtrl')
82
+ @combo.set_popup_control(LVComboPopup.new)
83
+ end
84
+
85
+ def cleanup
86
+ @combo.destroy
87
+ super
88
+ end
89
+
90
+ attr_reader :combo
91
+ alias :text_entry :combo
92
+
93
+ def fill_list(list)
94
+ list.insert_item(0, 'This is the first item')
95
+ list.insert_item(1, 'This is the second item')
96
+ list.insert_item(2, 'This is the third item')
97
+ list.insert_item(3, 'This is the fourth item')
98
+ end
99
+
100
+ def test_popup
101
+ assert_equal('', combo.get_value)
102
+
103
+ assert_kind_of(Wx::ComboPopup, combo.get_popup_control)
104
+ assert_kind_of(Wx::ListView, combo.get_popup_control)
105
+ assert_kind_of(Wx::ListView, combo.get_popup_control.get_control)
106
+
107
+ assert_nothing_raised { fill_list(combo.get_popup_control) }
108
+ combo.popup
109
+
110
+ combo.set_value_by_user('This is the second item')
111
+
112
+ assert_equal('This is the second item', combo.get_popup_control.get_string_value)
113
+
114
+ combo.dismiss
115
+ end
116
+
117
+ end
118
+
119
+ class OwnerDrawnCBTests < WxRuby::Test::GUITests
120
+
121
+ include TextEntryTests
122
+
123
+ class TestODComboBox < Wx::OwnerDrawnComboBox
124
+
125
+ def on_draw_item(dc, rect, item, _flags)
126
+ return if item == Wx::NOT_FOUND
127
+
128
+ dc.set_text_foreground(Wx::BLACK)
129
+ dc.draw_text(get_string(item),
130
+ rect.x + 3,
131
+ rect.y + ((rect.height - dc.char_height)/2))
132
+ end
133
+
134
+ def on_draw_background(dc, rect, item, flags)
135
+ # If item is selected or even, or we are painting the
136
+ # combo control itself, use the default rendering.
137
+ if flags.anybits?(Wx::ODCB_PAINTING_CONTROL|Wx::ODCB_PAINTING_SELECTED) || (item & 1) == 0
138
+ super(dc,rect,item,flags)
139
+ return
140
+ end
141
+
142
+ # Otherwise, draw every other background with different colour.
143
+ bgCol = Wx::Colour.new(240,240,250)
144
+ dc.set_brush(Wx::Brush.new(bgCol))
145
+ dc.set_pen(Wx::Pen.new(bgCol))
146
+ dc.draw_rectangle(rect)
147
+ end
148
+
149
+ def on_measure_item(_item)
150
+ 48
151
+ end
152
+
153
+ def on_measure_item_width(_item)
154
+ -1 # default - will be measured from text width
155
+ end
156
+
157
+ end
158
+
159
+ def setup
160
+ super
161
+ @combo = TestODComboBox.new(frame_win, name: 'ODComboBox')
162
+ end
163
+
164
+ def cleanup
165
+ @combo.destroy
166
+ super
167
+ end
168
+
169
+ attr_reader :combo
170
+ alias :text_entry :combo
171
+
172
+ def fill_list(list)
173
+ list.append('This is the first item')
174
+ list.append('This is the second item')
175
+ list.append('This is the third item')
176
+ list.append('This is the fourth item')
177
+ end
178
+
179
+ def test_popup
180
+ assert_equal('', combo.get_value)
181
+
182
+ assert_kind_of(Wx::ComboPopup, combo.get_popup_control)
183
+ assert_kind_of(Wx::ComboPopupWx, combo.get_popup_control)
184
+ assert_kind_of(Wx::VListBox, combo.get_popup_control.get_control)
185
+
186
+ assert_nothing_raised { fill_list(combo) }
187
+ combo.popup
188
+
189
+ combo.set_value_by_user('This is the third item')
190
+
191
+ assert_equal('This is the third item', combo.get_popup_control.get_string_value)
192
+
193
+ combo.dismiss
194
+ end
195
+
196
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wxruby3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Corino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-07 00:00:00.000000000 Z
11
+ date: 2024-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -99,6 +99,7 @@ files:
99
99
  - ext/mkrf_conf_srcgem.rb
100
100
  - ext/wxruby3/include/wxRubyApp.h
101
101
  - ext/wxruby3/include/wxruby-ClientData.h
102
+ - ext/wxruby3/include/wxruby-ComboPopup.h
102
103
  - ext/wxruby3/include/wxruby-Config.h
103
104
  - ext/wxruby3/include/wxruby-Persistence.h
104
105
  - ext/wxruby3/include/wxruby-ScaledDC.h
@@ -147,6 +148,7 @@ files:
147
148
  - lib/wx/core/clipboard.rb
148
149
  - lib/wx/core/collapsible_pane.rb
149
150
  - lib/wx/core/colour.rb
151
+ - lib/wx/core/combo_ctrl.rb
150
152
  - lib/wx/core/combobox.rb
151
153
  - lib/wx/core/config.rb
152
154
  - lib/wx/core/const.rb
@@ -683,6 +685,7 @@ files:
683
685
  - rakelib/lib/generate/doc/clipboard.yaml
684
686
  - rakelib/lib/generate/doc/collapsible_pane.yaml
685
687
  - rakelib/lib/generate/doc/colour_dialog.yaml
688
+ - rakelib/lib/generate/doc/combo_ctrl.yaml
686
689
  - rakelib/lib/generate/doc/context_help_button.yaml
687
690
  - rakelib/lib/generate/doc/control.yaml
688
691
  - rakelib/lib/generate/doc/cursor.yaml
@@ -695,6 +698,8 @@ files:
695
698
  - rakelib/lib/generate/doc/events.yaml
696
699
  - rakelib/lib/generate/doc/evt_handler.yaml
697
700
  - rakelib/lib/generate/doc/file_dialog.yaml
701
+ - rakelib/lib/generate/doc/file_dialog_customize_hook.yaml
702
+ - rakelib/lib/generate/doc/file_system.yaml
698
703
  - rakelib/lib/generate/doc/font.yaml
699
704
  - rakelib/lib/generate/doc/frame.yaml
700
705
  - rakelib/lib/generate/doc/fs_file.yaml
@@ -764,6 +769,7 @@ files:
764
769
  - rakelib/lib/swig_runner.rb
765
770
  - rakelib/lib/typemap/array_int_selections.rb
766
771
  - rakelib/lib/typemap/client_data.rb
772
+ - rakelib/lib/typemap/combo_popup.rb
767
773
  - rakelib/lib/typemap/common.rb
768
774
  - rakelib/lib/typemap/config.rb
769
775
  - rakelib/lib/typemap/data_format.rb
@@ -1088,6 +1094,7 @@ files:
1088
1094
  - tests/test_book_controls.rb
1089
1095
  - tests/test_box_sizer.rb
1090
1096
  - tests/test_clipboard.rb
1097
+ - tests/test_combo_ctrl.rb
1091
1098
  - tests/test_config.rb
1092
1099
  - tests/test_dc.rb
1093
1100
  - tests/test_dialog.rb