wxruby3-shapes 0.9.0.pre.beta.3

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.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +12 -0
  3. data/CREDITS.md +18 -0
  4. data/INSTALL.md +39 -0
  5. data/LICENSE +21 -0
  6. data/README.md +118 -0
  7. data/assets/screenshot.png +0 -0
  8. data/bin/wx-shapes +9 -0
  9. data/lib/wx/shapes/arrow_base.rb +86 -0
  10. data/lib/wx/shapes/arrows/circle_arrow.rb +39 -0
  11. data/lib/wx/shapes/arrows/diamond_arrow.rb +33 -0
  12. data/lib/wx/shapes/arrows/open_arrow.rb +56 -0
  13. data/lib/wx/shapes/arrows/solid_arrow.rb +69 -0
  14. data/lib/wx/shapes/art/shape_canvas/page.xpm +73 -0
  15. data/lib/wx/shapes/auto_layout.rb +358 -0
  16. data/lib/wx/shapes/base.rb +33 -0
  17. data/lib/wx/shapes/canvas_history.rb +84 -0
  18. data/lib/wx/shapes/connection_point.rb +238 -0
  19. data/lib/wx/shapes/core.rb +19 -0
  20. data/lib/wx/shapes/diagram.rb +659 -0
  21. data/lib/wx/shapes/events.rb +389 -0
  22. data/lib/wx/shapes/printout.rb +136 -0
  23. data/lib/wx/shapes/serializable.rb +440 -0
  24. data/lib/wx/shapes/serialize/core.rb +40 -0
  25. data/lib/wx/shapes/serialize/id.rb +82 -0
  26. data/lib/wx/shapes/serialize/wx.rb +104 -0
  27. data/lib/wx/shapes/serializer/json.rb +258 -0
  28. data/lib/wx/shapes/serializer/yaml.rb +125 -0
  29. data/lib/wx/shapes/shape.rb +2129 -0
  30. data/lib/wx/shapes/shape_canvas.rb +3285 -0
  31. data/lib/wx/shapes/shape_data_object.rb +43 -0
  32. data/lib/wx/shapes/shape_handle.rb +287 -0
  33. data/lib/wx/shapes/shape_list.rb +161 -0
  34. data/lib/wx/shapes/shapes/bitmap_shape.rb +257 -0
  35. data/lib/wx/shapes/shapes/circle_shape.rb +136 -0
  36. data/lib/wx/shapes/shapes/control_shape.rb +483 -0
  37. data/lib/wx/shapes/shapes/curve_shape.rb +231 -0
  38. data/lib/wx/shapes/shapes/diamond_shape.rb +62 -0
  39. data/lib/wx/shapes/shapes/edit_text_shape.rb +317 -0
  40. data/lib/wx/shapes/shapes/ellipse_shape.rb +106 -0
  41. data/lib/wx/shapes/shapes/flex_grid_shape.rb +78 -0
  42. data/lib/wx/shapes/shapes/grid_shape.rb +404 -0
  43. data/lib/wx/shapes/shapes/line_shape.rb +907 -0
  44. data/lib/wx/shapes/shapes/multi_sel_rect.rb +214 -0
  45. data/lib/wx/shapes/shapes/ortho_shape.rb +357 -0
  46. data/lib/wx/shapes/shapes/polygon_shape.rb +294 -0
  47. data/lib/wx/shapes/shapes/rect_shape.rb +378 -0
  48. data/lib/wx/shapes/shapes/round_ortho_shape.rb +131 -0
  49. data/lib/wx/shapes/shapes/round_rect_shape.rb +142 -0
  50. data/lib/wx/shapes/shapes/square_shape.rb +119 -0
  51. data/lib/wx/shapes/shapes/text_shape.rb +324 -0
  52. data/lib/wx/shapes/thumbnail.rb +234 -0
  53. data/lib/wx/shapes/version.rb +12 -0
  54. data/lib/wx/shapes/wx.rb +29 -0
  55. data/lib/wx/shapes.rb +18 -0
  56. data/lib/wx/wx-shapes/base.rb +87 -0
  57. data/lib/wx/wx-shapes/cmd/sampler.rb +58 -0
  58. data/lib/wx/wx-shapes/cmd/test.rb +27 -0
  59. data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +7 -0
  60. data/rakelib/yard/templates/default/layout/html/setup.rb +5 -0
  61. data/rakelib/yard/yard/relative_markdown_links/version.rb +8 -0
  62. data/rakelib/yard/yard/relative_markdown_links.rb +39 -0
  63. data/rakelib/yard/yard-custom-templates.rb +2 -0
  64. data/rakelib/yard/yard-relative_markdown_links.rb +4 -0
  65. data/samples/demo/art/AlignBottom.xpm +35 -0
  66. data/samples/demo/art/AlignCenter.xpm +35 -0
  67. data/samples/demo/art/AlignLeft.xpm +35 -0
  68. data/samples/demo/art/AlignMiddle.xpm +35 -0
  69. data/samples/demo/art/AlignRight.xpm +35 -0
  70. data/samples/demo/art/AlignTop.xpm +35 -0
  71. data/samples/demo/art/Bitmap.xpm +25 -0
  72. data/samples/demo/art/Circle.xpm +22 -0
  73. data/samples/demo/art/Curve.xpm +21 -0
  74. data/samples/demo/art/Diamond.xpm +22 -0
  75. data/samples/demo/art/EditText.xpm +21 -0
  76. data/samples/demo/art/Ellipse.xpm +22 -0
  77. data/samples/demo/art/FixedRect.xpm +22 -0
  78. data/samples/demo/art/FlexGrid.xpm +22 -0
  79. data/samples/demo/art/GC.xpm +23 -0
  80. data/samples/demo/art/Grid.xpm +22 -0
  81. data/samples/demo/art/Line.xpm +21 -0
  82. data/samples/demo/art/NoSource.xpm +69 -0
  83. data/samples/demo/art/OrthoLine.xpm +21 -0
  84. data/samples/demo/art/Rect.xpm +22 -0
  85. data/samples/demo/art/RoundOrthoLine.xpm +21 -0
  86. data/samples/demo/art/RoundRect.xpm +22 -0
  87. data/samples/demo/art/Shadow.xpm +23 -0
  88. data/samples/demo/art/StandAloneLine.xpm +22 -0
  89. data/samples/demo/art/Text.xpm +21 -0
  90. data/samples/demo/art/Tool.xpm +23 -0
  91. data/samples/demo/art/sample.xpm +251 -0
  92. data/samples/demo/demo.rb +658 -0
  93. data/samples/demo/frame_canvas.rb +422 -0
  94. data/samples/demo/images/motyl.bmp +0 -0
  95. data/samples/demo/images/motyl2.bmp +0 -0
  96. data/samples/sample1/art/sample.xpm +251 -0
  97. data/samples/sample1/sample.rb +263 -0
  98. data/samples/sample2/art/sample.xpm +251 -0
  99. data/samples/sample2/sample.rb +133 -0
  100. data/samples/sample2/sample_canvas.rb +35 -0
  101. data/samples/sample2/sample_shape.rb +108 -0
  102. data/samples/sample3/art/sample.xpm +251 -0
  103. data/samples/sample3/sample.rb +281 -0
  104. data/samples/sample4/art/sample.xpm +251 -0
  105. data/samples/sample4/sample.rb +180 -0
  106. data/tests/art/motyl.bmp +0 -0
  107. data/tests/lib/wxapp_runner.rb +64 -0
  108. data/tests/serializer_tests.rb +521 -0
  109. data/tests/test_grid_shapes.rb +42 -0
  110. data/tests/test_serialize.rb +7 -0
  111. data/tests/test_serialize_yaml.rb +17 -0
  112. metadata +242 -0
