wxruby3 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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