wxruby3 0.9.0.pre.beta.11 → 0.9.0.pre.beta.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/INSTALL.md +85 -0
- data/README.md +2 -0
- data/assets/logo.png +0 -0
- data/assets/logo.svg +170 -0
- data/assets/logo.xcf +0 -0
- data/ext/wxruby3/swig/wx.i +1 -1
- data/lib/wx/core/array_ext.rb +26 -0
- data/lib/wx/core/art_locator.rb +92 -0
- data/lib/wx/core/artprovider.rb +1 -1
- data/lib/wx/core/bitmap.rb +90 -53
- data/lib/wx/core/cursor.rb +12 -0
- data/lib/wx/core/dataformat.rb +3 -1
- data/lib/wx/core/dc.rb +76 -52
- data/lib/wx/core/enum.rb +4 -0
- data/lib/wx/core/event.rb +38 -5
- data/lib/wx/core/evthandler.rb +64 -23
- data/lib/wx/core/icon.rb +50 -35
- data/lib/wx/core/id_helper.rb +32 -0
- data/lib/wx/core/image.rb +63 -53
- data/lib/wx/core/point.rb +14 -0
- data/lib/wx/core/real_point.rb +15 -1
- data/lib/wx/core/rect.rb +42 -7
- data/lib/wx/core/region_iterator.rb +37 -0
- data/lib/wx/core/size.rb +20 -0
- data/lib/wx/core/window.rb +8 -31
- data/lib/wx/doc/array_ext.rb +27 -0
- data/lib/wx/doc/art_locator.rb +57 -0
- data/lib/wx/doc/bitmap.rb +27 -0
- data/lib/wx/doc/clipboard.rb +12 -0
- data/lib/wx/doc/const.rb +77 -0
- data/lib/wx/doc/cursor.rb +16 -0
- data/lib/wx/doc/data_object.rb +1 -2
- data/lib/wx/doc/dc.rb +63 -46
- data/lib/wx/doc/event.rb +24 -0
- data/lib/wx/doc/events.rb +14 -0
- data/lib/wx/doc/evthandler.rb +24 -3
- data/lib/wx/doc/extra/00_starting.md +1 -1
- data/lib/wx/doc/extra/06_geometry.md +10 -4
- data/lib/wx/doc/extra/10_art.md +105 -0
- data/lib/wx/doc/gc_dc.rb +21 -0
- data/lib/wx/doc/gdi_common.rb +122 -1
- data/lib/wx/doc/graphics_context.rb +42 -0
- data/lib/wx/doc/icon.rb +18 -0
- data/lib/wx/doc/id_helper.rb +25 -0
- data/lib/wx/doc/image.rb +33 -0
- data/lib/wx/doc/region_iterator.rb +31 -0
- data/lib/wx/doc/scaled_dc.rb +1 -0
- data/lib/wx/doc/window.rb +18 -0
- data/lib/wx/version.rb +1 -1
- data/lib/wx/wxruby/cmd/sampler.rb +3 -21
- data/rakelib/lib/config.rb +4 -4
- data/rakelib/lib/core/package.rb +3 -3
- data/rakelib/lib/director/art_provider.rb +2 -2
- data/rakelib/lib/director/busy_info.rb +9 -7
- data/rakelib/lib/director/clipboard.rb +1 -1
- data/rakelib/lib/director/colour_picker_ctrl.rb +1 -0
- data/rakelib/lib/director/data_object.rb +72 -4
- data/rakelib/lib/director/derived_dc.rb +100 -6
- data/rakelib/lib/director/dir_picker_ctrl.rb +1 -0
- data/rakelib/lib/director/event.rb +73 -8
- data/rakelib/lib/director/events.rb +19 -1
- data/rakelib/lib/director/file_picker_ctrl.rb +1 -0
- data/rakelib/lib/director/font_picker_ctrl.rb +1 -0
- data/rakelib/lib/director/gdicommon.rb +1 -3
- data/rakelib/lib/director/graphics_context.rb +89 -0
- data/rakelib/lib/director/help_controller.rb +2 -2
- data/rakelib/lib/director/html_data_object.rb +37 -0
- data/rakelib/lib/director/image.rb +55 -0
- data/rakelib/lib/director/region_iterator.rb +48 -0
- data/rakelib/lib/director/richtext_buffer.rb +1 -1
- data/rakelib/lib/director/richtext_buffer_data_object.rb +45 -0
- data/rakelib/lib/director/scroll_bar.rb +39 -0
- data/rakelib/lib/director/slider.rb +39 -0
- data/rakelib/lib/director/window.rb +36 -5
- data/rakelib/lib/director/window_disabler.rb +0 -7
- data/rakelib/lib/extractor/class.rb +1 -1
- data/rakelib/lib/extractor/function.rb +1 -1
- data/rakelib/lib/generate/doc.rb +26 -6
- data/rakelib/lib/specs/interfaces.rb +6 -1
- data/rakelib/lib/typemap/common.rb +1 -1
- data/rakelib/lib/util/string.rb +29 -8
- data/samples/art/wxruby-128x128.png +0 -0
- data/samples/art/wxruby-256x256.png +0 -0
- data/samples/art/wxruby-64x64.png +0 -0
- data/samples/art/wxruby.ico +0 -0
- data/samples/art/wxruby.png +0 -0
- data/samples/drawing/graphics_drawing.rb +1 -2
- data/samples/propgrid/propgrid.rb +65 -65
- data/samples/sample.xpm +246 -470
- data/samples/treectrl/treectrl.rb +1 -1
- data/tests/art/my_art/sample.xpm +251 -0
- data/tests/art/sample3.xpm +251 -0
- data/tests/art/test_art/bitmap/sample.xpm +251 -0
- data/tests/art/test_art/bitmap/wxruby.bmp +0 -0
- data/tests/art/test_art/bitmap/wxruby.png +0 -0
- data/tests/art/test_art/bitmap/wxruby.xpm +251 -0
- data/tests/art/test_art/cursor/wxruby.bmp +0 -0
- data/tests/art/test_art/icon/sample.xpm +251 -0
- data/tests/art/test_art/icon/wxruby.ico +0 -0
- data/tests/art/test_art/icon/wxruby.png +0 -0
- data/tests/art/test_art/image/sample.xpm +251 -0
- data/tests/art/test_art/image/wxruby.jpg +0 -0
- data/tests/art/test_art/image/wxruby.png +0 -0
- data/tests/art/test_art/sample2.xpm +251 -0
- data/tests/test_art.rb +91 -0
- data/tests/test_clipboard.rb +35 -0
- data/tests/test_dc.rb +70 -0
- data/tests/test_events.rb +12 -0
- data/tests/test_geometry.rb +13 -0
- metadata +51 -5
@@ -66,10 +66,10 @@ module WXRuby3
|
|
66
66
|
typedef std::map<wxDataObjectComposite*, data_object_list_t> composite_data_object_map_t;
|
67
67
|
static composite_data_object_map_t CompositeDataObject_Map;
|
68
68
|
|
69
|
-
static void
|
69
|
+
static void GC_mark_wxCompositeDataObject(void* ptr)
|
70
70
|
{
|
71
|
-
composite_data_object_map_t::iterator it;
|
72
|
-
|
71
|
+
composite_data_object_map_t::iterator it = CompositeDataObject_Map.find(static_cast<wxDataObjectComposite*> (ptr));
|
72
|
+
if (it != CompositeDataObject_Map.end())
|
73
73
|
{
|
74
74
|
data_object_list_t &do_list = it->second;
|
75
75
|
for (VALUE data_obj : do_list)
|
@@ -96,12 +96,80 @@ module WXRuby3
|
|
96
96
|
CompositeDataObject_Map.erase(this);
|
97
97
|
}
|
98
98
|
};
|
99
|
+
|
100
|
+
#if wxUSE_RICHTEXT
|
101
|
+
#include <wx/richtext/richtextbuffer.h>
|
102
|
+
#endif
|
103
|
+
|
104
|
+
// Add custom object wrapper for DataObjectComposite#get_object result
|
105
|
+
static VALUE wxRuby_WrapDataObjectSimple(wxDataObjectSimple* d_obj)
|
106
|
+
{
|
107
|
+
if (!d_obj)
|
108
|
+
return Qnil;
|
109
|
+
|
110
|
+
// check if we have this object tracked
|
111
|
+
VALUE r_obj = SWIG_RubyInstanceFor(d_obj);
|
112
|
+
if (r_obj != Qnil)
|
113
|
+
{
|
114
|
+
swig_class* sklass = (swig_class *) SWIGTYPE_p_wxDataObjectSimple->clientdata;
|
115
|
+
if (rb_obj_is_kind_of(r_obj, sklass->klass))
|
116
|
+
return r_obj;
|
117
|
+
}
|
118
|
+
|
119
|
+
// Otherwise check the returned type and create a new object wrapper
|
120
|
+
void* do_ptr;
|
121
|
+
if ((do_ptr = dynamic_cast<wxBitmapDataObject*> (d_obj)))
|
122
|
+
{
|
123
|
+
return SWIG_NewPointerObj(do_ptr, SWIGTYPE_p_wxBitmapDataObject, 0);
|
124
|
+
}
|
125
|
+
if ((do_ptr = dynamic_cast<wxImageDataObject*> (d_obj)))
|
126
|
+
{
|
127
|
+
return SWIG_NewPointerObj(do_ptr, SWIGTYPE_p_wxImageDataObject, 0);
|
128
|
+
}
|
129
|
+
if ((do_ptr = dynamic_cast<wxCustomDataObject*> (d_obj)))
|
130
|
+
{
|
131
|
+
return SWIG_NewPointerObj(do_ptr, SWIGTYPE_p_wxCustomDataObject, 0);
|
132
|
+
}
|
133
|
+
if ((do_ptr = dynamic_cast<wxFileDataObject*> (d_obj)))
|
134
|
+
{
|
135
|
+
return SWIG_NewPointerObj(do_ptr, SWIGTYPE_p_wxFileDataObject, 0);
|
136
|
+
}
|
137
|
+
if ((do_ptr = dynamic_cast<wxTextDataObject*> (d_obj)))
|
138
|
+
{
|
139
|
+
return SWIG_NewPointerObj(do_ptr, SWIGTYPE_p_wxTextDataObject, 0);
|
140
|
+
}
|
141
|
+
#if wxUSE_HTML && (wxVERSION_NUMBER >= 3300)
|
142
|
+
if ((do_ptr = dynamic_cast<wxHTMLDataObject*> (d_obj)))
|
143
|
+
{
|
144
|
+
VALUE r_class = rb_eval_string("Wx::HTML::HTMLDataObject");
|
145
|
+
swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(r_class);
|
146
|
+
return SWIG_NewPointerObj(do_ptr, swig_type, 0);
|
147
|
+
}
|
148
|
+
#endif
|
149
|
+
/** Leave these for now. RichText has special needs
|
150
|
+
#if wxUSE_RICHTEXT
|
151
|
+
if ((do_ptr = dynamic_cast<wxRichTextBufferDataObject*> (d_obj)))
|
152
|
+
{
|
153
|
+
VALUE r_class = rb_eval_string("Wx::RTC::RichTextBufferDataObject");
|
154
|
+
swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(r_class);
|
155
|
+
return SWIG_NewPointerObj(do_ptr, swig_type, 0);
|
156
|
+
}
|
157
|
+
#endif
|
158
|
+
**/
|
159
|
+
return SWIG_NewPointerObj(SWIG_as_voidptr(d_obj), SWIGTYPE_p_wxDataObjectSimple, 0);
|
160
|
+
}
|
99
161
|
__HEREDOC
|
100
162
|
# install GC marker
|
101
|
-
spec.
|
163
|
+
spec.add_swig_code '%markfunc wxDataObjectComposite "GC_mark_wxCompositeDataObject";'
|
164
|
+
|
102
165
|
# use custom implementation class
|
103
166
|
spec.use_class_implementation 'wxDataObjectComposite', 'WxRuby_DataObjectComposite'
|
104
167
|
|
168
|
+
# make sure to return the right derived type
|
169
|
+
spec.map 'wxDataObjectSimple*' => 'Wx::DataObjectSimple' do
|
170
|
+
map_out code: '$result = wxRuby_WrapDataObjectSimple($1);'
|
171
|
+
end
|
172
|
+
|
105
173
|
# disable generating the default Add method (keep docs)
|
106
174
|
spec.ignore 'wxDataObjectComposite::Add', ignore_doc: false
|
107
175
|
# Add custom Add implementation
|
@@ -14,20 +14,24 @@ module WXRuby3
|
|
14
14
|
spec.disable_proxies
|
15
15
|
if spec.module_name == 'wxScreenDC'
|
16
16
|
spec.make_abstract 'wxScreenDC'
|
17
|
+
spec.gc_never 'wxScreenDC'
|
17
18
|
# as a ScreenDC should always be a temporary stack object
|
18
19
|
# we do not allow creation in Ruby but rather provide a class
|
19
20
|
# method for block execution on a temp dc
|
20
21
|
spec.add_extend_code 'wxScreenDC', <<~__HEREDOC
|
21
22
|
static VALUE paint(VALUE proc)
|
22
23
|
{
|
24
|
+
VALUE rc = Qnil;
|
23
25
|
if (rb_block_given_p ())
|
24
26
|
{
|
25
27
|
wxScreenDC screen_dc;
|
26
28
|
wxDC* dc_ptr = &screen_dc;
|
27
29
|
VALUE rb_dc = SWIG_NewPointerObj(SWIG_as_voidptr(dc_ptr), SWIGTYPE_p_wxScreenDC, 0);
|
28
|
-
|
30
|
+
rc = rb_yield(rb_dc);
|
31
|
+
SWIG_RubyRemoveTracking((void *)dc_ptr);
|
32
|
+
DATA_PTR(rb_dc) = NULL;
|
29
33
|
}
|
30
|
-
return
|
34
|
+
return rc;
|
31
35
|
}
|
32
36
|
__HEREDOC
|
33
37
|
# not relevant anymore
|
@@ -51,13 +55,100 @@ module WXRuby3
|
|
51
55
|
'wxSVGFileDC::StartPage',
|
52
56
|
'wxSVGFileDC::EndPage'
|
53
57
|
elsif spec.module_name == 'wxGCDC'
|
58
|
+
spec.make_abstract 'wxGCDC'
|
59
|
+
spec.gc_never 'wxGCDC'
|
60
|
+
# as a GCDC should always be a temporary stack object
|
61
|
+
# we do not allow creation in Ruby but rather provide class
|
62
|
+
# methods for block execution on a temp dc
|
63
|
+
spec.add_extend_code 'wxGCDC', <<~__HEREDOC
|
64
|
+
static VALUE draw_on(const wxWindowDC& dc)
|
65
|
+
{
|
66
|
+
VALUE rc = Qnil;
|
67
|
+
if (rb_block_given_p ())
|
68
|
+
{
|
69
|
+
// Somehow there seems to be a problem with the Ruby GCDC value
|
70
|
+
// being GC-ed unless we block GC for the duration of the block
|
71
|
+
// execution. Unclear why. We have similar code for other objects
|
72
|
+
// where this issue does not come up.
|
73
|
+
VALUE gc_on = rb_gc_disable();
|
74
|
+
wxGCDC gc_dc(dc);
|
75
|
+
wxGCDC* dc_ptr = &gc_dc;
|
76
|
+
VALUE rb_dc = SWIG_NewPointerObj(SWIG_as_voidptr(dc_ptr), SWIGTYPE_p_wxGCDC, 0);
|
77
|
+
rc = rb_yield(rb_dc);
|
78
|
+
SWIG_RubyRemoveTracking((void *)dc_ptr);
|
79
|
+
DATA_PTR(rb_dc) = NULL;
|
80
|
+
if (gc_on == Qtrue) rb_gc_enable();
|
81
|
+
}
|
82
|
+
return rc;
|
83
|
+
}
|
84
|
+
static VALUE draw_on(const wxMemoryDC& dc)
|
85
|
+
{
|
86
|
+
VALUE rc = Qnil;
|
87
|
+
if (rb_block_given_p ())
|
88
|
+
{
|
89
|
+
// Somehow there seems to be a problem with the Ruby GCDC value
|
90
|
+
// being GC-ed unless we block GC for the duration of the block
|
91
|
+
// execution. Unclear why. We have similar code for other objects
|
92
|
+
// where this issue does not come up.
|
93
|
+
VALUE gc_on = rb_gc_disable();
|
94
|
+
wxGCDC gc_dc(dc);
|
95
|
+
wxGCDC* dc_ptr = &gc_dc;
|
96
|
+
VALUE rb_dc = SWIG_NewPointerObj(SWIG_as_voidptr(dc_ptr), SWIGTYPE_p_wxGCDC, 0);
|
97
|
+
rc = rb_yield(rb_dc);
|
98
|
+
SWIG_RubyRemoveTracking((void *)dc_ptr);
|
99
|
+
DATA_PTR(rb_dc) = NULL;
|
100
|
+
if (gc_on == Qtrue) rb_gc_enable();
|
101
|
+
}
|
102
|
+
return rc;
|
103
|
+
}
|
104
|
+
static VALUE draw_on(const wxPrinterDC& dc)
|
105
|
+
{
|
106
|
+
VALUE rc = Qnil;
|
107
|
+
if (rb_block_given_p ())
|
108
|
+
{
|
109
|
+
// Somehow there seems to be a problem with the Ruby GCDC value
|
110
|
+
// being GC-ed unless we block GC for the duration of the block
|
111
|
+
// execution. Unclear why. We have similar code for other objects
|
112
|
+
// where this issue does not come up.
|
113
|
+
VALUE gc_on = rb_gc_disable();
|
114
|
+
wxGCDC gc_dc(dc);
|
115
|
+
wxGCDC* dc_ptr = &gc_dc;
|
116
|
+
VALUE rb_dc = SWIG_NewPointerObj(SWIG_as_voidptr(dc_ptr), SWIGTYPE_p_wxGCDC, 0);
|
117
|
+
rc = rb_yield(rb_dc);
|
118
|
+
SWIG_RubyRemoveTracking((void *)dc_ptr);
|
119
|
+
DATA_PTR(rb_dc) = NULL;
|
120
|
+
if (gc_on == Qtrue) rb_gc_enable();
|
121
|
+
}
|
122
|
+
return rc;
|
123
|
+
}
|
124
|
+
static VALUE draw_on(wxGraphicsContext* gc)
|
125
|
+
{
|
126
|
+
VALUE rc = Qnil;
|
127
|
+
if (rb_block_given_p ())
|
128
|
+
{
|
129
|
+
// Somehow there seems to be a problem with the Ruby GCDC value
|
130
|
+
// being GC-ed unless we block GC for the duration of the block
|
131
|
+
// execution. Unclear why. We have similar code for other objects
|
132
|
+
// where this issue does not come up.
|
133
|
+
VALUE gc_on = rb_gc_disable();
|
134
|
+
wxGCDC gc_dc(gc);
|
135
|
+
wxGCDC* dc_ptr = &gc_dc;
|
136
|
+
VALUE rb_dc = SWIG_NewPointerObj(SWIG_as_voidptr(dc_ptr), SWIGTYPE_p_wxGCDC, 0);
|
137
|
+
rc = rb_yield(rb_dc);
|
138
|
+
SWIG_RubyRemoveTracking((void *)dc_ptr);
|
139
|
+
DATA_PTR(rb_dc) = NULL;
|
140
|
+
if (gc_on == Qtrue) rb_gc_enable();
|
141
|
+
}
|
142
|
+
return rc;
|
143
|
+
}
|
144
|
+
__HEREDOC
|
54
145
|
spec.ignore 'wxGCDC::wxGCDC(const wxEnhMetaFileDC &)'
|
55
146
|
elsif spec.module_name == 'wxScaledDC'
|
56
147
|
spec.items.clear # wxRuby extension; no XML docs
|
57
148
|
spec.override_inheritance_chain('wxScaledDC', %w[wxDC wxObject])
|
58
149
|
# as there are no dependencies parsed from XML make sure we're initialized after Wx::DC
|
59
150
|
spec.initialize_at_end = true
|
60
|
-
spec.
|
151
|
+
spec.gc_never 'wxScaledDC'
|
61
152
|
spec.no_proxy 'wxScaledDC'
|
62
153
|
spec.include 'wxruby-ScaledDC.h'
|
63
154
|
# wxScaledDc should ever only be used in a restricted scope
|
@@ -67,16 +158,19 @@ module WXRuby3
|
|
67
158
|
# so we use a workaround here)
|
68
159
|
spec.add_swig_code <<~__HEREDOC
|
69
160
|
%extend wxScaledDC {
|
70
|
-
static
|
161
|
+
static VALUE draw_on(wxDC& target, double scale)
|
71
162
|
{
|
163
|
+
VALUE rc = Qnil;
|
72
164
|
if (rb_block_given_p())
|
73
165
|
{
|
74
166
|
wxScaledDC scaled_dc(target, scale);
|
75
167
|
wxScaledDC* p_scaled_dc = &scaled_dc;
|
76
168
|
VALUE rb_scaled_dc = SWIG_NewPointerObj(SWIG_as_voidptr(p_scaled_dc), SWIGTYPE_p_wxScaledDC, 0);
|
77
|
-
rb_yield(rb_scaled_dc);
|
169
|
+
rc = rb_yield(rb_scaled_dc);
|
170
|
+
SWIG_RubyRemoveTracking((void *)p_scaled_dc);
|
171
|
+
DATA_PTR(rb_scaled_dc) = NULL;
|
78
172
|
}
|
79
|
-
return ;
|
173
|
+
return rc;
|
80
174
|
}
|
81
175
|
};
|
82
176
|
__HEREDOC
|
@@ -24,11 +24,68 @@ module WXRuby3
|
|
24
24
|
# make Ruby director and wrappers use custom implementation
|
25
25
|
spec.use_class_implementation('wxEvent', 'wxRubyEvent')
|
26
26
|
spec.extend_interface('wxEvent', 'wxEvent(wxEventType commandType = wxEVT_NULL, int id = 0, int prop_level = wxEVENT_PROPAGATE_NONE)')
|
27
|
-
spec.
|
28
|
-
spec.ignore %w[wxEvent::Clone wxEvent::GetEventUserData]
|
27
|
+
spec.ignore %w[wxEvent::GetEventUserData]
|
29
28
|
spec.ignore 'wxEvent::wxEvent(int,wxEventType)'
|
30
29
|
spec.no_proxy 'wxEvent::Clone'
|
30
|
+
spec.regard 'wxEvent::Clone', regard_doc: false # need updated doc
|
31
|
+
# need this to force alloc func
|
32
|
+
spec.add_swig_code '%feature("notabstract") wxEvent;'
|
33
|
+
# type mapping for result #clone
|
34
|
+
spec.map 'wxEvent*' => 'Wx::Event' do
|
35
|
+
map_out code: <<~__CODE
|
36
|
+
$result = wxRuby_WrapClonedWxEvent($1);
|
37
|
+
__CODE
|
38
|
+
end
|
31
39
|
spec.add_header_code <<~__HEREDOC
|
40
|
+
static VALUE Evt_Type_Map = NULL;
|
41
|
+
static VALUE wxRuby_WrapClonedWxEvent(wxEvent* wx_evt)
|
42
|
+
{
|
43
|
+
wxString class_name( wx_evt->GetClassInfo()->GetClassName() );
|
44
|
+
if (class_name == "wxEvent" || class_name == "wxCommandEvent")
|
45
|
+
{
|
46
|
+
// special clones for Ruby derived events are already managed and tracked
|
47
|
+
return SWIG_RubyInstanceFor((void *)wx_evt);
|
48
|
+
}
|
49
|
+
|
50
|
+
// otherwise
|
51
|
+
|
52
|
+
// Get the mapping of event types to classes
|
53
|
+
if ( ! Evt_Type_Map )
|
54
|
+
{
|
55
|
+
Evt_Type_Map = wxRuby_GetEventTypeClassMap ();
|
56
|
+
}
|
57
|
+
|
58
|
+
// Then, look up the event type in this hash (MUCH faster than calling
|
59
|
+
// EvtHandler.evt_class_for_type method)
|
60
|
+
VALUE rb_event_type_id = INT2NUM( wx_evt->GetEventType() );
|
61
|
+
VALUE rb_event_class = rb_hash_aref(Evt_Type_Map, rb_event_type_id);
|
62
|
+
|
63
|
+
if ( NIL_P(rb_event_class) )
|
64
|
+
{
|
65
|
+
rb_event_class = wxRuby_GetDefaultEventClass();
|
66
|
+
rb_warning("Unmapped event type %i (%s)", wx_evt->GetEventType(), (const char *)class_name.mb_str());
|
67
|
+
}
|
68
|
+
|
69
|
+
// Wrap as owned object as this is a user code factory function.
|
70
|
+
swig_type_info* type = wxRuby_GetSwigTypeForClass(rb_event_class);
|
71
|
+
swig_class* class_info = (swig_class*)type->clientdata;
|
72
|
+
// Create a new (owned) Ruby event object
|
73
|
+
VALUE rb_evt = Data_Wrap_Struct(class_info->klass, VOIDFUNC(class_info->mark),
|
74
|
+
VOIDFUNC(class_info->destroy),
|
75
|
+
wx_evt);
|
76
|
+
// track new event object
|
77
|
+
SWIG_RubyAddTracking(wx_evt, rb_evt);
|
78
|
+
// do not forget to mark the instance with the mangled swig type name
|
79
|
+
rb_iv_set(rb_evt, "@__swigtype__", rb_str_new2(type->name));
|
80
|
+
|
81
|
+
#if __WXRB_DEBUG__
|
82
|
+
if (wxRuby_TraceLevel()>1)
|
83
|
+
std::wcout << "* wxRuby_WrapClonedWxEvent - wrapped cloned event " << wx_evt << "{" << type->name << "}" << std::endl;
|
84
|
+
#endif
|
85
|
+
|
86
|
+
return rb_evt;
|
87
|
+
}
|
88
|
+
|
32
89
|
// Custom subclass implementation. Provide a constructor, destructor and
|
33
90
|
// clone functions to allow proper linking to a Ruby object.
|
34
91
|
class WXRUBY_EXPORT wxRubyEvent : public wxEvent
|
@@ -85,8 +142,8 @@ module WXRuby3
|
|
85
142
|
wxCommandEvent::SetClientObject
|
86
143
|
wxCommandEvent::GetExtraLong
|
87
144
|
}
|
88
|
-
|
89
|
-
spec.
|
145
|
+
# need this to force alloc func
|
146
|
+
spec.add_swig_code '%feature("notabstract") wxCommandEvent;'
|
90
147
|
spec.add_header_code <<~__HEREDOC
|
91
148
|
// Cf wxEvent - has to be written as a C+++ subclass to ensure correct
|
92
149
|
// GC/thread protection of Ruby instance variables when user-written
|
@@ -129,7 +186,8 @@ module WXRuby3
|
|
129
186
|
};
|
130
187
|
__HEREDOC
|
131
188
|
spec.add_wrapper_code <<~__HEREDOC
|
132
|
-
extern VALUE wxRuby_GetDefaultEventClass
|
189
|
+
extern VALUE wxRuby_GetDefaultEventClass()
|
190
|
+
{
|
133
191
|
return SwigClassWxEvent.klass;
|
134
192
|
}
|
135
193
|
__HEREDOC
|
@@ -145,8 +203,8 @@ module WXRuby3
|
|
145
203
|
|
146
204
|
def process(gendoc: false)
|
147
205
|
defmod = super
|
148
|
-
spec.
|
149
|
-
|
206
|
+
unless spec.module_name == 'wxEvent'
|
207
|
+
spec.items.each do |citem|
|
150
208
|
def_item = defmod.find_item(citem)
|
151
209
|
if Extractor::ClassDef === def_item
|
152
210
|
if def_item.hierarchy.has_key?('wxEvent')
|
@@ -158,7 +216,14 @@ module WXRuby3
|
|
158
216
|
elsif def_item.hierarchy.has_key?('wxNotifyEvent')
|
159
217
|
spec.override_inheritance_chain(citem, {'wxNotifyEvent' => 'wxEvents'}, {'wxCommandEvent' => 'wxEvent'}, 'wxEvent', 'wxObject')
|
160
218
|
end
|
161
|
-
|
219
|
+
case citem
|
220
|
+
when 'wxNotifyEvent', 'wxPaintEvent'
|
221
|
+
# keep these abstract in wxRuby
|
222
|
+
spec.make_abstract(citem)
|
223
|
+
else
|
224
|
+
# need this to force alloc func
|
225
|
+
spec.add_swig_code "%feature(\"notabstract\") #{citem};"
|
226
|
+
end
|
162
227
|
end
|
163
228
|
end
|
164
229
|
end
|
@@ -24,7 +24,7 @@ module WXRuby3
|
|
24
24
|
wxPaletteChangedEvent wxQueryNewPaletteEvent wxNavigationKeyEvent wxWindowCreateEvent
|
25
25
|
wxWindowDestroyEvent wxHelpEvent wxClipboardTextEvent wxContextMenuEvent wxChildFocusEvent
|
26
26
|
])
|
27
|
-
spec.fold_bases('wxMouseEvent' =>
|
27
|
+
spec.fold_bases('wxMouseEvent' => %w[wxMouseState wxKeyboardState], 'wxKeyEvent' => 'wxKeyboardState')
|
28
28
|
spec.set_only_for 'WXWIN_COMPATIBILITY_2_8', 'wxShowEvent::GetShow', 'wxIconizeEvent::Iconized'
|
29
29
|
spec.ignore 'wxKeyEvent::GetPosition(wxCoord *,wxCoord *) const'
|
30
30
|
spec.ignore 'wxMouseState::GetPosition(int *,int *)'
|
@@ -32,6 +32,24 @@ module WXRuby3
|
|
32
32
|
spec.do_not_generate(:variables, :defines, :enums, :functions)
|
33
33
|
end
|
34
34
|
|
35
|
+
def process(gendoc: false)
|
36
|
+
defmod = super
|
37
|
+
# fix documentation errors for wxScrollEvent
|
38
|
+
def_item = defmod.find_item('wxScrollEvent')
|
39
|
+
if def_item
|
40
|
+
def_item.event_types.each do |evt_spec|
|
41
|
+
case evt_spec.first
|
42
|
+
when 'EVT_COMMAND_SCROLL_THUMBRELEASE', 'EVT_COMMAND_SCROLL_CHANGED'
|
43
|
+
if evt_spec[2] == 0
|
44
|
+
evt_spec[2] = 1 # incorrectly documented without 'id' argument
|
45
|
+
evt_spec[4] = true # ignore extracted docs
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
defmod
|
51
|
+
end
|
52
|
+
|
35
53
|
end # class Events
|
36
54
|
|
37
55
|
end # class Director
|
@@ -23,14 +23,12 @@ module WXRuby3
|
|
23
23
|
'wxClientDisplayRect(int *,int *,int *,int *)',
|
24
24
|
'wxDisplaySize(int *,int *)',
|
25
25
|
'wxDisplaySizeMM(int *,int *)',
|
26
|
-
'wxRect::Inflate(wxCoord,wxCoord)',
|
27
26
|
'wxRect::Inflate(wxCoord,wxCoord) const',
|
28
|
-
'wxRect::Deflate(wxCoord,wxCoord)',
|
29
27
|
'wxRect::Deflate(wxCoord,wxCoord) const',
|
30
|
-
'wxRect::Offset(wxCoord,wxCoord)',
|
31
28
|
'wxRect::Intersect(const wxRect &)',
|
32
29
|
'wxRect::Union(const wxRect &)'
|
33
30
|
]
|
31
|
+
spec.regard 'wxRect::Offset', regard_doc: false
|
34
32
|
# overrule common wxPoint mapping for wxRect ctor to fix ctor ambiguities here wrt wxSize
|
35
33
|
spec.map 'const wxPoint& topLeft', 'const wxPoint& bottomRight', as: 'Wx::Point' do
|
36
34
|
map_in code: <<~__CODE
|
@@ -135,6 +135,95 @@ module WXRuby3
|
|
135
135
|
}
|
136
136
|
__CODE
|
137
137
|
end
|
138
|
+
spec.new_object 'wxGraphicsContext::Create',
|
139
|
+
'wxGraphicsContext::CreateFromUnknownDC'
|
140
|
+
# add convenience method providing efficient gc memory management
|
141
|
+
spec.add_extend_code 'wxGraphicsContext', <<~__HEREDOC
|
142
|
+
static VALUE draw_on(wxWindow* win)
|
143
|
+
{
|
144
|
+
VALUE rc = Qnil;
|
145
|
+
if (rb_block_given_p())
|
146
|
+
{
|
147
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create(win);
|
148
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
149
|
+
rc = rb_yield(rb_gc);
|
150
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
151
|
+
DATA_PTR(rb_gc) = NULL;
|
152
|
+
delete p_gc;
|
153
|
+
}
|
154
|
+
return rc;
|
155
|
+
}
|
156
|
+
static VALUE draw_on(const wxWindowDC& dc)
|
157
|
+
{
|
158
|
+
VALUE rc = Qnil;
|
159
|
+
if (rb_block_given_p())
|
160
|
+
{
|
161
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create(dc);
|
162
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
163
|
+
rc = rb_yield(rb_gc);
|
164
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
165
|
+
DATA_PTR(rb_gc) = NULL;
|
166
|
+
delete p_gc;
|
167
|
+
}
|
168
|
+
return rc;
|
169
|
+
}
|
170
|
+
static VALUE draw_on(const wxMemoryDC& dc)
|
171
|
+
{
|
172
|
+
VALUE rc = Qnil;
|
173
|
+
if (rb_block_given_p())
|
174
|
+
{
|
175
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create(dc);
|
176
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
177
|
+
rc = rb_yield(rb_gc);
|
178
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
179
|
+
DATA_PTR(rb_gc) = NULL;
|
180
|
+
delete p_gc;
|
181
|
+
}
|
182
|
+
return rc;
|
183
|
+
}
|
184
|
+
static VALUE draw_on(const wxPrinterDC& dc)
|
185
|
+
{
|
186
|
+
VALUE rc = Qnil;
|
187
|
+
if (rb_block_given_p())
|
188
|
+
{
|
189
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create(dc);
|
190
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
191
|
+
rc = rb_yield(rb_gc);
|
192
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
193
|
+
DATA_PTR(rb_gc) = NULL;
|
194
|
+
delete p_gc;
|
195
|
+
}
|
196
|
+
return rc;
|
197
|
+
}
|
198
|
+
static VALUE draw_on(wxImage& img)
|
199
|
+
{
|
200
|
+
VALUE rc = Qnil;
|
201
|
+
if (rb_block_given_p())
|
202
|
+
{
|
203
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create(img);
|
204
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
205
|
+
rc = rb_yield(rb_gc);
|
206
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
207
|
+
DATA_PTR(rb_gc) = NULL;
|
208
|
+
delete p_gc;
|
209
|
+
}
|
210
|
+
return rc;
|
211
|
+
}
|
212
|
+
static VALUE draw_on()
|
213
|
+
{
|
214
|
+
VALUE rc = Qnil;
|
215
|
+
if (rb_block_given_p())
|
216
|
+
{
|
217
|
+
wxGraphicsContext* p_gc = wxGraphicsContext::Create();
|
218
|
+
VALUE rb_gc = SWIG_NewPointerObj(SWIG_as_voidptr(p_gc), SWIGTYPE_p_wxGraphicsContext, 1);
|
219
|
+
rc = rb_yield(rb_gc);
|
220
|
+
SWIG_RubyRemoveTracking((void *)p_gc);
|
221
|
+
DATA_PTR(rb_gc) = NULL;
|
222
|
+
delete p_gc;
|
223
|
+
}
|
224
|
+
return rc;
|
225
|
+
}
|
226
|
+
__HEREDOC
|
138
227
|
end
|
139
228
|
end # class GraphicsContext
|
140
229
|
|
@@ -43,8 +43,8 @@ module WXRuby3
|
|
43
43
|
{
|
44
44
|
rc = rb_ary_new();
|
45
45
|
rb_ary_push(rc, wxRuby_WrapWxObjectInRuby(result));
|
46
|
-
rb_ary_push(rc, SWIG_NewPointerObj(
|
47
|
-
rb_ary_push(rc, SWIG_NewPointerObj(
|
46
|
+
rb_ary_push(rc, SWIG_NewPointerObj(new wxSize(size), SWIGTYPE_p_wxSize, 1));
|
47
|
+
rb_ary_push(rc, SWIG_NewPointerObj(new wxPoint(pos), SWIGTYPE_p_wxPoint, 1));
|
48
48
|
rb_ary_push(rc, newFrameEachTime ? Qtrue : Qfalse);
|
49
49
|
}
|
50
50
|
return rc;
|
@@ -0,0 +1,37 @@
|
|
1
|
+
###
|
2
|
+
# wxRuby3 wxWidgets interface director
|
3
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
4
|
+
###
|
5
|
+
|
6
|
+
module WXRuby3
|
7
|
+
|
8
|
+
class Director
|
9
|
+
|
10
|
+
class HTMLDataObject < Director
|
11
|
+
|
12
|
+
include Typemap::DataFormat
|
13
|
+
include Typemap::DataObjectData
|
14
|
+
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
spec.gc_as_object
|
18
|
+
# make sure the build scripts know that DataObjectSimple is part of the DataObject module
|
19
|
+
spec.override_inheritance_chain('wxHTMLDataObject', {'wxDataObjectSimple' => 'wxDataObject'}, 'wxDataObject')
|
20
|
+
# we only allow Ruby derivatives from wxDataObject but not of any of the C++ implemented
|
21
|
+
# specializations
|
22
|
+
spec.no_proxy 'wxHTMLDataObject'
|
23
|
+
spec.add_swig_code <<~__HEREDOC
|
24
|
+
// SWIG gets confused and doesn't realise that various virtual methods
|
25
|
+
// from wxDataObject are implemented fully in this subclass, and so,
|
26
|
+
// believing it to be abstract doesn't provide an allocator for this
|
27
|
+
// class. This undocumented feature overrides this.
|
28
|
+
%feature("notabstract") wxHTMLDataObject;
|
29
|
+
__HEREDOC
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -43,6 +43,61 @@ module WXRuby3
|
|
43
43
|
wxImage::InsertHandler
|
44
44
|
wxImage::RemoveHandler
|
45
45
|
]
|
46
|
+
# add convenience class methods
|
47
|
+
spec.add_extend_code 'wxImage', <<~__HEREDOC
|
48
|
+
static VALUE handlers()
|
49
|
+
{
|
50
|
+
VALUE hnd_ary = rb_ary_new();
|
51
|
+
wxList& hnd_lst = wxImage::GetHandlers();
|
52
|
+
for (wxList::compatibility_iterator node = hnd_lst.GetFirst();
|
53
|
+
node; node = node->GetNext())
|
54
|
+
{
|
55
|
+
wxImageHandler *handler = (wxImageHandler *) node->GetData();
|
56
|
+
wxBitmapType bmp_type = handler->GetType();
|
57
|
+
rb_ary_push(hnd_ary, wxRuby_GetEnumValueObject("wxBitmapType", (int)bmp_type));
|
58
|
+
}
|
59
|
+
return hnd_ary;
|
60
|
+
}
|
61
|
+
|
62
|
+
static VALUE extensions()
|
63
|
+
{
|
64
|
+
VALUE ext_ary = rb_ary_new();
|
65
|
+
wxList& hnd_lst = wxImage::GetHandlers();
|
66
|
+
for (wxList::compatibility_iterator node = hnd_lst.GetFirst();
|
67
|
+
node; node = node->GetNext())
|
68
|
+
{
|
69
|
+
wxImageHandler *handler = (wxImageHandler *) node->GetData();
|
70
|
+
rb_ary_push(ext_ary, WXSTR_TO_RSTR(handler->GetExtension()));
|
71
|
+
const wxArrayString& alt_ext = handler->GetAltExtensions();
|
72
|
+
for (wxArrayString::const_iterator it = alt_ext.begin(); it!=alt_ext.end() ;++it)
|
73
|
+
{
|
74
|
+
rb_ary_push(ext_ary, WXSTR_TO_RSTR((*it)));
|
75
|
+
}
|
76
|
+
}
|
77
|
+
return ext_ary;
|
78
|
+
}
|
79
|
+
|
80
|
+
static VALUE handler_extensions()
|
81
|
+
{
|
82
|
+
VALUE ext_hash = rb_hash_new();
|
83
|
+
wxList& hnd_lst = wxImage::GetHandlers();
|
84
|
+
for (wxList::compatibility_iterator node = hnd_lst.GetFirst();
|
85
|
+
node; node = node->GetNext())
|
86
|
+
{
|
87
|
+
wxImageHandler *handler = (wxImageHandler *) node->GetData();
|
88
|
+
VALUE ext_ary = rb_ary_new();
|
89
|
+
rb_ary_push(ext_ary, WXSTR_TO_RSTR(handler->GetExtension()));
|
90
|
+
const wxArrayString& alt_ext = handler->GetAltExtensions();
|
91
|
+
for (wxArrayString::const_iterator it = alt_ext.begin(); it!=alt_ext.end() ;++it)
|
92
|
+
{
|
93
|
+
rb_ary_push(ext_ary, WXSTR_TO_RSTR((*it)));
|
94
|
+
}
|
95
|
+
wxBitmapType bmp_type = handler->GetType();
|
96
|
+
rb_hash_aset(ext_hash, wxRuby_GetEnumValueObject("wxBitmapType", (int)bmp_type), ext_ary);
|
97
|
+
}
|
98
|
+
return ext_hash;
|
99
|
+
}
|
100
|
+
__HEREDOC
|
46
101
|
# The GetRgbData and GetAlphaData methods require special handling using %extend;
|
47
102
|
spec.ignore %w[wxImage::GetData wxImage::GetAlpha]
|
48
103
|
# The SetRgbData and SetAlphaData are dealt with by typemaps (see below).
|