@@ -0,0 +1,257 @@
1
+ # Wx::SF::BitmapShape - Bitmap shape class
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes/shapes/rect_shape'
5
+ require 'pathname'
6
+
7
+ module Wx::SF
8
+
9
+ # Class encapsulating the bitmap shape. The shape can display and control
10
+ # files stored in formats supported by Wx::Bitmap class loaded from a file or created
11
+ # from XPM image.
12
+ class BitmapShape < RectShape
13
+
14
+ property :can_scale, :bitmap
15
+
16
+ # @overload initialize()
17
+ # Default constructor.
18
+ # @overload initialize(pos, bmp_path, diagram)
19
+ # User constructor.
20
+ # @param [Wx::RealPoint] pos Initial position
21
+ # @param [String] bmp_path Bitmap path
22
+ # @param [Wx::SF::Diagram] diagram parent diagram
23
+ def initialize(*args)
24
+ @bitmap = Wx::NULL_BITMAP
25
+ @art_path = @art_section = nil
26
+ if args.empty?
27
+ super
28
+ @bitmap_path = nil
29
+ @original_bitmap = @bitmap = nil
30
+ @bitmap_type = nil
31
+ else
32
+ pos, bmp_path, diagram = args
33
+ super(pos, RectShape::DEFAULT::SIZE.dup, diagram)
34
+ create_from_file(bmp_path)
35
+ end
36
+ @rescale_in_progress = false
37
+ @can_scale = true
38
+ end
39
+
40
+ # Get full name of a source BMP file.
41
+ # @return [String] String containing full file name
42
+ def get_bitmap_path
43
+ @bitmap_path
44
+ end
45
+
46
+ # Enable/disable scaling mode of the bitmap.
47
+ # @param [Boolean] canscale Set true if the bitmap shape could be scaled
48
+ def enable_scale(canscale)
49
+ @can_scale = canscale
50
+ end
51
+ alias :set_can_scale :enable_scale
52
+
53
+ # Get information about the possibility of the shape scaling.
54
+ # @return [Boolean] true if the shape can be scaled, otherwise false
55
+ def can_scale?
56
+ @can_scale
57
+ end
58
+ alias :get_can_scale :can_scale?
59
+
60
+ # Load a bitmap from the file.
61
+ # @param [String,Symbol] file File name (absolute or relative) or base name for art file (for Wx::ArtLocator)
62
+ # @param [Wx::BitmapType,nil] type Bitmap type (see the wxBitmap class reference)
63
+ # @param [String] art_path base path to look up the art file for Wx::ArtLocator
64
+ # @param [String,nil] art_section optional owner folder name for art files for Wx::ArtLocator
65
+ # @return [Boolean] true on success, otherwise false
66
+ # @see Wx::ArtLocator
67
+ def create_from_file(file, type = nil, art_path: nil, art_section: nil)
68
+ # load bitmap from the file
69
+ @bitmap_path = file
70
+ @bitmap_type = type
71
+ if File.file?(@bitmap_path.to_s)
72
+ @bitmap = Wx::Bitmap.new
73
+ success = @bitmap.load_file(@bitmap_path, type ? type : Wx::BITMAP_TYPE_ANY)
74
+ else
75
+ art_path ||= File.dirname(caller_locations(1).first.absolute_path)
76
+ art_section ||= File.basename(caller_locations(1).first.absolute_path, '.*')
77
+ path = Wx::ArtLocator.find_art(@bitmap_path, art_path: art_path, art_section: art_section, art_type: :bitmap, bmp_type: type)
78
+ if path
79
+ @bitmap = Wx::Bitmap.new
80
+ success = @bitmap.load_file(path, type ? type : Wx::BITMAP_TYPE_ANY)
81
+ if success
82
+ p = Pathname.new(art_path)
83
+ @art_path = p.relative? ? art_path : p.relative_path_from(Dir.getwd).to_s
84
+ @art_section = art_section
85
+ end
86
+ else
87
+ @bitmap = nil
88
+ success = false
89
+ end
90
+ end
91
+
92
+ @original_bitmap = @bitmap
93
+
94
+ if success
95
+ @rect_size.x = @bitmap.width
96
+ @rect_size.y = @bitmap.height
97
+
98
+ if @can_scale
99
+ add_style(Shape::STYLE::SIZE_CHANGE)
100
+ else
101
+ remove_style(Shape::STYLE::SIZE_CHANGE)
102
+ end
103
+ end
104
+
105
+ success
106
+ end
107
+
108
+ # Event handler called during dragging of the shape handle. The function can be overridden if necessary.
109
+ # @param [Shape::Handle] handle Reference to the dragged shape handle
110
+ def on_handle(handle)
111
+ if @can_scale
112
+ super
113
+ else
114
+ remove_style(STYLE::SIZE_CHANGE)
115
+ end
116
+ end
117
+
118
+ # Event handler called when the user finished dragging of the shape handle. The function can be overridden if necessary.
119
+ # @param [Shape::Handle] handle Reference to the dragged shape handle
120
+ def on_end_handle(handle)
121
+ if @can_scale
122
+ @rescale_in_progress = false
123
+ rescale_image(@rect_size)
124
+ end
125
+
126
+ super
127
+ end
128
+
129
+ protected
130
+
131
+ # Event handler called by ShapeCanvas to request,report canvas changes.
132
+ # @param [ShapeCanvas::CHANGE] change change type indicator
133
+ # @param [Array] _args any additional arguments
134
+ # @return [Boolean,nil]
135
+ def _on_canvas(change, *_args)
136
+ if change == ShapeCanvas::CHANGE::RESCALED
137
+ self.scale(1, 1)
138
+ end
139
+ super
140
+ end
141
+
142
+ # Handle action at handle drag beginning
143
+ def do_begin_handle
144
+ if @can_scale
145
+ @rescale_in_progress = true
146
+ @prev_pos = get_absolute_position
147
+ end
148
+ end
149
+
150
+ # Scale the rectangle size for this shape.
151
+ # @param [Float] x Horizontal scale factor
152
+ # @param [Float] y Vertical scale factor
153
+ def scale_rectangle(x, y)
154
+ if @can_scale
155
+ @rect_size.x *= x
156
+ @rect_size.y *= y
157
+
158
+ rescale_image(@rect_size) unless @rescale_in_progress
159
+ end
160
+ end
161
+
162
+ # Rescale the bitmap shape so it will fit the given extent. The
163
+ # shape position is not involved (the left-top bitmap corner is not moved).
164
+ # @param [Wx::RealPoint] size New bitmap size
165
+ def rescale_image(size)
166
+ if get_parent_canvas && @original_bitmap && @original_bitmap.ok?
167
+ size = size.to_real_point
168
+ if ShapeCanvas.gc_enabled?
169
+ Wx::Bitmap.rescale(@bitmap = Wx::Bitmap.new(@original_bitmap), size.to_size)
170
+ else
171
+ scale = get_parent_canvas.get_scale
172
+ Wx::Bitmap.rescale(@bitmap = Wx::Bitmap.new(@original_bitmap), (size * scale).to_size)
173
+ end
174
+ end
175
+ end
176
+
177
+ # Draw the shape in the normal way. The function can be overridden if necessary.
178
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
179
+ def draw_normal(dc)
180
+ # HINT: overload it for custom actions...
181
+ if @rescale_in_progress
182
+ _draw_bitmap(dc, @prev_pos.to_point)
183
+
184
+ dc.with_brush(Wx::TRANSPARENT_BRUSH) do
185
+ dc.with_pen(Wx::Pen.new(Wx::Colour.new(100, 100, 100), 1, Wx::PenStyle::PENSTYLE_DOT)) do
186
+ dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
187
+ end
188
+ end
189
+ else
190
+ _draw_bitmap(dc, get_absolute_position.to_point)
191
+ end
192
+ end
193
+
194
+ # Draw the shape in the hover mode (the mouse cursor is above the shape). The function can be overridden if necessary.
195
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
196
+ def draw_hover(dc)
197
+ _draw_bitmap(dc, get_absolute_position.to_point)
198
+
199
+ dc.with_brush(Wx::TRANSPARENT_BRUSH) do
200
+ dc.with_pen(Wx::Pen.new(@hover_color, 1)) do
201
+ dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
202
+ end
203
+ end
204
+ end
205
+
206
+ # Draw the shape in the highlighted mode (another shape is dragged over this shape and this shape will accept the
207
+ # dragged one if it will be dropped on it). The function can be overridden if necessary.
208
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
209
+ def draw_highlighted(dc)
210
+ _draw_bitmap(dc, get_absolute_position.to_point)
211
+
212
+ dc.with_brush(Wx::TRANSPARENT_BRUSH) do
213
+ dc.with_pen(Wx::Pen.new(@hover_color, 2)) do
214
+ dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
215
+ end
216
+ end
217
+ end
218
+
219
+ private
220
+
221
+ # draw the bitmap
222
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
223
+ # @param [Wx::Point] pos
224
+ def _draw_bitmap(dc, pos)
225
+ if @bitmap && @bitmap.ok?
226
+ dc.draw_bitmap(@bitmap, pos)
227
+ else
228
+ dc.with_brush(Wx::TRANSPARENT_BRUSH) do
229
+ dc.with_pen(Wx::BLACK_PEN) do
230
+ dc.draw_rectangle(pos, @rect_size.to_size)
231
+ dc.draw_line(pos, [pos.x+@rect_size.x.to_i-1, pos.y+@rect_size.y.to_i-1])
232
+ dc.draw_line([pos.x, pos.y+@rect_size.y.to_i-1], [pos.x+@rect_size.x.to_i-1, pos.y])
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ # Serialization only.
239
+ def get_bitmap
240
+ if @bitmap && @bitmap.ok?
241
+ [@bitmap_path, @bitmap_type, @art_path, @art_section]
242
+ else
243
+ [nil,nil]
244
+ end
245
+ end
246
+
247
+ # Deserialization only.
248
+ def set_bitmap(bmp_data)
249
+ file, type, art_path, art_section = bmp_data
250
+ if file
251
+ create_from_file(file, type, art_path: art_path, art_section: art_section)
252
+ end
253
+ end
254
+
255
+ end
256
+
257
+ end
@@ -0,0 +1,136 @@
1
+ # Wx::SF::CircleShape - circle shape class
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes/shapes/square_shape'
5
+
6
+ module Wx::SF
7
+
8
+ # Class encapsulating the circle shape.
9
+ class CircleShape < SquareShape
10
+
11
+ # @overload initialize()
12
+ # Default constructor.
13
+ # @overload initialize(pos, size, diagram)
14
+ # User constructor.
15
+ # @param [Wx::RealPoint] pos Initial position
16
+ # @param [Float] radius Initial circle radius
17
+ # @param [Wx::SF::Diagram] diagram parent diagram
18
+ def initialize(*args)
19
+ if args.empty?
20
+ super
21
+ set_rect_size(50,50)
22
+ else
23
+ pos, rad, diagram = args
24
+ super(pos, rad*2, diagram)
25
+ end
26
+ end
27
+
28
+ def get_radius
29
+ @rect_size.x/2
30
+ end
31
+ alias :radius :get_radius
32
+
33
+ def set_radius(rad)
34
+ set_rect_size(rad*2, rad*2)
35
+ end
36
+ alias :radius= :set_radius
37
+
38
+ # Test whether the given point is inside the shape. The function
39
+ # can be overridden if necessary.
40
+ # @param [Wx::Point] pos Examined point
41
+ # @return [Boolean] true if the point is inside the shape area, otherwise false
42
+ def contains?(pos)
43
+ get_center.distance_to(pos) <= radius
44
+ end
45
+
46
+ # Get intersection point of the shape border and a line leading from
47
+ # 'start' point to 'end' point. The function can be overridden if necessary.
48
+ # @param [Wx::RealPoint] start Starting point of the virtual intersection line
49
+ # @param [Wx::RealPoint] end_pt Ending point of the virtual intersection line
50
+ # @return [Wx::RealPoint] Intersection point
51
+ def get_border_point(start, end_pt)
52
+ start = start.to_real_point; end_pt.to_real_point
53
+ dist = start.distance_to(end_pt)
54
+ center = get_center
55
+
56
+ if dist != 0.0
57
+ rad = radius
58
+ src_dx = rad*(end_pt.x-start.x)/dist - (start.x-center.x)
59
+ src_dy = rad*(end_pt.y-start.y)/dist - (start.y-center.y)
60
+
61
+ Wx::RealPoint.new(start.x + src_dx, start.y + src_dy)
62
+ else
63
+ center
64
+ end
65
+ end
66
+
67
+ protected
68
+
69
+ # Draw the shape in the normal way. The function can be overridden if necessary.
70
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
71
+ def draw_normal(dc)
72
+ # HINT: overload it for custom actions...
73
+ pos = get_absolute_position
74
+
75
+ dc.with_pen(@border) do
76
+ dc.with_brush(@fill) do
77
+ dc.draw_circle((pos.x + @rect_size.x/2).to_i,
78
+ (pos.y + @rect_size.y/2).to_i,
79
+ (@rect_size.x/2).to_i)
80
+ end
81
+ end
82
+ end
83
+
84
+ # Draw the shape in the hover mode (the mouse cursor is above the shape).
85
+ # The function can be overridden if necessary.
86
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
87
+ def draw_hover(dc)
88
+ # HINT: overload it for custom actions...
89
+ pos = get_absolute_position
90
+
91
+ dc.with_pen(Wx::Pen.new(@hover_color, 1)) do
92
+ dc.with_brush(@fill) do
93
+ dc.draw_circle((pos.x + @rect_size.x/2).to_i,
94
+ (pos.y + @rect_size.y/2).to_i,
95
+ (@rect_size.x/2).to_i)
96
+ end
97
+ end
98
+ end
99
+
100
+ # Draw the shape in the highlighted mode (another shape is dragged over this
101
+ # shape and this shape will accept the dragged one if it will be dropped on it).
102
+ # The function can be overridden if necessary.
103
+ # @param [Wx::DC] dc Reference to device context where the shape will be drawn to
104
+ def draw_highlighted(dc)
105
+ # HINT: overload it for custom actions...
106
+ pos = get_absolute_position
107
+
108
+ dc.with_pen(Wx::Pen.new(@hover_color, 2)) do
109
+ dc.with_brush(@fill) do
110
+ dc.draw_circle((pos.x + @rect_size.x/2).to_i,
111
+ (pos.y + @rect_size.y/2).to_i,
112
+ (@rect_size.x/2).to_i)
113
+ end
114
+ end
115
+ end
116
+
117
+ # Draw shadow under the shape. The function can be overridden if necessary.
118
+ # @param [Wx::DC] dc Reference to device context where the shadow will be drawn to
119
+ def draw_shadow(dc)
120
+ # HINT: overload it for custom actions...
121
+ pos = get_absolute_position
122
+
123
+ if @fill.style != Wx::BrushStyle::BRUSHSTYLE_TRANSPARENT
124
+ dc.with_pen(Wx::TRANSPARENT_PEN) do
125
+ dc.with_brush(get_parent_canvas.get_shadow_fill) do
126
+ dc.draw_circle((pos.x + @rect_size.x/2 + get_parent_canvas.get_shadow_offset.x).to_i,
127
+ (pos.y + @rect_size.y/2 + get_parent_canvas.get_shadow_offset.y).to_i,
128
+ (@rect_size.x/2).to_i)
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ end
135
+
136
+ end