wxruby3 0.9.0.pre.beta.10 → 0.9.0.pre.beta.11
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.
- checksums.yaml +4 -4
- data/ext/wxruby3/include/wxruby-ScaledDC.h +549 -0
- data/lib/wx/core/data_object.rb +74 -6
- data/lib/wx/core/point.rb +21 -10
- data/lib/wx/core/real_point.rb +21 -10
- data/lib/wx/core/rect.rb +2 -2
- data/lib/wx/core/size.rb +12 -5
- data/lib/wx/doc/data_object.rb +104 -0
- data/lib/wx/doc/gdi_common.rb +33 -5
- data/lib/wx/doc/scaled_dc.rb +16 -0
- data/lib/wx/global_const.rb +4 -3
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/core/package.rb +3 -3
- data/rakelib/lib/core/spec.rb +2 -0
- data/rakelib/lib/director/data_object.rb +94 -0
- data/rakelib/lib/director/data_object_simple_base.rb +123 -0
- data/rakelib/lib/director/derived_dc.rb +38 -0
- data/rakelib/lib/specs/interfaces.rb +2 -0
- data/rakelib/lib/typemap/data_object_data.rb +13 -4
- data/tests/lib/wxapp_runner.rb +64 -0
- data/tests/test_basic.rb +0 -5
- data/tests/test_clipboard.rb +114 -17
- data/tests/test_dialog.rb +2 -13
- data/tests/test_event_handling.rb +2 -13
- data/tests/test_events.rb +2 -6
- data/tests/test_geometry.rb +54 -17
- data/tests/test_intl.rb +2 -15
- data/tests/test_item_data.rb +2 -15
- data/tests/test_variant.rb +1 -15
- data/tests/testapp.rb +0 -5
- data/tests/testapp_noframe.rb +0 -5
- metadata +7 -2
data/lib/wx/core/real_point.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
class Wx::RealPoint
|
2
|
+
|
3
|
+
include Comparable
|
4
|
+
|
2
5
|
# More informative output when converted to string
|
3
6
|
def to_s
|
4
7
|
"#<Wx::RealPoint: (#{x}, #{y})>"
|
@@ -16,23 +19,26 @@ class Wx::RealPoint
|
|
16
19
|
alias :get_x :x
|
17
20
|
alias :get_y :y
|
18
21
|
|
19
|
-
#
|
20
|
-
def
|
21
|
-
if
|
22
|
+
# Correct comparison for RealPoints - same if same x and y
|
23
|
+
def eql?(other)
|
24
|
+
if other.instance_of?(self.class)
|
22
25
|
x == other.x and y == other.y
|
23
|
-
elsif Array === other && other.size == 2
|
24
|
-
to_ary == other
|
25
26
|
else
|
26
|
-
|
27
|
+
false
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
def hash
|
32
|
+
to_ary.hash
|
33
|
+
end
|
34
|
+
|
35
|
+
def <=>(other)
|
32
36
|
if Wx::RealPoint === other
|
33
|
-
x
|
37
|
+
(x*y) <=> (other.x*other.y)
|
38
|
+
elsif Array === other && other.size == 2
|
39
|
+
(x*y) <=> (other.first.to_f*other.last.to_f)
|
34
40
|
else
|
35
|
-
|
41
|
+
nil
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
@@ -89,4 +95,9 @@ class Wx::RealPoint
|
|
89
95
|
end
|
90
96
|
end
|
91
97
|
end
|
98
|
+
|
99
|
+
|
100
|
+
def to_point
|
101
|
+
Wx::Point.new(self.x.to_i, self.y.to_i)
|
102
|
+
end
|
92
103
|
end
|
data/lib/wx/core/rect.rb
CHANGED
@@ -23,12 +23,12 @@ class Wx::Rect
|
|
23
23
|
elsif Array === other && other.size == 4
|
24
24
|
to_ary == other
|
25
25
|
else
|
26
|
-
|
26
|
+
false
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def eql?(other)
|
31
|
-
if
|
31
|
+
if other.instance_of?(self.class)
|
32
32
|
left == other.left and top == other.top and
|
33
33
|
width == other.width and height == other.height
|
34
34
|
else
|
data/lib/wx/core/size.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
class Wx::Size
|
2
|
+
|
3
|
+
include Comparable
|
4
|
+
|
2
5
|
# More informative output for inspect etc
|
3
6
|
def to_s
|
4
7
|
"#<Wx::Size: #{width}x#{height}>"
|
@@ -14,24 +17,28 @@ class Wx::Size
|
|
14
17
|
end
|
15
18
|
|
16
19
|
# Compare with another size value
|
17
|
-
def
|
20
|
+
def <=>(other)
|
18
21
|
if Wx::Size === other
|
19
|
-
width
|
22
|
+
(width*height) <=> (other.width*other.height)
|
20
23
|
elsif Array === other and other.size == 2
|
21
|
-
|
24
|
+
(width*height) <=> (other.first*other.last)
|
22
25
|
else
|
23
|
-
|
26
|
+
nil
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
30
|
def eql?(other)
|
28
|
-
if
|
31
|
+
if other.instance_of?(self.class)
|
29
32
|
width == other.width and height == other.height
|
30
33
|
else
|
31
34
|
false
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
38
|
+
def hash
|
39
|
+
to_ary.hash
|
40
|
+
end
|
41
|
+
|
35
42
|
# Return a new Wx::Size with the width and height values both divided
|
36
43
|
# by parameter +num+, which should be a Numeric
|
37
44
|
def /(num)
|
@@ -0,0 +1,104 @@
|
|
1
|
+
|
2
|
+
module Wx
|
3
|
+
|
4
|
+
class DataObject
|
5
|
+
|
6
|
+
# Returns the data size of the given format.
|
7
|
+
# Should be overridden in derived classes.
|
8
|
+
# @note **IMPORTANT** Please note that it is necessary to return the **size in bytes** of the data string
|
9
|
+
# returned by #get_data_here (not the size in characters).
|
10
|
+
# @param format [Wx::DataFormat]
|
11
|
+
# @return [Integer]
|
12
|
+
def get_data_size(format) end
|
13
|
+
alias_method :data_size, :get_data_size
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
# This is an (abstract in Ruby) base class for the simplest possible custom data objects.
|
18
|
+
# Unlike in C++ in Ruby this class cannot be used to derive custom data objects from but
|
19
|
+
# instead {Wx::DataObjectSimpleBase} (derived from Wx::DataObjectSimple) should be used.
|
20
|
+
# The data object of (a class derived from) this class only supports <b>one format</b>,
|
21
|
+
# so the number of virtual functions to be implemented is reduced.
|
22
|
+
# This class is the base class for {Wx::TextDataObject}, {Wx::FileDataObject}, {Wx::BitmapDataObject},
|
23
|
+
# {Wx::wxCustomDataObject} and others.
|
24
|
+
# ===
|
25
|
+
#
|
26
|
+
# Category: Clipboard and Drag & Drop
|
27
|
+
# @see Drag and Drop Overview
|
28
|
+
# @see Drag & Drop Sample
|
29
|
+
class DataObjectSimple < DataObject
|
30
|
+
|
31
|
+
# @overload get_data_size(format)
|
32
|
+
# Returns the data size of the format for this object.
|
33
|
+
# @param [Wx::DataFormat] format ignored for this class
|
34
|
+
# @return [Integer] default always returns 0
|
35
|
+
# @overload get_data_size()
|
36
|
+
# Returns the data size of the format for this object.
|
37
|
+
# @return [Integer] default always returns 0
|
38
|
+
def get_data_size(*) end
|
39
|
+
|
40
|
+
# @overload get_data_here(format)
|
41
|
+
# Returns the data of this object.
|
42
|
+
# @param [Wx::DataFormat] format ignored for this class
|
43
|
+
# @return [String,nil] data of this object
|
44
|
+
# @overload get_data_here()
|
45
|
+
# Returns the data of this object.
|
46
|
+
# @return [String,nil] data of this object
|
47
|
+
def get_data_here(*) end
|
48
|
+
|
49
|
+
# @overload set_data(format, buf)
|
50
|
+
# Sets the data for this object and returns true if successful, false otherwise.
|
51
|
+
# @param [Wx::DataFormat] format ignored for this class
|
52
|
+
# @param [String] buf non-nil data
|
53
|
+
# @return [Boolean] default always returns false.
|
54
|
+
# @overload set_data(buf)
|
55
|
+
# Sets the data for this object and returns true if successful, false otherwise.
|
56
|
+
# @param [String] buf non-nil data
|
57
|
+
# @return [Boolean] default always returns false.
|
58
|
+
def set_data(*) end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
# This is the base class for the simplest possible custom data objects.
|
63
|
+
# The data object of (a class derived from) this class only supports <b>one format</b>,
|
64
|
+
# so the number of methods to be implemented is reduced.
|
65
|
+
# To be useful it must be derived. Derived objects supporting rendering the data must
|
66
|
+
# override {Wx::DataObjectSimpleBase#_get_data_size} and {Wx::DataObjectSimpleBase#_get_data}.
|
67
|
+
# By default these methods respectively return <code>0</code> and <code>nil</code>.
|
68
|
+
# The objects which may be set must override {Wx::DataObjectSimpleBase#_set_data} (which
|
69
|
+
# returns <code>false</code>).
|
70
|
+
# Of course, the objects supporting both operations must override all three methods.
|
71
|
+
# ===
|
72
|
+
#
|
73
|
+
# Category: Clipboard and Drag & Drop
|
74
|
+
# @see Drag and Drop Overview
|
75
|
+
# @see Drag & Drop Sample
|
76
|
+
# @see Wx::DataObjectSimple
|
77
|
+
class DataObjectSimpleBase < DataObjectSimple
|
78
|
+
|
79
|
+
# Returns this object's data size.
|
80
|
+
# The default implementation calls #_get_data and determines the size of the returned data string (if any).
|
81
|
+
# As this is not very optimal for more complex (and larger data objects) very often this method will be
|
82
|
+
# overridden in derived classes.
|
83
|
+
# @note **IMPORTANT** Please note that it is necessary to return the **size in bytes** of the data string
|
84
|
+
# returned by #_get_data (not the size in characters).
|
85
|
+
# @return [Integer]
|
86
|
+
def _get_data_size; end
|
87
|
+
protected :_get_data_size
|
88
|
+
|
89
|
+
# Returns this object's data (default implementation returns nil).
|
90
|
+
# Should be overridden in derived classes.
|
91
|
+
# @return [String,nil]
|
92
|
+
def _get_data; end
|
93
|
+
protected :_get_data
|
94
|
+
|
95
|
+
# Sets this object's data (default implementation does nothing and returns false).
|
96
|
+
# Should be overridden in derived classes.
|
97
|
+
# @param [String] buf non-nil data
|
98
|
+
# @return [Boolean]
|
99
|
+
def _set_data(buf); end
|
100
|
+
protected :_set_data
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
data/lib/wx/doc/gdi_common.rb
CHANGED
@@ -56,20 +56,27 @@ module Wx
|
|
56
56
|
|
57
57
|
class Point
|
58
58
|
|
59
|
+
include Comparable
|
60
|
+
|
59
61
|
# Returns point array (`[x, y]`)
|
60
62
|
# @return [Array(Integer,Integer)] point as array
|
61
63
|
def to_ary; end
|
62
64
|
|
63
|
-
# Compare point values (Wx::Point or point array).
|
65
|
+
# Compare point values (Wx::Point or point array). Returns -1,0 or 1 to indicate if this point
|
66
|
+
# is smaller, equal or greater than other (comparing <code>x*y</code> with <code>other.x*other.y</code>).
|
67
|
+
# Returns nil if incompatible.
|
64
68
|
# @param [Wx::Point,Array(Integer,Integer)] other
|
65
|
-
# @return [Boolean]
|
66
|
-
def
|
69
|
+
# @return [Boolean,nil]
|
70
|
+
def <=>(other)end
|
67
71
|
|
68
72
|
# Compare points.
|
69
73
|
# @param [Wx::Point] other
|
70
74
|
# @return [Boolean]
|
71
75
|
def eql?(other)end
|
72
76
|
|
77
|
+
# Returns hash for point
|
78
|
+
def hash; end
|
79
|
+
|
73
80
|
# Return a new Wx::Point with the x and y parameters both divided by
|
74
81
|
# parameter +num+, which should be a Numeric
|
75
82
|
# @param [Numeric] num
|
@@ -97,11 +104,18 @@ module Wx
|
|
97
104
|
# @param [Wx::Point,Wx::Size,Array(Integer,Integer),Numeric] arg
|
98
105
|
# @return [Wx::Point]
|
99
106
|
def +(arg) end
|
100
|
-
|
107
|
+
|
108
|
+
# Converts point to Wx::RealPoint
|
109
|
+
# @return [Wx::RealPoint] Wx::RealPoint instance from point coordinates
|
110
|
+
def to_real_point; end
|
111
|
+
alias :to_real :to_real_point
|
112
|
+
|
101
113
|
end
|
102
114
|
|
103
115
|
class RealPoint
|
104
116
|
|
117
|
+
include Comparable
|
118
|
+
|
105
119
|
# Returns point array (`[x, y]`)
|
106
120
|
# @return [Array(Float,Float)] point as array
|
107
121
|
def to_ary; end
|
@@ -111,11 +125,21 @@ module Wx
|
|
111
125
|
# @return [Boolean]
|
112
126
|
def ==(other)end
|
113
127
|
|
128
|
+
# Compare point values (Wx::RealPoint or point array). Returns -1,0 or 1 to indicate if this point
|
129
|
+
# is smaller, equal or greater than other (comparing <code>x*y</code> with <code>other.x*other.y</code>).
|
130
|
+
# Returns nil if incompatible.
|
131
|
+
# @param [Wx::RealPoint,Array(Float,Float)] other
|
132
|
+
# @return [Boolean,nil]
|
133
|
+
def <=>(other)end
|
134
|
+
|
114
135
|
# Compare points.
|
115
136
|
# @param [Wx::RealPoint] other
|
116
137
|
# @return [Boolean]
|
117
138
|
def eql?(other)end
|
118
139
|
|
140
|
+
# Returns hash for point
|
141
|
+
def hash; end
|
142
|
+
|
119
143
|
# Return a new Wx::RealPoint with the x and y parameters both divided by
|
120
144
|
# parameter +num+, which should be a Numeric
|
121
145
|
# @param [Numeric] num
|
@@ -144,6 +168,10 @@ module Wx
|
|
144
168
|
# @return [Wx::RealPoint]
|
145
169
|
def +(arg) end
|
146
170
|
|
171
|
+
# Converts real point to Wx::Point
|
172
|
+
# @return [Wx::Point] Wx::Point instance from real point coordinates
|
173
|
+
def to_point; end
|
174
|
+
|
147
175
|
end
|
148
176
|
|
149
177
|
class Rect
|
@@ -152,7 +180,7 @@ module Wx
|
|
152
180
|
# @return [Array(Integer,Integer,Integer,Integer)] rect as array
|
153
181
|
def to_ary; end
|
154
182
|
|
155
|
-
# Compare area values (Wx::Rect or 4-element array).
|
183
|
+
# Compare area values (Wx::Rect or 4-element array). Returns false if incompatible.
|
156
184
|
# @param [Wx::Rect,Array(Integer,Integer,Integer,Integer)] other
|
157
185
|
# @return [Boolean]
|
158
186
|
def ==(other)end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
class Wx
|
3
|
+
|
4
|
+
class ScaledDC < Wx::DC
|
5
|
+
|
6
|
+
private :initialize
|
7
|
+
|
8
|
+
# Creates a Wx::ScaledDC instance for target and scale and
|
9
|
+
# passes the instance to the given block to draw on.
|
10
|
+
# @param [Wx::DC] target DC to draw on (scaled)
|
11
|
+
# @param [Float] scale scale factor
|
12
|
+
# @yieldparam [Wx::ScaledDC] dc scaled dc to draw on
|
13
|
+
def self.draw_on(target, scale) end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/wx/global_const.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
module WxGlobalConstants
|
5
5
|
|
6
6
|
class << self
|
7
|
-
def search_nested(mod, sym)
|
7
|
+
def search_nested(mod, sym, path = [])
|
8
8
|
# check any nested modules and/or (enum) classes
|
9
9
|
const_val = nil
|
10
10
|
mod.constants.each do |c|
|
@@ -16,11 +16,12 @@ module WxGlobalConstants
|
|
16
16
|
elsif cv.name.start_with?('Wx::') # only search Wx namespace
|
17
17
|
# prevent const_missing being triggered here since that may lead to unexpected results
|
18
18
|
const_val = cv.const_get(sym) if cv.constants.include?(sym)
|
19
|
-
const_val = search_nested(cv, sym) unless const_val
|
19
|
+
const_val = search_nested(cv, sym, path+[mod]) unless const_val || path.include?(cv)
|
20
20
|
end
|
21
21
|
when ::Module
|
22
22
|
if cv.name.start_with?('Wx::') # only search Wx namespace
|
23
|
-
const_val = cv.const_get(sym)
|
23
|
+
const_val = cv.const_get(sym) if cv.constants.include?(sym)
|
24
|
+
const_val = search_nested(cv, sym, path+[mod]) unless const_val || path.include?(cv)
|
24
25
|
end
|
25
26
|
end unless mod == cv # watch out for infinite recursion
|
26
27
|
break if const_val
|
data/lib/wx/version.rb
CHANGED
data/rakelib/lib/core/package.rb
CHANGED
@@ -208,7 +208,7 @@ module WXRuby3
|
|
208
208
|
# next initialize all modules without classes (keeping only those with classes)
|
209
209
|
inc_dirs.select! do |dir|
|
210
210
|
modreg = Spec.module_registry[dir.spec.module_name]
|
211
|
-
if modreg.nil? || modreg.empty?
|
211
|
+
if !dir.spec.initialize_at_end && (modreg.nil? || modreg.empty?)
|
212
212
|
init = "Init_#{dir.spec.module_name}()"
|
213
213
|
decls << "extern \"C\" void #{init};"
|
214
214
|
init_fn << " #{init};"
|
@@ -222,7 +222,7 @@ module WXRuby3
|
|
222
222
|
cls_set = ::Set.new
|
223
223
|
inc_dirs.select! do |dir|
|
224
224
|
modreg = Spec.module_registry[dir.spec.module_name]
|
225
|
-
if modreg && !modreg.empty? && modreg.values.all? {|base| base.nil? || modreg.has_key?(base) }
|
225
|
+
if !dir.spec.initialize_at_end && modreg && !modreg.empty? && modreg.values.all? {|base| base.nil? || modreg.has_key?(base) }
|
226
226
|
cls_set.merge modreg.keys # remember classes
|
227
227
|
init = "Init_#{dir.spec.module_name}()"
|
228
228
|
decls << "extern \"C\" void #{init};"
|
@@ -235,7 +235,7 @@ module WXRuby3
|
|
235
235
|
|
236
236
|
# next initialize all modules with classes depending (bases AND mixins) on classes in any modules already
|
237
237
|
# selected until there are no more modules left or none that are left depend on any selected ones
|
238
|
-
while dir_inx = inc_dirs.find_index { |dir| is_dir_with_fulfilled_deps?(dir, cls_set) }
|
238
|
+
while dir_inx = inc_dirs.find_index { |dir| !dir.spec.initialize_at_end && is_dir_with_fulfilled_deps?(dir, cls_set) }
|
239
239
|
dir = inc_dirs[dir_inx]
|
240
240
|
modreg = Spec.module_registry[dir.spec.module_name]
|
241
241
|
cls_set.merge modreg.keys # remember classes
|
data/rakelib/lib/core/spec.rb
CHANGED
@@ -77,6 +77,7 @@ module WXRuby3
|
|
77
77
|
@post_processors = processors || [:rename, :fixmodule, :fix_protected_access]
|
78
78
|
@requirements = [requirements].flatten
|
79
79
|
@type_maps = Typemap::Collection.new
|
80
|
+
@initialize_at_end = false
|
80
81
|
end
|
81
82
|
|
82
83
|
attr_reader :director, :package, :module_name, :name, :items, :folded_bases, :ignores, :regards, :readonly, :contracts, :event_overrides,
|
@@ -85,6 +86,7 @@ module WXRuby3
|
|
85
86
|
:runtime_code, :header_code, :wrapper_code, :extend_code, :init_code, :interface_code,
|
86
87
|
:nogen_sections, :post_processors, :requirements, :type_maps
|
87
88
|
attr_writer :interface_file
|
89
|
+
attr_accessor :initialize_at_end
|
88
90
|
|
89
91
|
def interface_file
|
90
92
|
@interface_file || File.join(Config.instance.classes_path, @name + '.i')
|
@@ -56,9 +56,103 @@ module WXRuby3
|
|
56
56
|
# Once a DataObject has been added, it belongs to the wxDataObjectComposite object,
|
57
57
|
# and will be freed by it on destruction.
|
58
58
|
spec.disown 'wxDataObjectSimple* dataObject'
|
59
|
+
|
60
|
+
# Add GC management for the DataObjectSimple instances added to a DataObjectComposite instance.
|
61
|
+
spec.add_header_code <<~__HEREDOC
|
62
|
+
#include <vector>
|
63
|
+
#include <map>
|
64
|
+
|
65
|
+
typedef std::vector<VALUE> data_object_list_t;
|
66
|
+
typedef std::map<wxDataObjectComposite*, data_object_list_t> composite_data_object_map_t;
|
67
|
+
static composite_data_object_map_t CompositeDataObject_Map;
|
68
|
+
|
69
|
+
static void wxRuby_markCompositeDataObjects()
|
70
|
+
{
|
71
|
+
composite_data_object_map_t::iterator it;
|
72
|
+
for( it = CompositeDataObject_Map.begin(); it != CompositeDataObject_Map.end(); ++it )
|
73
|
+
{
|
74
|
+
data_object_list_t &do_list = it->second;
|
75
|
+
for (VALUE data_obj : do_list)
|
76
|
+
{
|
77
|
+
#ifdef __WXRB_DEBUG__
|
78
|
+
if (wxRuby_TraceLevel()>1)
|
79
|
+
{
|
80
|
+
void *c_ptr = (TYPE(data_obj) == T_DATA ? DATA_PTR(data_obj) : 0);
|
81
|
+
std::wcout << "**** wxRuby_markCompositeDataObjects : " << it->first << "|" << (void*)c_ptr << std::endl;
|
82
|
+
}
|
83
|
+
#endif
|
84
|
+
rb_gc_mark(data_obj);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
// custom implementation for wxRuby so we can handle de-registering composites
|
90
|
+
class WxRuby_DataObjectComposite : public wxDataObjectComposite
|
91
|
+
{
|
92
|
+
public:
|
93
|
+
WxRuby_DataObjectComposite() : wxDataObjectComposite() {}
|
94
|
+
virtual ~WxRuby_DataObjectComposite()
|
95
|
+
{
|
96
|
+
CompositeDataObject_Map.erase(this);
|
97
|
+
}
|
98
|
+
};
|
99
|
+
__HEREDOC
|
100
|
+
# install GC marker
|
101
|
+
spec.add_init_code 'wxRuby_AppendMarker(wxRuby_markCompositeDataObjects);'
|
102
|
+
# use custom implementation class
|
103
|
+
spec.use_class_implementation 'wxDataObjectComposite', 'WxRuby_DataObjectComposite'
|
104
|
+
|
105
|
+
# disable generating the default Add method (keep docs)
|
106
|
+
spec.ignore 'wxDataObjectComposite::Add', ignore_doc: false
|
107
|
+
# Add custom Add implementation
|
108
|
+
spec.add_extend_code 'wxDataObjectComposite', <<~__HEREDOC
|
109
|
+
void add(VALUE rb_dataObject, bool preferred=false)
|
110
|
+
{
|
111
|
+
// convert simple object
|
112
|
+
wxDataObjectSimple *simple_do;
|
113
|
+
int res = SWIG_ConvertPtr(rb_dataObject, SWIG_as_voidptrptr(&simple_do), SWIGTYPE_p_wxDataObjectSimple, SWIG_POINTER_DISOWN);
|
114
|
+
if (!SWIG_IsOK(res))
|
115
|
+
{
|
116
|
+
rb_raise(rb_eArgError, "Expected Wx::DataObjectSimple for 1");
|
117
|
+
}
|
118
|
+
|
119
|
+
// add new simple instance to registration for this composite
|
120
|
+
CompositeDataObject_Map[$self].push_back(rb_dataObject);
|
121
|
+
|
122
|
+
// add to composite
|
123
|
+
$self->Add(simple_do);
|
124
|
+
}
|
125
|
+
__HEREDOC
|
126
|
+
|
59
127
|
end
|
60
128
|
end # class DataObject
|
61
129
|
|
130
|
+
def doc_generator
|
131
|
+
DataObjectDocGenerator.new(self)
|
132
|
+
end
|
133
|
+
|
62
134
|
end # class Director
|
63
135
|
|
136
|
+
class DataObjectDocGenerator < DocGenerator
|
137
|
+
|
138
|
+
def get_class_doc(clsdef)
|
139
|
+
if clsdef.name == 'wxDataObjectSimple'
|
140
|
+
[]
|
141
|
+
else
|
142
|
+
super
|
143
|
+
end
|
144
|
+
end
|
145
|
+
protected :get_class_doc
|
146
|
+
|
147
|
+
def get_method_doc(mtd)
|
148
|
+
if Extractor::MethodDef === mtd && mtd.class_name == 'wxDataObject' && mtd.name == 'GetDataSize'
|
149
|
+
{}
|
150
|
+
else
|
151
|
+
super
|
152
|
+
end
|
153
|
+
end
|
154
|
+
protected :get_method_doc
|
155
|
+
|
156
|
+
end
|
157
|
+
|
64
158
|
end # module WXRuby3
|
@@ -0,0 +1,123 @@
|
|
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 DataObjectSimpleBase < Director
|
11
|
+
|
12
|
+
include Typemap::DataFormat
|
13
|
+
include Typemap::DataObjectData
|
14
|
+
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
spec.items.clear
|
18
|
+
# insert literal code as #gc_as_xx does not work without parsed class items
|
19
|
+
spec.add_swig_code 'GC_MANAGE_AS_OBJECT(wxDataObjectSimpleBase);'
|
20
|
+
spec.initialize_at_end = true
|
21
|
+
|
22
|
+
spec.swig_import 'ext/wxruby3/swig/classes/include/wxDataObject.h'
|
23
|
+
|
24
|
+
spec.add_header_code <<~__HEREDOC
|
25
|
+
class wxDataObjectSimpleBase : public wxDataObjectSimple
|
26
|
+
{
|
27
|
+
public:
|
28
|
+
wxDataObjectSimpleBase(const wxDataFormat &format=wxFormatInvalid)
|
29
|
+
: wxDataObjectSimple(format) {}
|
30
|
+
virtual ~wxDataObjectSimpleBase() { }
|
31
|
+
|
32
|
+
virtual size_t GetDataSize() const { return _GetDataSize(); }
|
33
|
+
virtual size_t GetDataSize(const wxDataFormat &) const { return _GetDataSize(); }
|
34
|
+
virtual bool GetDataHere(const wxDataFormat &, void *buf) const { return _GetData(buf); }
|
35
|
+
virtual bool GetDataHere(void *data_buffer) const { return _GetData(data_buffer); }
|
36
|
+
virtual bool SetData(const wxDataFormat &, size_t len, const void *buf) { return _SetData(len, buf); }
|
37
|
+
virtual bool SetData(size_t len, const void *buf) { return _SetData(len, buf); }
|
38
|
+
|
39
|
+
protected:
|
40
|
+
virtual size_t _GetDataSize() const { return 0; }
|
41
|
+
virtual bool _GetData(void *data_buffer) const { return false; }
|
42
|
+
virtual bool _SetData(size_t len, const void *buf) { return false; }
|
43
|
+
};
|
44
|
+
__HEREDOC
|
45
|
+
|
46
|
+
spec.add_interface_code <<~__HEREDOC
|
47
|
+
class wxDataObjectSimpleBase : public wxDataObjectSimple
|
48
|
+
{
|
49
|
+
public:
|
50
|
+
wxDataObjectSimpleBase(const wxDataFormat &format=wxFormatInvalid);
|
51
|
+
|
52
|
+
virtual void GetAllFormats(wxDataFormat *formats, Direction dir=Get) const;
|
53
|
+
virtual size_t GetFormatCount(Direction dir=Get) const;
|
54
|
+
virtual wxDataFormat GetPreferredFormat(Direction dir=Get) const;
|
55
|
+
|
56
|
+
protected:
|
57
|
+
virtual size_t _GetDataSize() const;
|
58
|
+
%feature("numoutputs", "0") _GetData;
|
59
|
+
virtual VOID_BOOL _GetData(void *data_buffer) const;
|
60
|
+
virtual bool _SetData(size_t len, const void *buf);
|
61
|
+
};
|
62
|
+
__HEREDOC
|
63
|
+
|
64
|
+
# For wxDataObjectSimpleBase::GetDataHere/_GetData : the ruby method should
|
65
|
+
# return either a string containing the
|
66
|
+
# data, or nil if the data cannot be provided for some reason.
|
67
|
+
spec.map 'void *data_buffer' do
|
68
|
+
|
69
|
+
map_in ignore: true, code: ''
|
70
|
+
|
71
|
+
# "misuse" the 'check' typemap to initialize the ignored argument
|
72
|
+
# since this is inserted after any non-ignored arguments have been converted we can use these
|
73
|
+
# here
|
74
|
+
map_check temp: 'std::unique_ptr<char[]> data_buf, size_t data_size', code: <<~__CODE
|
75
|
+
data_size = arg1->GetDataSize();
|
76
|
+
data_buf = std::make_unique<char[]>(data_size);
|
77
|
+
$1 = data_buf.get ();
|
78
|
+
__CODE
|
79
|
+
|
80
|
+
# ignore C defined return value entirely (also affects directorout)
|
81
|
+
map_out ignore: 'bool'
|
82
|
+
|
83
|
+
map_argout as: {type: 'String', index: 1}, code: <<~__CODE
|
84
|
+
if (result)
|
85
|
+
{
|
86
|
+
$result = rb_utf8_str_new( (const char*)data_buf$argnum.get(), data_size$argnum);
|
87
|
+
}
|
88
|
+
else
|
89
|
+
$result = Qnil;
|
90
|
+
__CODE
|
91
|
+
|
92
|
+
# ignore the buffer pointer for now
|
93
|
+
map_directorin code: ''
|
94
|
+
|
95
|
+
map_directorargout code: <<~__CODE
|
96
|
+
if (RTEST(result))
|
97
|
+
{
|
98
|
+
if (TYPE(result) == T_STRING)
|
99
|
+
{
|
100
|
+
memcpy(data_buffer, StringValuePtr(result), RSTRING_LEN(result) );
|
101
|
+
c_result = true;
|
102
|
+
}
|
103
|
+
else
|
104
|
+
{
|
105
|
+
Swig::DirectorTypeMismatchException::raise(rb_eTypeError,
|
106
|
+
"get_data_here should return a string, or nil on failure");
|
107
|
+
}
|
108
|
+
}
|
109
|
+
else
|
110
|
+
c_result = false;
|
111
|
+
__CODE
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
# Once a DataObject has been added, it belongs to the wxDataObjectComposite object,
|
116
|
+
# and will be freed by it on destruction.
|
117
|
+
# spec.disown 'wxDataObjectSimple* dataObject'
|
118
|
+
end
|
119
|
+
end # class DataObject
|
120
|
+
|
121
|
+
end # class Director
|
122
|
+
|
123
|
+
end # module WXRuby3
|
@@ -52,6 +52,44 @@ module WXRuby3
|
|
52
52
|
'wxSVGFileDC::EndPage'
|
53
53
|
elsif spec.module_name == 'wxGCDC'
|
54
54
|
spec.ignore 'wxGCDC::wxGCDC(const wxEnhMetaFileDC &)'
|
55
|
+
elsif spec.module_name == 'wxScaledDC'
|
56
|
+
spec.items.clear # wxRuby extension; no XML docs
|
57
|
+
spec.override_inheritance_chain('wxScaledDC', %w[wxDC wxObject])
|
58
|
+
# as there are no dependencies parsed from XML make sure we're initialized after Wx::DC
|
59
|
+
spec.initialize_at_end = true
|
60
|
+
spec.gc_as_temporary 'wxScaledDC'
|
61
|
+
spec.no_proxy 'wxScaledDC'
|
62
|
+
spec.include 'wxruby-ScaledDC.h'
|
63
|
+
# wxScaledDc should ever only be used in a restricted scope
|
64
|
+
# to be destructed directly after use therefor we make it abstract
|
65
|
+
# and provide a class factory method #draw_on with accepts a block.
|
66
|
+
# (as we there no classes defined in XML we cannot use add_extend_code
|
67
|
+
# so we use a workaround here)
|
68
|
+
spec.add_swig_code <<~__HEREDOC
|
69
|
+
%extend wxScaledDC {
|
70
|
+
static void draw_on(wxDC& target, double scale)
|
71
|
+
{
|
72
|
+
if (rb_block_given_p())
|
73
|
+
{
|
74
|
+
wxScaledDC scaled_dc(target, scale);
|
75
|
+
wxScaledDC* p_scaled_dc = &scaled_dc;
|
76
|
+
VALUE rb_scaled_dc = SWIG_NewPointerObj(SWIG_as_voidptr(p_scaled_dc), SWIGTYPE_p_wxScaledDC, 0);
|
77
|
+
rb_yield(rb_scaled_dc);
|
78
|
+
}
|
79
|
+
return ;
|
80
|
+
}
|
81
|
+
};
|
82
|
+
__HEREDOC
|
83
|
+
spec.swig_import %w[ext/wxruby3/swig/classes/include/wxObject.h
|
84
|
+
ext/wxruby3/swig/classes/include/wxDC.h]
|
85
|
+
spec.add_interface_code <<~__HEREDOC
|
86
|
+
class wxScaledDC : public wxDC
|
87
|
+
{
|
88
|
+
public:
|
89
|
+
wxScaledDC(wxDC& target, double scale);
|
90
|
+
virtual ~wxScaledDC() = 0;
|
91
|
+
};
|
92
|
+
__HEREDOC
|
55
93
|
else
|
56
94
|
# ctors of all other derived DC require a running App
|
57
95
|
spec.require_app spec.module_name
|