wxruby3 0.9.0.pre.beta.10 → 0.9.0.pre.beta.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|