wxruby3-shapes 0.9.0.pre.beta.3

Sign up to get free protection for your applications and to get access to all the features.
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,108 @@
1
+ # Wx::SF - Sample2 SampleShape class
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+
6
+ class SampleShape < Wx::SF::RectShape
7
+
8
+ def initialize
9
+ super
10
+ end
11
+
12
+ # override required wxSF virtual functions
13
+ def on_left_click(pos)
14
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_left_click', Shape ID: #{get_id}, Position: #{pos}\n")
15
+
16
+ # call original handler if required
17
+ super
18
+ end
19
+ def on_right_click(pos)
20
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_right_click', Shape ID: #{get_id}, Position: #{pos}\n")
21
+
22
+ # call original handler if required
23
+ super
24
+ end
25
+ def on_left_double_click(pos)
26
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_left_double_click', Shape ID: #{get_id}, Position: #{pos}\n")
27
+
28
+ # call original handler if required
29
+ super
30
+ end
31
+ def on_right_double_click(pos)
32
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_right_double_click', Shape ID: #{get_id}, Position: #{pos}\n")
33
+
34
+ # call original handler if required
35
+ super
36
+ end
37
+
38
+ def on_begin_drag(pos)
39
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_begin_drag', Shape ID: #{get_id}, Position: #{pos}\n")
40
+
41
+ # call original handler if required
42
+ super
43
+ end
44
+ def on_dragging(pos)
45
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_dragging', Shape ID: #{get_id}, Position: #{pos}\n")
46
+
47
+ # call original handler if required
48
+ super
49
+ end
50
+ def on_end_drag(pos)
51
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_end_drag', Shape ID: #{get_id}, Position: #{pos}\n")
52
+
53
+ # call original handler if required
54
+ super
55
+ end
56
+
57
+ def on_begin_handle(handle)
58
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::HandleEvent, "Called handler: 'on_begin_handle()', Shape ID: #{get_id}, Handle type: #{handle.type}\n")
59
+
60
+ # call original handler if required
61
+ super
62
+ end
63
+ def on_handle(handle)
64
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::HandleEvent, "Called handler: 'on_handle()', Shape ID: #{get_id}, Handle type: #{handle.type}\n")
65
+
66
+ # call original handler if required
67
+ super
68
+ end
69
+ def on_end_handle(handle)
70
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::HandleEvent, "Called handler: 'on_end_handle()', Shape ID: #{get_id}, Handle type: #{handle.type}\n")
71
+
72
+ # call original handler if required
73
+ super
74
+ end
75
+
76
+ def on_mouse_enter(pos)
77
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_mouse_enter', Shape ID: #{get_id}, Position: #{pos}\n")
78
+
79
+ # call original handler if required
80
+ super
81
+ end
82
+ def on_mouse_over(pos)
83
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_mouse_over', Shape ID: #{get_id}, Position: #{pos}\n")
84
+
85
+ # call original handler if required
86
+ super
87
+ end
88
+ def on_mouse_leave(pos)
89
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::MouseEvent, "Called handler: 'on_mouse_leave', Shape ID: #{get_id}, Position: #{pos}\n")
90
+
91
+ # call original handler if required
92
+ super
93
+ end
94
+
95
+ def on_key(key)
96
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::KeyEvent, "Called handler: 'on_key()', Shape ID: #{get_id}, Key code: #{key}\n")
97
+
98
+ # call original handler if required
99
+ super
100
+ end
101
+
102
+ def on_child_dropped(pos, child)
103
+ SFSample2Frame.log(SFSample2Frame::LOGTYPE::ChildDropEvent, "Called handler: 'on_child_dropped()', Parent shape ID: #{get_id}, Child shape ID: #{child.get_id}\n")
104
+
105
+ # call original handler if required
106
+ super
107
+ end
108
+ end
@@ -0,0 +1,251 @@
1
+ /* XPM */
2
+ static char * sample_xpm[] = {
3
+ "32 32 216 2",
4
+ " c None",
5
+ ". c #872C2C",
6
+ "+ c #A52827",
7
+ "@ c #A42828",
8
+ "# c #553131",
9
+ "$ c #7D2D2D",
10
+ "% c #3D3232",
11
+ "& c #535331",
12
+ "* c #AEAE26",
13
+ "= c #85852C",
14
+ "- c #ACAC26",
15
+ "; c #88882C",
16
+ "> c #9B2929",
17
+ ", c #A92626",
18
+ "' c #F10D0C",
19
+ ") c #B32424",
20
+ "! c #D91919",
21
+ "~ c #A52727",
22
+ "{ c #E51414",
23
+ "] c #DC1817",
24
+ "^ c #9F2828",
25
+ "/ c #A5A527",
26
+ "( c #F2F20B",
27
+ "_ c #FFFF00",
28
+ ": c #F1F10C",
29
+ "< c #AEAE25",
30
+ "[ c #E7E712",
31
+ "} c #BEBE22",
32
+ "| c #999929",
33
+ "1 c #DE1716",
34
+ "2 c #A82626",
35
+ "3 c #EF0E0D",
36
+ "4 c #CA1E1E",
37
+ "5 c #C42020",
38
+ "6 c #EC1010",
39
+ "7 c #9E2828",
40
+ "8 c #B12525",
41
+ "9 c #E91211",
42
+ "0 c #922A2A",
43
+ "a c #A8A827",
44
+ "b c #EFEF0D",
45
+ "c c #C5C520",
46
+ "d c #FBFB03",
47
+ "e c #A6A627",
48
+ "f c #FAFA04",
49
+ "g c #CACA1E",
50
+ "h c #DDDD18",
51
+ "i c #F8F806",
52
+ "j c #B8B823",
53
+ "k c #E3E315",
54
+ "l c #9E2929",
55
+ "m c #D01D1D",
56
+ "n c #B72423",
57
+ "o c #AD2625",
58
+ "p c #DD1817",
59
+ "q c #B22525",
60
+ "r c #D71A1A",
61
+ "s c #EBEB10",
62
+ "t c #B0B025",
63
+ "u c #C0C021",
64
+ "v c #E6E613",
65
+ "w c #97972A",
66
+ "x c #A22828",
67
+ "y c #BB2323",
68
+ "z c #B82424",
69
+ "A c #4A3232",
70
+ "B c #842D2D",
71
+ "C c #912B2B",
72
+ "D c #5B3131",
73
+ "E c #70702F",
74
+ "F c #C6C620",
75
+ "G c #8E8E2B",
76
+ "H c #9A9A29",
77
+ "I c #484832",
78
+ "J c #A4A428",
79
+ "K c #9D2828",
80
+ "L c #E61211",
81
+ "M c #E51212",
82
+ "N c #DF1615",
83
+ "O c #D21B1A",
84
+ "P c #423232",
85
+ "Q c #515131",
86
+ "R c #E4E412",
87
+ "S c #F3F307",
88
+ "T c #E2E213",
89
+ "U c #BEBE20",
90
+ "V c #ECEC0C",
91
+ "W c #B1B124",
92
+ "X c #999928",
93
+ "Y c #CF1D1D",
94
+ "Z c #CD1E1D",
95
+ "` c #D21C1C",
96
+ " . c #A42727",
97
+ ".. c #ED0F0F",
98
+ "+. c #7E2D2D",
99
+ "@. c #92922B",
100
+ "#. c #FDFD01",
101
+ "$. c #D1D11C",
102
+ "%. c #E5E513",
103
+ "&. c #643030",
104
+ "*. c #E61313",
105
+ "=. c #EE0F0E",
106
+ "-. c #A92726",
107
+ ";. c #C1C121",
108
+ ">. c #ADAD25",
109
+ ",. c #EEEE0E",
110
+ "'. c #5C5C31",
111
+ "). c #F00D0C",
112
+ "!. c #AA2726",
113
+ "~. c #AF2525",
114
+ "{. c #EA1110",
115
+ "]. c #32365A",
116
+ "^. c #333440",
117
+ "/. c #E2E215",
118
+ "(. c #F0F00D",
119
+ "_. c #C4C420",
120
+ ":. c #F5F508",
121
+ "<. c #BCBC22",
122
+ "[. c #FCFC02",
123
+ "}. c #8C8C2B",
124
+ "|. c #B92323",
125
+ "1. c #E51413",
126
+ "2. c #633030",
127
+ "3. c #313A74",
128
+ "4. c #2D43AE",
129
+ "5. c #2E40A2",
130
+ "6. c #313975",
131
+ "7. c #77772E",
132
+ "8. c #F7F706",
133
+ "9. c #CBCB1E",
134
+ "0. c #BABA23",
135
+ "a. c #D81919",
136
+ "b. c #A62727",
137
+ "c. c #D41B1B",
138
+ "d. c #C91F1E",
139
+ "e. c #8F2B2B",
140
+ "f. c #323553",
141
+ "g. c #2C45BA",
142
+ "h. c #284CE0",
143
+ "i. c #2A4AD5",
144
+ "j. c #2C46C0",
145
+ "k. c #A3A328",
146
+ "l. c #DEDE17",
147
+ "m. c #772E2E",
148
+ "n. c #EC100F",
149
+ "o. c #AB2626",
150
+ "p. c #B12524",
151
+ "q. c #2B47C8",
152
+ "r. c #2D43AF",
153
+ "s. c #2453FF",
154
+ "t. c #2552FA",
155
+ "u. c #2D44B6",
156
+ "v. c #2C45BE",
157
+ "w. c #BEBE21",
158
+ "x. c #BFBF22",
159
+ "y. c #B2B224",
160
+ "z. c #6B2F2F",
161
+ "A. c #C6201F",
162
+ "B. c #2F409F",
163
+ "C. c #2551F8",
164
+ "D. c #2C44B9",
165
+ "E. c #2452FC",
166
+ "F. c #2F3E92",
167
+ "G. c #585831",
168
+ "H. c #8E8E2A",
169
+ "I. c #79792D",
170
+ "J. c #5C3030",
171
+ "K. c #333333",
172
+ "L. c #313971",
173
+ "M. c #2551F5",
174
+ "N. c #2A49D0",
175
+ "O. c #284EE6",
176
+ "P. c #294BD9",
177
+ "Q. c #294CDD",
178
+ "R. c #2650F1",
179
+ "S. c #323761",
180
+ "T. c #606030",
181
+ "U. c #294CDE",
182
+ "V. c #2D42AD",
183
+ "W. c #2D43B3",
184
+ "X. c #2A4AD6",
185
+ "Y. c #2C45BD",
186
+ "Z. c #303B7C",
187
+ "`. c #2650F0",
188
+ " + c #2650F3",
189
+ ".+ c #2B46C3",
190
+ "++ c #284CDE",
191
+ "@+ c #2A49D1",
192
+ "#+ c #264FED",
193
+ "$+ c #31396F",
194
+ "%+ c #303D90",
195
+ "&+ c #2B47C6",
196
+ "*+ c #31386B",
197
+ "=+ c #2E41A7",
198
+ "-+ c #313A77",
199
+ ";+ c #303C86",
200
+ ">+ c #2551F7",
201
+ ",+ c #2D43B1",
202
+ "'+ c #2E41A6",
203
+ ")+ c #2552FB",
204
+ "!+ c #2552F9",
205
+ "~+ c #2552F8",
206
+ "{+ c #323765",
207
+ "]+ c #2B48CB",
208
+ "^+ c #2A49CF",
209
+ "/+ c #274EE7",
210
+ "(+ c #264FEE",
211
+ "_+ c #2D42AE",
212
+ ":+ c #2650F2",
213
+ "<+ c #294BDA",
214
+ "[+ c #2C46C1",
215
+ "}+ c #313A78",
216
+ "|+ c #2D42AA",
217
+ "1+ c #294BDC",
218
+ "2+ c #2B48CA",
219
+ "3+ c #2453FD",
220
+ " ",
221
+ " ",
222
+ " ",
223
+ " ",
224
+ " ",
225
+ " . + + @ # $ + + + % & * * * = & - * * ; ",
226
+ " > , ' ' ) ! ~ { ' ] ^ / ( _ : < [ } _ _ < | ",
227
+ " 1 2 3 4 5 ' 6 7 3 8 9 0 a b c d e f _ g h i j k ",
228
+ " l ' m n o ' ' ' p q ~ ' r s _ < t b _ _ _ < u v _ w ",
229
+ " x y z A z y y y y B C y y D E F F G H F F F F } I c F J ",
230
+ " K L L ^ M L L L L , N L O P Q R S T U S S S S V W S S X ",
231
+ " Y ' Z ` ' ' ' ' .' ..+. @.#._ < _ _ _ _ $.%._ $. ",
232
+ " &.*.=., ' ' ' ! 5 ' -. } _ ;.( _ _ _ >._ ,.'. ",
233
+ " C ).!.=.' ' ~.{.Z ].^. /.(._._ _ :.<.[.}. ",
234
+ " |.` Z ' ' ~ 1.2. 3.4.5.6. 7.8.>._ _ 9.s 0. ",
235
+ " a.b.' c.d.e. f.g.h.i.j. k.F ,._ < l. ",
236
+ " m. .n.o.p. q.r.s.t.u.v. w.x.( y.E ",
237
+ " z.A.$ B.C.D.s.s.r.E.F. G.H._.I. ",
238
+ " J.K. L.M.N.O.s.s.P.Q.R.S. K.T. ",
239
+ " K. U.s.V.s.s.s.E.W.s.X. ",
240
+ " g.s.M.Y.s.s.s.s.W.E.s.V. ",
241
+ " Z.`. +.+++ + + + +@+N. +#+$+ ",
242
+ " %+&+&+*+W.&+&+&+&+=+-+&+&+;+ ",
243
+ " 6.E.>+,+'+)+s.s.!+=+r.E.~+{+ ",
244
+ " ]+^+/+(+,+s.s._+:+Q.<+[+ ",
245
+ " }+|+s.s.1+q.2+Q.s.3+=+{+ ",
246
+ " 6._+_+_+$+$+_+_+_+*+ ",
247
+ " ",
248
+ " ",
249
+ " ",
250
+ " ",
251
+ " "};
@@ -0,0 +1,281 @@
1
+ # Wx::SF - Sample3
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+
6
+ class StarShape < Wx::SF::PolygonShape
7
+
8
+ # star shape vertices
9
+ STAR = [Wx::RealPoint.new(0, -50), Wx::RealPoint.new(15, -10),
10
+ Wx::RealPoint.new(50, -10), Wx::RealPoint.new(22, 10),
11
+ Wx::RealPoint.new(40, 50), Wx::RealPoint.new(0, 20),
12
+ Wx::RealPoint.new(-40, 50), Wx::RealPoint.new(-22, 10),
13
+ Wx::RealPoint.new(-50, -10), Wx::RealPoint.new(-15, -10)]
14
+
15
+ # regular property
16
+ property :description
17
+ # component shape property (this specifies that this item should be serialized as a property of this class and
18
+ # not from any reference elsewhere like it's parents child shapes list)
19
+ component :title
20
+ # disable serialization of polygon vertices for this PolygonShape derivative,
21
+ # because they are always set in constructor for this class
22
+ excludes :vertices
23
+
24
+ # @overload initialize()
25
+ # Default constructor.
26
+ # @overload initialize(pos, size, diagram)
27
+ # User constructor.
28
+ # @param [Wx::RealPoint] pos Initial position
29
+ # @param [Wx::SF::Diagram] diagram parent diagram
30
+ def initialize(*args)
31
+ if args.empty?
32
+ super()
33
+ set_vertices(STAR)
34
+ else
35
+ pos, diagram = args
36
+ super(STAR, pos, diagram)
37
+ end
38
+ init
39
+ end
40
+
41
+ protected
42
+
43
+ def get_description
44
+ @description
45
+ end
46
+
47
+ def set_description(desc)
48
+ @description = desc
49
+ end
50
+
51
+ def get_title
52
+ @text
53
+ end
54
+
55
+ private
56
+
57
+ def set_title(txt)
58
+ @text = txt
59
+ end
60
+
61
+ def init
62
+ # initialize custom data members...
63
+ @description = "Insert some shape's description text here..."
64
+
65
+ # polygon-based shapes can be connected either to the vertices or to the
66
+ # nearest border point (default value is true).
67
+ set_connect_to_vertex(false)
68
+
69
+ # set accepted connections for the new shape
70
+ accept_connection(Wx::SF::ACCEPT_ALL)
71
+ accept_src_neighbour(StarShape)
72
+ accept_trg_neighbour(StarShape)
73
+
74
+ # create associated shape(s)
75
+ @text = Wx::SF::EditTextShape.new
76
+ # set some properties
77
+ if @text
78
+ # set text
79
+ @text.set_text('Hello!')
80
+ # set alignment
81
+ @text.set_v_align(Wx::SF::Shape::VALIGN::MIDDLE)
82
+ @text.set_h_align(Wx::SF::Shape::HALIGN::CENTER)
83
+
84
+ # set required shape style(s)
85
+ @text.set_style(STYLE::ALWAYS_INSIDE | STYLE::HOVERING | STYLE::PROCESS_DEL | STYLE::PROPAGATE_DRAGGING | STYLE::PROPAGATE_SELECTION | STYLE::PROPAGATE_INTERACTIVE_CONNECTION)
86
+ # you can also force displaying of the shapes handles even if the interactive
87
+ # size change is not allowed:
88
+ #@text.add_style(STYLE::SHOW_HANDLES)
89
+
90
+ # we use #set_parent_shape and not #add_child_shape as we do not want it checked against the acceptance list
91
+ # (which is empty and we want to keep it like that) and we already know it's not yet on the diagram so does
92
+ # not need to be removed as toplevel shape
93
+ @text.set_parent_shape(self)
94
+ # component will/should be added as child shape but will not be serialized as such
95
+ # instead the 'component :title' declaration above makes sure it will be serialized
96
+ # as a dedicated property of instances of this class
97
+
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ class SFSample3Frame < Wx::Frame
104
+
105
+ module ID
106
+ MenuQuit = 1000
107
+ MenuOpen = 1001
108
+ MenuSave = 1002
109
+ MenuAbout = 1003
110
+ end
111
+
112
+ def initialize(title)
113
+ super(nil, Wx::StandardID::ID_ANY, title, size: [800,600])
114
+
115
+ self.icon = Wx::Icon(:sample)
116
+
117
+ if Wx.has_feature?(:USE_MENUS)
118
+ # create a menu bar
119
+ mbar = Wx::MenuBar.new
120
+ file_menu = Wx::Menu.new
121
+ file_menu.append(ID::MenuOpen, "&Open\tCtrl-O", 'Open diagram from XML file')
122
+ file_menu.append(ID::MenuSave, "&Save\tCtrl-S", 'Save diagram to XML file')
123
+ file_menu.append_separator
124
+ file_menu.append(ID::MenuQuit, "&Quit\tAlt-F4", "Quit the application")
125
+ mbar.append(file_menu, "&File")
126
+
127
+ help_menu = Wx::Menu.new
128
+ help_menu.append(ID::MenuAbout, "&About\tF1", "Show info about this application")
129
+ mbar.append(help_menu, "&Help")
130
+
131
+ self.menu_bar = mbar
132
+
133
+ evt_menu(ID::MenuOpen, :on_open)
134
+ evt_menu(ID::MenuSave, :on_save)
135
+ evt_menu(ID::MenuQuit, :on_quit)
136
+ evt_menu(ID::MenuAbout, :on_about)
137
+ end # wxUSE_MENUS
138
+ @diagram = Wx::SF::Diagram.new
139
+ # set some diagram manager properties if necessary...
140
+ # set accepted shapes (accept only Wx::SF::RectShape)
141
+ @diagram.clear_accepted_shapes
142
+ @diagram.accept_shape(StarShape)
143
+ @diagram.accept_shape(Wx::SF::TextShape)
144
+ @diagram.accept_shape(Wx::SF::LineShape)
145
+
146
+ # create shape canvas and associate it with shape manager
147
+ @canvas = Wx::SF::ShapeCanvas.new(@diagram, self)
148
+ # set some shape canvas properties if necessary...
149
+ @canvas.add_style(Wx::SF::ShapeCanvas::STYLE::GRID_SHOW)
150
+ @canvas.add_style(Wx::SF::ShapeCanvas::STYLE::GRID_USE)
151
+
152
+ evt_close :on_close
153
+
154
+ # connect (some) shape canvas events
155
+ @canvas.evt_left_down { |evt| self.on_left_click_canvas(evt) }
156
+ @canvas.evt_right_down { |evt| self.on_right_click_canvas(evt) }
157
+
158
+ # connect (some) shape events (for full list of available shape/shape canvas events see Wx::SF reference documentation).
159
+ @canvas.evt_sf_line_done { |evt| self.on_line_done(evt) }
160
+ @canvas.evt_sf_text_change { |evt| self.on_text_change(evt) }
161
+
162
+ if Wx.has_feature?(:USE_STATUSBAR)
163
+ # create a status bar with some information about the used wxWidgets version
164
+ create_status_bar(2)
165
+ set_status_text('Hello wxRuby ShapeFramework user!',0)
166
+ set_status_text("wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM} (wxWidgets #{Wx::WXWIDGETS_VERSION})", 1)
167
+ end # wxUSE_STATUSBAR
168
+
169
+ center
170
+ end
171
+
172
+ # Window event handlers
173
+
174
+ def on_close(_event)
175
+ destroy
176
+ end
177
+
178
+ def on_quit(_event)
179
+ destroy
180
+ end
181
+
182
+ def on_about(_event)
183
+ msg = "wxRuby ShapeFramework #{Wx::SF::VERSION}\n(wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM}; #{Wx::WXWIDGETS_VERSION})\n\n"
184
+
185
+ msg += "Welcome to wxRuby ShapeFramework Sample3 (c) Martin Corino, 2023\n"
186
+ msg += "(ported from wxSFShapeFramework original (c) Michal Bliznak, 2007 - 2013)\n\n"
187
+ msg += "Sample demonstrates basic Wx::SF functionality.\n"
188
+ msg += " - New custom 'composite' shape is created.\n"
189
+ msg += " - Shapes can be joined together by lines.\n\n"
190
+ msg += "Usage:\n"
191
+ msg += " - Left mouse click operates with inserted shapes\n"
192
+ msg += " - Right mouse click inserts a custom shape to the canvas or starts\n"
193
+ msg += " interactive connection line's creation process\n"
194
+ msg += " - You can modify the star's text (double click it by the left mouse button)\n"
195
+ msg += " - DEL key removes selected shape\n"
196
+
197
+ Wx.message_box(msg, "wxRuby ShapeFramework Sample 3")
198
+ end
199
+
200
+ # event handlers for shape canvas
201
+
202
+ def on_left_click_canvas(event)
203
+ # HINT: perform your user actions here...
204
+
205
+ # ... and then process standard canvas operations
206
+ event.skip
207
+ end
208
+
209
+ def on_right_click_canvas(event)
210
+ # find out whether some shape has been clicked
211
+ if @canvas.get_shape_at_position(@canvas.dp2lp(event.get_position))
212
+ # start interactive connection creation
213
+ @canvas.start_interactive_connection(Wx::SF::LineShape, event.get_position)
214
+ else
215
+ # create new composite shape
216
+ @diagram.add_shape(s = StarShape.new, nil, event.get_position, Wx::SF::INITIALIZE, Wx::SF::DONT_SAVE_STATE)
217
+
218
+ # ... and process standard canvas operations
219
+ event.skip
220
+ end
221
+ end
222
+
223
+ # event handlers for shapes
224
+
225
+ # Event handler called when the interactive line creation process is finished.
226
+ # Alternatively you can override virtual function Wx::SF::ShapeCanvas#on_connection_finished.
227
+ def on_line_done(event)
228
+ # get new line shape (if created)
229
+ line = event.get_shape
230
+
231
+ if line.is_a?(Wx::SF::LineShape)
232
+ # assign target arrow to the line shape (also source arrow can be created)
233
+ line.set_trg_arrow(Wx::SF::SolidArrow)
234
+ end
235
+ end
236
+
237
+ # Event handler called when a text inside the star was changed.
238
+ # Alternatively you can override virtual function Wx::SF::ShapeCanvas#on_text_change.
239
+ def on_text_change(event)
240
+ # get changed text shape
241
+ text = event.get_shape
242
+
243
+ if text.is_a?(Wx::SF::TextShape)
244
+ # update the text shape and its parent(s)
245
+ text.update
246
+ # display some info...
247
+ Wx.log_message("New text of the star with ID #{text.get_parent_shape.id.to_i} is : '#{event.text}'")
248
+ end
249
+ end
250
+
251
+ def on_open(_event)
252
+ Wx::FileDialog(self, 'Load diagram from file...', Dir.getwd, '', "JSON Files (*.json)|*.json", Wx::FD_OPEN) do |dlg|
253
+ if dlg.show_modal == Wx::ID_OK
254
+ File.open(dlg.get_path, 'r') do |f|
255
+ @canvas.set_diagram(Wx::SF::Serializable.deserialize(f))
256
+ @canvas.clear_canvas_history
257
+ @canvas.save_canvas_state
258
+ end
259
+ @diagram = @canvas.get_diagram
260
+ @canvas.refresh(false)
261
+ end
262
+ end
263
+ end
264
+
265
+ def on_save(_event)
266
+ Wx::FileDialog(self, 'Save diagram to XML...', Dir.getwd, '', 'JSON Files (*.json)|*.json', Wx::FD_SAVE) do |dlg|
267
+ if dlg.show_modal == Wx::ID_OK
268
+ # save diagram to file
269
+ File.open(dlg.get_path, 'w+') do |f|
270
+ @diagram.serialize(f, pretty: true)
271
+ end
272
+ Wx.message_box("The diagram has been saved to '#{dlg.get_path}'.", 'wxRuby ShapeFramework')
273
+ end
274
+ end
275
+ end
276
+
277
+ end
278
+
279
+ Wx::App.run do
280
+ SFSample3Frame.new('wxShapeFramework Sample 3').show
281
+ end