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,422 @@
1
+ # Wx::SF - Demo FrameCanvas
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+
6
+ class FrameCanvas < Wx::SF::ShapeCanvas
7
+
8
+ # Constructor
9
+ # @param [Wx::SF::Diagram] diagram shape diagram
10
+ # @param [Wx::Window] parent Parent window
11
+ # @param [Integer] id Window ID
12
+ def initialize(diagram, parent, id = Wx::ID_ANY)
13
+ super(diagram, parent, id)
14
+
15
+ # initialize grid
16
+ add_style(STYLE::GRID_USE)
17
+ add_style(STYLE::GRID_SHOW)
18
+ # distances between grid lines can be modified via following function:
19
+ set_grid_line_mult(10)
20
+ # grid line style can be set as follows:
21
+ set_grid_style(Wx::PenStyle::PENSTYLE_SHORT_DASH)
22
+
23
+ # canvas background can be printed/omitted during the canvas printing job
24
+ #add_style(STYLE::PRINT_BACKGROUND)
25
+
26
+ # adjust the printed drawing align and style if needed
27
+ # set_print_v_align(VALIGN::TOP)
28
+ # set_print_h_align(HALIGN::LEFT)
29
+ # set_print_mode(PRINTMODE::MAP_TO_MARGINS)
30
+
31
+ # the canvas background can be filled with a solid colour ...
32
+ # remove_style(STYLE::GRADIENT_BACKGROUND)
33
+ # set_background_colour(DEFAULT::SHAPECANVAS_BACKGROUNDCOLOR)
34
+ # ... or by a gradient fill
35
+ add_style(STYLE::GRADIENT_BACKGROUND)
36
+ set_gradient_from(DEFAULT::GRADIENT_FROM)
37
+ set_gradient_to(DEFAULT::GRADIENT_TO)
38
+
39
+ # also shadows style can be set here:
40
+ # set_shadow_fill(Wx::Brush.new(Wx::Colour.new(100, 100, 100), Wx::CROSSDIAG_HATCH)) # standard values can be DEFAULT::SHAPECANVAS_SHADOWBRUSH or DEFAULT::SHAPECANVAS_SHADOWCOLOR
41
+ # set_shadow_offset(Wx::RealPoint.new(7, 7))
42
+
43
+ # now you can use also these styles...
44
+
45
+ # remove_style(STYLE::HOVERING)
46
+ # remove_style(STYLE::HIGHLIGHTING)
47
+ # remove_style(STYLE::UNDOREDO)
48
+ # remove_style(STYLE::DND)
49
+ # remove_style(STYLE::CLIPBOARD)
50
+ # remove_style(STYLE::MULTI_SIZE_CHANGE)
51
+ # remove_style(STYLE::MULTI_SELECTION)
52
+
53
+ # a style flag presence can be tested like this:
54
+ # if( has_style?(STYLE::GRID_USE) ) do_something()
55
+
56
+ # multiple styles can be set in this way:
57
+ # set_style(STYLE::GRID_USE | STYLE::GRID_SHOW) ... or ...
58
+ # set_style(STYLE::DEFAULT_CANVAS_STYLE)
59
+
60
+ # process mouse wheel if needed
61
+ add_style(STYLE::PROCESS_MOUSEWHEEL)
62
+ # set scale boundaries applied on mouse wheel scale change
63
+ set_min_scale(0.1)
64
+ set_max_scale(2.0)
65
+
66
+ # specify accepted shapes...
67
+ get_diagram.clear_accepted_shapes
68
+ get_diagram.accept_shape(Wx::SF::ACCEPT_ALL)
69
+
70
+ # ... in addition, specify accepted top shapes (i.e. shapes that can be placed
71
+ # directly onto the canvas)
72
+ # get_diagram.clear_accepted_top_shapes
73
+ # get_diagram.accept_top_shape(Wx::SF::RectShape)
74
+
75
+ # get main application frame
76
+ @parent_frame = Wx.get_app.get_top_window
77
+ end
78
+
79
+ def on_left_down(event)
80
+ shape = nil
81
+ case @parent_frame.tool_mode
82
+ when MainFrame::MODE::BITMAP
83
+ Wx::FileDialog(self, "Load bitmap image...", __dir__, '', 'BMP Files (*.bmp)|*.bmp', Wx::FD_OPEN | Wx::FD_FILE_MUST_EXIST) do |dlg|
84
+
85
+ if dlg.show_modal == Wx::ID_OK
86
+ _, shape = get_diagram.create_shape(Wx::SF::BitmapShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
87
+ if shape
88
+ # create relative path
89
+ # wxFileName path( dlg.GetPath() )
90
+ # path.MakeRelativeTo( wxGetCwd() )
91
+ # create image from BMP file
92
+ # ((wxSFBitmapShape*)shape).CreateFromFile( path.GetFullPath(), Wx::BITMAP_TYPE_BMP )
93
+ shape.create_from_file(dlg.get_path, Wx::BitmapType::BITMAP_TYPE_BMP)
94
+
95
+ # set shape policy
96
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
97
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
98
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
99
+ end
100
+ end
101
+ end
102
+ when MainFrame::MODE::TEXT, MainFrame::MODE::EDITTEXT
103
+ Wx::TextEntryDialog(self, '', 'Enter text', 'Hello World!') do |dlg|
104
+ if dlg.show_modal == Wx::ID_OK
105
+ if @parent_frame.tool_mode == MainFrame::MODE::TEXT
106
+ _, shape = get_diagram.create_shape(Wx::SF::TextShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
107
+ else
108
+ _, shape = get_diagram.create_shape(Wx::SF::EditTextShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
109
+ # editable text shapes can be forced to be multiline at default like this:
110
+ # shape.force_multiline( true )
111
+
112
+ # also edit control type can be set here like this:
113
+ # shape.set_edit_type(Wx::SF::EditTextShape::EDITTYPE::DIALOG)
114
+ end
115
+ end
116
+
117
+ if shape
118
+ shape.set_text(dlg.get_value)
119
+
120
+ # set alignment
121
+ shape.set_v_align(Wx::SF::Shape::VALIGN::TOP)
122
+ shape.set_h_align(Wx::SF::Shape::HALIGN::CENTER)
123
+ shape.set_v_border(10.0)
124
+ shape.update
125
+
126
+ # set shapes policy
127
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
128
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
129
+ shape.accept_trg_neighbour(Wx::SF::TextShape)
130
+ shape.accept_trg_neighbour(Wx::SF::EditTextShape)
131
+ end
132
+ end
133
+
134
+ when MainFrame::MODE::DIAMOND
135
+ _, shape = get_diagram.create_shape(Wx::SF::DiamondShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
136
+ if shape
137
+ # set shape policy
138
+ shape.accept_child(Wx::SF::TextShape)
139
+ shape.accept_child(Wx::SF::EditTextShape)
140
+
141
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
142
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
143
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
144
+ end
145
+
146
+ when MainFrame::MODE::FIXEDRECT
147
+ _, shape = get_diagram.create_shape(Wx::SF::SquareShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
148
+ if shape
149
+ # set shape policy
150
+ shape.accept_child(Wx::SF::TextShape)
151
+ shape.accept_child(Wx::SF::EditTextShape)
152
+
153
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
154
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
155
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
156
+ end
157
+
158
+ when MainFrame::MODE::ROUNDRECT
159
+ _, shape = get_diagram.create_shape(Wx::SF::RoundRectShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
160
+ if shape
161
+ # set shape policy
162
+ shape.accept_child(Wx::SF::TextShape)
163
+ shape.accept_child(Wx::SF::EditTextShape)
164
+
165
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
166
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
167
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
168
+ end
169
+
170
+ when MainFrame::MODE::RECT
171
+ _, shape = get_diagram.create_shape(Wx::SF::RectShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
172
+ if shape
173
+ # set shape policy
174
+ shape.accept_child(Wx::SF::ACCEPT_ALL)
175
+
176
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
177
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
178
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
179
+
180
+ # child shapes can be locked accordingly to their parent's origin if the parent is resized
181
+ # shape.add_style(Wx::SF::Shape::STYLE::LOCK_CHILDREN)
182
+
183
+ # shapes can have fixed connection points defined in the following way:
184
+ cp = shape.add_connection_point(Wx::SF::ConnectionPoint::CPTYPE::CENTERLEFT)
185
+ # also direction of connected orthogonal lines can be set in the following way:
186
+ cp.set_ortho_direction(Wx::SF::ConnectionPoint::CPORTHODIR::HORIZONTAL)
187
+ cp = shape.add_connection_point(Wx::SF::ConnectionPoint::CPTYPE::CENTERRIGHT)
188
+ cp.set_ortho_direction(Wx::SF::ConnectionPoint::CPORTHODIR::HORIZONTAL)
189
+ cp = shape.add_connection_point(Wx::SF::ConnectionPoint::CPTYPE::TOPMIDDLE)
190
+ cp.set_ortho_direction(Wx::SF::ConnectionPoint::CPORTHODIR::VERTICAL)
191
+ cp = shape.add_connection_point(Wx::SF::ConnectionPoint::CPTYPE::BOTTOMMIDDLE)
192
+ cp.set_ortho_direction(Wx::SF::ConnectionPoint::CPORTHODIR::VERTICAL)
193
+ # user can define also any number of CUSTOM connection points placed relatively to the
194
+ # parent shape's bounding box ("25, 50" here means 25% of width and 50% of height):
195
+ shape.add_connection_point([25, 50])
196
+ shape.add_connection_point([75, 50])
197
+ # in this case the line connection can be assigned to one of the defined
198
+ # fixed connection points only.
199
+ end
200
+
201
+ when MainFrame::MODE::GRID, MainFrame::MODE::FLEXGRID
202
+ if @parent_frame.tool_mode == MainFrame::MODE::GRID
203
+ _, shape = get_diagram.create_shape(Wx::SF::GridShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
204
+ else
205
+ _, shape = get_diagram.create_shape(Wx::SF::FlexGridShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
206
+ end
207
+
208
+ if shape
209
+ # set visual style
210
+ shape.set_fill(Wx::TRANSPARENT_BRUSH)
211
+ shape.set_border(Wx::Pen.new(Wx::BLACK, 1, Wx::PenStyle::PENSTYLE_DOT))
212
+
213
+ # number of rows and columns cas be set here (default grid dimension is 3x3) ...
214
+ # shape.set_dimensions(2, 2)
215
+
216
+ # ... as well as the cell spaces (default grid cellspace is 5).
217
+ # shape.set_cell_space(0)
218
+
219
+ # set shape policy
220
+ shape.accept_child(Wx::SF::ACCEPT_ALL)
221
+
222
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
223
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
224
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
225
+
226
+ # insert some shapes into the grid from code here (it can also be done interactively by drag&drop operations).
227
+ # shapes inserted to the grid can be aligned relatively to its grid cell region
228
+ _, inner_shape = get_diagram.create_shape(Wx::SF::EllipseShape, Wx::SF::DONT_SAVE_STATE)
229
+ inner_shape.set_v_align(Wx::SF::Shape::VALIGN::EXPAND )
230
+ shape.append_to_grid(inner_shape)
231
+ # add some another shapes...
232
+ _, inner_shape = get_diagram.create_shape(Wx::SF::DiamondShape, Wx::SF::DONT_SAVE_STATE)
233
+ shape.append_to_grid(inner_shape)
234
+ # shapes can be also inserted before given lexicographic position (at the first position in self when) in self way ...
235
+ _, inner_shape = get_diagram.create_shape(Wx::SF::RoundRectShape, Wx::SF::DONT_SAVE_STATE)
236
+ shape.insert_to_grid(0, inner_shape)
237
+ # ... or can replace previously assigned shape at the position specified by row and column indexes
238
+ # (note that the previous shape at the given position (if exists) will be moved to the grid's last lexicographic position).
239
+ _, inner_shape = get_diagram.create_shape(Wx::SF::CircleShape, Wx::SF::DONT_SAVE_STATE)
240
+ shape.insert_to_grid(1, 0, inner_shape)
241
+
242
+ # also control shapes can be managed by the grid shape.
243
+ # _, ctrl = get_diagram.create_shape(Wx::SF::ControlShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
244
+ # if ctrl )
245
+ # ctrl.set_v_align(Wx::SF::Shape::VALIGN::EXPAND)
246
+ # ctrl.set_h_align(Wx::SF::Shape::HALIGN::EXPAND)
247
+ # ctrl.set_control(Wx::Button.new( self, Wx::ID_ANY, "Test"))
248
+ # shape.append_to_grid(ctrl)
249
+ # end
250
+
251
+ # update the grid
252
+ shape.update
253
+ end
254
+
255
+ when MainFrame::MODE::ELLIPSE
256
+ _, shape = get_diagram.create_shape(Wx::SF::EllipseShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
257
+ if shape
258
+ # set shape policy
259
+ shape.accept_child(Wx::SF::TextShape)
260
+ shape.accept_child(Wx::SF::EditTextShape)
261
+
262
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
263
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
264
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
265
+ end
266
+
267
+ when MainFrame::MODE::CIRCLE
268
+ _, shape = get_diagram.create_shape(Wx::SF::CircleShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
269
+ if shape
270
+ # set shape policy
271
+ shape.remove_style(Wx::SF::Shape::STYLE::SIZE_CHANGE)
272
+
273
+ shape.accept_child(Wx::SF::TextShape)
274
+ shape.accept_child(Wx::SF::EditTextShape)
275
+
276
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
277
+ shape.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
278
+ shape.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
279
+ end
280
+
281
+ when MainFrame::MODE::LINE
282
+ if get_mode == MODE::READY
283
+ start_interactive_connection(Wx::SF::LineShape, event.get_position)
284
+ # interactive connection can be created also from existing object for example
285
+ # if some connection properties should be modified before the connection creation
286
+ # process is started:
287
+ # start_interactive_connection(Wx::SF::LineShape.new, event.get_position)
288
+ else
289
+ super
290
+ end
291
+
292
+ when MainFrame::MODE::CURVE
293
+ if get_mode == MODE::READY
294
+ start_interactive_connection(Wx::SF::CurveShape, event.get_position)
295
+ else
296
+ super
297
+ end
298
+
299
+ when MainFrame::MODE::ORTHOLINE
300
+ if get_mode == MODE::READY
301
+ start_interactive_connection(Wx::SF::OrthoLineShape, event.get_position)
302
+ else
303
+ super
304
+ end
305
+
306
+ when MainFrame::MODE::ROUNDORTHOLINE
307
+ if get_mode == MODE::READY
308
+ start_interactive_connection(Wx::SF::RoundOrthoLineShape, event.get_position)
309
+ else
310
+ super
311
+ end
312
+
313
+ when MainFrame::MODE::STANDALONELINE
314
+ _, shape = get_diagram.create_shape(Wx::SF::LineShape, event.get_position, Wx::SF::DONT_SAVE_STATE)
315
+ if shape
316
+ # set the line to be stand-alone
317
+ shape.set_stand_alone(true)
318
+
319
+ shape.set_src_point((event.get_position - [50, 0]).to_real_point)
320
+ shape.set_trg_point((event.get_position + [50, 0]).to_real_point)
321
+
322
+ # line's ending style can be set as follows:
323
+ # shape.set_src_arrow(Wx::SF::CircleArrow)
324
+ # shape.set_trg_arrow(Wx::SF::CircleArrow)
325
+
326
+ shape.accept_child(Wx::SF::TextShape)
327
+ shape.accept_child(Wx::SF::EditTextShape)
328
+ end
329
+
330
+ else
331
+ # do default actions
332
+ super
333
+ end
334
+
335
+ if shape
336
+ show_shadows(@parent_frame.show_shadows, SHADOWMODE::ALL)
337
+
338
+ save_canvas_state
339
+
340
+ @parent_frame.tool_mode = MainFrame::MODE::DESIGN unless event.control_down
341
+
342
+ shape.refresh
343
+ end
344
+ end
345
+
346
+ def on_right_down(event)
347
+ # try to find shape under cursor
348
+ shape = get_shape_under_cursor
349
+ # alternatively you can use:
350
+ # shape = get_shape_at_position(dp2lp(event.getposition), 1, SEARCHMODE::BOTH)
351
+
352
+ # print out information about the shape (if found)
353
+ if shape
354
+ # show basic info
355
+ msg = "Class name: #{shape.class}, ID: #{shape.get_id}\n"
356
+
357
+ # show info about shape's children
358
+ lst_shapes = shape.get_child_shapes(nil, Wx::SF::RECURSIVE)
359
+ unless lst_shapes.empty?
360
+ msg << "\nChildren:\n"
361
+ lst_shapes.each_with_index do |child, i|
362
+ msg << "#{i+1}. Class name: #{child.class}, ID: #{child.get_id}\n"
363
+ end
364
+ end
365
+
366
+ # show info about shape's neighbours
367
+ lst_shapes = shape.get_neighbours(Wx::SF::LineShape, Wx::SF::Shape::CONNECTMODE::BOTH, Wx::SF::INDIRECT)
368
+ unless lst_shapes.empty?
369
+ msg << "\nNeighbours:\n"
370
+ lst_shapes.each_with_index do |nbr, i|
371
+ msg << "#{i+1}. Class name: #{nbr.class}, ID: #{nbr.get_id}\n"
372
+ end
373
+ end
374
+
375
+ # show message
376
+ Wx.message_box(msg, 'wxRuby ShapeFramework', Wx::OK | Wx::ICON_INFORMATION)
377
+ else
378
+ Wx.message_box('No shape found on this position.', 'wxRuby ShapeFramework', Wx::OK | Wx::ICON_INFORMATION)
379
+ end
380
+
381
+ # call default handler
382
+ super
383
+ end
384
+
385
+ def on_key_down(event)
386
+ if event.get_key_code == Wx::K_ESCAPE
387
+ @parent_frame.tool_mode = MainFrame::MODE::DESIGN
388
+ end
389
+
390
+ # do default actions
391
+ super
392
+ end
393
+
394
+ def on_connection_finished(connection)
395
+ if connection
396
+ # the line's ending style can be set like this:
397
+ connection.set_trg_arrow(Wx::SF::SolidArrow)
398
+ # also Wx::SF::OpenArrow, Wx::SF::DiamondArrow and Wx::SF::CircleArrow styles are available.
399
+ connection.set_src_arrow(Wx::SF::CircleArrow)
400
+
401
+ connection.accept_child(Wx::SF::TextShape)
402
+ connection.accept_child(Wx::SF::EditTextShape)
403
+
404
+ connection.accept_connection(Wx::SF::ACCEPT_ALL)
405
+ connection.accept_src_neighbour(Wx::SF::ACCEPT_ALL)
406
+ connection.accept_trg_neighbour(Wx::SF::ACCEPT_ALL)
407
+
408
+ connection.set_dock_point(Wx::SF::LineShape::DEFAULT::DOCKPOINT_CENTER)
409
+
410
+ @parent_frame.tool_mode = MainFrame::MODE::DESIGN
411
+ end
412
+ end
413
+
414
+ def on_mouse_wheel(event)
415
+ # do default actions
416
+ super
417
+
418
+ # adjust zoom slider control
419
+ @parent_frame.zoom_slider.set_value((get_scale * 50).to_i)
420
+ end
421
+
422
+ end
Binary file
Binary file
@@ -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
+ " "};