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,263 @@
1
+ # Wx::SF - Sample1
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+
6
+ class SFSample1Frame < Wx::Frame
7
+
8
+ module ID
9
+ MenuQuit = 1000
10
+ MenuAbout = 1001
11
+ MenuLogMouseEvent = 1002
12
+ MenuLogHandleEvent = 1003
13
+ MenuLogKeyEvent = 1004
14
+ MenuLogChildDropEvent = 1005
15
+ end
16
+
17
+ def initialize(title)
18
+ super(nil, Wx::StandardID::ID_ANY, title, size: [800,600])
19
+
20
+ self.icon = Wx::Icon(:sample)
21
+
22
+ # initialize event types
23
+ @event_type_info = {
24
+ Wx::SF::EVT_SF_SHAPE_LEFT_DOWN => "Shape was clicked by LMB (wxEVT_SF_SHAPE_LEFT_DOWN )",
25
+ Wx::SF::EVT_SF_SHAPE_LEFT_DCLICK => "Shape was double-clicked by LMB (wxEVT_SF_SHAPE_LEFT_DOWN )",
26
+ Wx::SF::EVT_SF_SHAPE_RIGHT_DOWN => "Shape was clicked by RMB (wxEVT_SF_SHAPE_RIGHT_DOWN )",
27
+ Wx::SF::EVT_SF_SHAPE_RIGHT_DCLICK => "Shape was double-clicked by RMB (wxEVT_SF_SHAPE_RIGHT_DOWN )",
28
+ Wx::SF::EVT_SF_SHAPE_DRAG_BEGIN => "Shape has started to be dragged (wxEVT_SF_SHAPE_DRAG_BEGIN )",
29
+ Wx::SF::EVT_SF_SHAPE_DRAG => "Shape is dragging (wxEVT_SF_SHAPE_DRAG )",
30
+ Wx::SF::EVT_SF_SHAPE_DRAG_END => "Shape's dragging was finished (wxEVT_SF_SHAPE_DRAG_END )",
31
+ Wx::SF::EVT_SF_SHAPE_HANDLE_BEGIN => "Shape handle has started to be dragged (wxEVT_SF_SHAPE_HANDLE_BEGIN )",
32
+ Wx::SF::EVT_SF_SHAPE_HANDLE => "Shape handle is dragging (wxEVT_SF_SHAPE_HANDLE )",
33
+ Wx::SF::EVT_SF_SHAPE_HANDLE_END => "Shape handle's dragging was finished (wxEVT_SF_SHAPE_HANDLE_END )",
34
+ Wx::SF::EVT_SF_SHAPE_KEYDOWN => "Key was pressed (wxEVT_SF_SHAPE_KEYDOWN )",
35
+ Wx::SF::EVT_SF_SHAPE_MOUSE_ENTER => "Mouse has entered shape's area (wxEVT_SF_SHAPE_MOUSE_ENTER)",
36
+ Wx::SF::EVT_SF_SHAPE_MOUSE_OVER => "Mouse is moving over shape's area (wxEVT_SF_SHAPE_MOUSE_OVER)",
37
+ Wx::SF::EVT_SF_SHAPE_MOUSE_LEAVE => "Mouse has leaved shape's area (wxEVT_SF_SHAPE_MOUSE_LEAVE)",
38
+ Wx::SF::EVT_SF_SHAPE_CHILD_DROP => "Child shape has been assigned to shape (wxEVT_SF_SHAPE_CHILD_DROP)",
39
+ Wx::SF::EVT_SF_LINE_HANDLE_ADD => "Line handle has been created (wxEVT_SF_LINE_HANDLE_ADD)",
40
+ Wx::SF::EVT_SF_LINE_HANDLE_REMOVE => "Line handle has been removed (wxEVT_SF_LINE_HANDLE_REMOVE)"
41
+ }
42
+
43
+ evt_close :on_close
44
+
45
+ if Wx.has_feature?(:USE_MENUS)
46
+ # create a menu bar
47
+ mbar = Wx::MenuBar.new
48
+ file_menu = Wx::Menu.new
49
+ file_menu.append(ID::MenuQuit, "&Quit\tAlt-F4", "Quit the application")
50
+ mbar.append(file_menu, "&File")
51
+
52
+ @log_menu = Wx::Menu.new
53
+ @log_menu.append_check_item(ID::MenuLogMouseEvent, "Log &mouse events")
54
+ @log_menu.append_check_item(ID::MenuLogHandleEvent, "Log &handle events")
55
+ @log_menu.append_check_item(ID::MenuLogKeyEvent, "Log &keyboard events")
56
+ @log_menu.append_check_item(ID::MenuLogChildDropEvent, "Log &child drop event")
57
+ mbar.append(@log_menu, "&Log")
58
+
59
+ help_menu = Wx::Menu.new
60
+ help_menu.append(ID::MenuAbout, "&About\tF1", "Show info about this application")
61
+ mbar.append(help_menu, "&Help")
62
+
63
+ self.menu_bar = mbar
64
+
65
+ evt_menu(ID::MenuQuit, :on_quit)
66
+ evt_menu(ID::MenuAbout, :on_about)
67
+ end # wxUSE_MENUS
68
+
69
+ main_sizer = Wx::FlexGridSizer.new(2, 0, 0, 0)
70
+ main_sizer.add_growable_col(0)
71
+ main_sizer.add_growable_row(0)
72
+ main_sizer.set_flexible_direction(Wx::Orientation::BOTH)
73
+ main_sizer.set_non_flexible_grow_mode(Wx::FlexSizerGrowMode::FLEX_GROWMODE_SPECIFIED)
74
+
75
+ @diagram = Wx::SF::Diagram.new
76
+ # set some diagram manager properties if necessary...
77
+ # set accepted shapes (accept only Wx::SF::RectShape)
78
+ @diagram.clear_accepted_shapes
79
+ @diagram.accept_shape(Wx::SF::RectShape)
80
+ @diagram.accept_shape(Wx::SF::CurveShape)
81
+
82
+ # create shape canvas and associate it with shape manager
83
+ @canvas = Wx::SF::ShapeCanvas.new(@diagram, self)
84
+ # set some shape canvas properties if necessary...
85
+ @canvas.add_style(Wx::SF::ShapeCanvas::STYLE::GRID_SHOW)
86
+ @canvas.add_style(Wx::SF::ShapeCanvas::STYLE::GRID_USE)
87
+
88
+ # connect (some) shape canvas events
89
+ @canvas.evt_left_down { |evt| self.on_left_click_canvas(evt) }
90
+ @canvas.evt_right_down { |evt| self.on_right_click_canvas(evt) }
91
+
92
+ # connect (some) shape events (for full list of available shape/shape canvas events see Wx::SF reference documentation).
93
+ @canvas.evt_sf_shape_left_down { |evt| self.on_shape_mouse_event(evt) }
94
+ @canvas.evt_sf_shape_left_dclick { |evt| self.on_shape_mouse_event(evt) }
95
+ @canvas.evt_sf_shape_right_down { |evt| self.on_shape_mouse_event(evt) }
96
+ @canvas.evt_sf_shape_right_dclick { |evt| self.on_shape_mouse_event(evt) }
97
+ @canvas.evt_sf_shape_drag_begin { |evt| self.on_shape_mouse_event(evt) }
98
+ @canvas.evt_sf_shape_drag { |evt| self.on_shape_mouse_event(evt) }
99
+ @canvas.evt_sf_shape_drag_end { |evt| self.on_shape_mouse_event(evt) }
100
+
101
+ @canvas.evt_sf_shape_mouse_enter { |evt| self.on_shape_mouse_event(evt) }
102
+ @canvas.evt_sf_shape_mouse_over { |evt| self.on_shape_mouse_event(evt) }
103
+ @canvas.evt_sf_shape_mouse_leave { |evt| self.on_shape_mouse_event(evt) }
104
+
105
+ @canvas.evt_sf_shape_handle_begin { |evt| self.on_shape_handle_event(evt) }
106
+ @canvas.evt_sf_shape_handle { |evt| self.on_shape_handle_event(evt) }
107
+ @canvas.evt_sf_shape_handle_end { |evt| self.on_shape_handle_event(evt) }
108
+ @canvas.evt_sf_line_handle_add { |evt| self.on_shape_handle_event(evt) }
109
+ @canvas.evt_sf_line_handle_remove { |evt| self.on_shape_handle_event(evt) }
110
+
111
+ @canvas.evt_sf_shape_keydown { |evt| self.on_shape_key_event(evt) }
112
+
113
+ @canvas.evt_sf_shape_child_drop { |evt| self.on_shape_child_drop_event(evt) }
114
+
115
+ @canvas.evt_sf_line_done { |evt| self.on_line_finished(evt) }
116
+
117
+ main_sizer.add(@canvas, 1, Wx::EXPAND, 0)
118
+
119
+ @text_log = Wx::TextCtrl.new(self, size: [-1, 150], style: Wx::TE_MULTILINE)
120
+ @text_log.set_font(Wx::Font.new(8, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL, Wx::FONTWEIGHT_NORMAL, false, 'Sans'))
121
+ @text_log.set_min_size(Wx::Size.new(-1, 150))
122
+
123
+ main_sizer.add(@text_log, 0, Wx::EXPAND, 0)
124
+
125
+ if Wx.has_feature?(:USE_STATUSBAR)
126
+ # create a status bar with some information about the used wxWidgets version
127
+ create_status_bar(2)
128
+ set_status_text('Hello wxRuby ShapeFramework user!',0)
129
+ set_status_text("wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM} (wxWidgets #{Wx::WXWIDGETS_VERSION})", 1)
130
+ end # wxUSE_STATUSBAR
131
+
132
+ set_sizer(main_sizer)
133
+ layout
134
+ center
135
+ end
136
+
137
+ # Window event handlers
138
+
139
+ def on_close(_event)
140
+ destroy
141
+ end
142
+
143
+ def on_quit(_event)
144
+ destroy
145
+ end
146
+
147
+ def on_about(_event)
148
+ msg = "wxRuby ShapeFramework #{Wx::SF::VERSION}\n(wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM}; #{Wx::WXWIDGETS_VERSION})\n\n"
149
+
150
+ msg += "Welcome to wxRuby ShapeFramework Sample1 (c) Martin Corino, 2023\n"
151
+ msg += "(ported from wxSFShapeFramework original (c) Michal Bliznak, 2007 - 2013)\n\n"
152
+ msg += "Sample demonstrates basic Wx::SF functionality.\n"
153
+ msg += "Usage:\n"
154
+ msg += " - Left mouse click operates with inserted shapes\n"
155
+ msg += " - Right mouse click inserts a rectangular shape to the canvas\n"
156
+ msg += " - Right mouse click onto the shape + CTRL key starts interactive line connection \n"
157
+ msg += " - DEL key removes selected shape\n"
158
+
159
+ Wx.message_box(msg, "wxRuby ShapeFramework Sample 1")
160
+ end
161
+
162
+ # event handlers for shape canvas
163
+
164
+ def on_left_click_canvas(event)
165
+ # HINT: perform your user actions here...
166
+
167
+ # ... and then process standard canvas operations
168
+ event.skip
169
+ end
170
+
171
+ def on_right_click_canvas(event)
172
+ if event.control_down
173
+ # create connection line
174
+ @canvas.start_interactive_connection(Wx::SF::CurveShape, event.get_position)
175
+ else
176
+ # add new rectangular shape to the diagram ...
177
+ _err, shape = @diagram.create_shape(Wx::SF::RectShape, event.get_position)
178
+ # set some shape's properties...
179
+ if shape
180
+ # set accepted child shapes for the new shape
181
+ shape.accept_child(Wx::SF::RectShape)
182
+ # set accepted connections for the new shape
183
+ shape.accept_connection(Wx::SF::ACCEPT_ALL)
184
+ shape.accept_src_neighbour(Wx::SF::RectShape)
185
+ shape.accept_trg_neighbour(Wx::SF::RectShape)
186
+ # enable emitting of shape events
187
+ shape.add_style(Wx::SF::Shape::STYLE::EMIT_EVENTS)
188
+ end
189
+ end
190
+ # ... and process standard canvas operations
191
+ event.skip
192
+ end
193
+
194
+ # event handlers for shapes
195
+
196
+ def on_shape_mouse_event(event)
197
+ if @log_menu.is_checked(ID::MenuLogMouseEvent)
198
+ @text_log.append_text("#{@event_type_info[event.get_event_type]}, ID: #{event.get_id}, Mouse position: #{event.get_mouse_position.x},#{event.get_mouse_position.y}\n")
199
+ end
200
+ end
201
+
202
+ def on_shape_handle_event(event)
203
+ if @log_menu.is_checked(ID::MenuLogHandleEvent)
204
+ hnd_type =case event.handle.type
205
+ when Wx::SF::Shape::Handle::LEFTTOP
206
+ "left-top"
207
+ when Wx::SF::Shape::Handle::TOP
208
+ "top"
209
+ when Wx::SF::Shape::Handle::RIGHTTOP
210
+ "right-top"
211
+ when Wx::SF::Shape::Handle::LEFT
212
+ "left"
213
+ when Wx::SF::Shape::Handle::RIGHT
214
+ "right"
215
+ when Wx::SF::Shape::Handle::LEFTBOTTOM
216
+ "left-bottom"
217
+ when Wx::SF::Shape::Handle::BOTTOM
218
+ "bottom"
219
+ when Wx::SF::Shape::Handle::RIGHTBOTTOM
220
+ "right-bottom"
221
+ when Wx::SF::Shape::Handle::LINECTRL
222
+ "line-control"
223
+ else
224
+ ''
225
+ end
226
+
227
+ @text_log.append_text("%s, Shape ID: %d, Handle type: %d (%s), Delta: %d,%d\n" % [
228
+ @event_type_info[event.get_event_type],
229
+ event.get_id,
230
+ event.get_handle.get_type,
231
+ hnd_type,
232
+ event.get_handle.get_delta.x,
233
+ event.get_handle.get_delta.y])
234
+ end
235
+ end
236
+
237
+ def on_shape_key_event(event)
238
+ if @log_menu.is_checked(ID::MenuLogKeyEvent)
239
+ @text_log.append_text("%s, Shape ID: %d, Key code: %d\n" % [
240
+ @event_type_info[event.get_event_type],
241
+ event.get_id,
242
+ event.get_key_code])
243
+ end
244
+ end
245
+
246
+ def on_shape_child_drop_event(event)
247
+ if @log_menu.is_checked(ID::MenuLogChildDropEvent)
248
+ @text_log.append_text("%s, Shape ID: %d, Child ID: %d\n" % [
249
+ @event_type_info[event.get_event_type],
250
+ event.get_id,
251
+ event.get_child_shape.get_id])
252
+ end
253
+ end
254
+
255
+ def on_line_finished(event)
256
+ event.get_shape.add_style(Wx::SF::Shape::STYLE::EMIT_EVENTS) if event.get_shape
257
+ end
258
+
259
+ end
260
+
261
+ Wx::App.run do
262
+ SFSample1Frame.new('wxShapeFramework Sample 1').show
263
+ 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,133 @@
1
+ # Wx::SF - Sample2
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+ require_relative 'sample_shape'
6
+ require_relative 'sample_canvas'
7
+
8
+ class SFSample2Frame < Wx::Frame
9
+
10
+ class LOGTYPE < Wx::Enum
11
+ MouseEvent = self.new(1002)
12
+ HandleEvent = self.new(1003)
13
+ KeyEvent = self.new(1004)
14
+ ChildDropEvent = self.new(1005)
15
+ end
16
+
17
+ class << self
18
+ def log(logtype, msg)
19
+ main_frame = Wx.get_app.get_top_window
20
+
21
+ if main_frame.log_menu.is_checked(logtype.to_i)
22
+ main_frame.text_log.append_text(msg)
23
+ end
24
+ end
25
+ end
26
+
27
+ module ID
28
+ MenuQuit = 1000
29
+ MenuAbout = 1001
30
+ MenuLogMouseEvent = 1002
31
+ MenuLogHandleEvent = 1003
32
+ MenuLogKeyEvent = 1004
33
+ MenuLogChildDropEvent = 1005
34
+ end
35
+
36
+ def initialize(title)
37
+ super(nil, Wx::StandardID::ID_ANY, title, size: [800,600])
38
+
39
+ self.icon = Wx::Icon(:sample)
40
+
41
+ evt_close :on_close
42
+
43
+ if Wx.has_feature?(:USE_MENUS)
44
+ # create a menu bar
45
+ mbar = Wx::MenuBar.new
46
+ file_menu = Wx::Menu.new
47
+ file_menu.append(ID::MenuQuit, "&Quit\tAlt-F4", "Quit the application")
48
+ mbar.append(file_menu, "&File")
49
+
50
+ @log_menu = Wx::Menu.new
51
+ @log_menu.append_check_item(ID::MenuLogMouseEvent, "Log &mouse events")
52
+ @log_menu.append_check_item(ID::MenuLogHandleEvent, "Log &handle events")
53
+ @log_menu.append_check_item(ID::MenuLogKeyEvent, "Log &keyboard events")
54
+ @log_menu.append_check_item(ID::MenuLogChildDropEvent, "Log &child drop event")
55
+ mbar.append(@log_menu, "&Log")
56
+
57
+ help_menu = Wx::Menu.new
58
+ help_menu.append(ID::MenuAbout, "&About\tF1", "Show info about this application")
59
+ mbar.append(help_menu, "&Help")
60
+
61
+ self.menu_bar = mbar
62
+
63
+ evt_menu(ID::MenuQuit, :on_quit)
64
+ evt_menu(ID::MenuAbout, :on_about)
65
+ end # wxUSE_MENUS
66
+
67
+ main_sizer = Wx::FlexGridSizer.new(2, 0, 0, 0)
68
+ main_sizer.add_growable_col(0)
69
+ main_sizer.add_growable_row(0)
70
+ main_sizer.set_flexible_direction(Wx::Orientation::BOTH)
71
+ main_sizer.set_non_flexible_grow_mode(Wx::FlexSizerGrowMode::FLEX_GROWMODE_SPECIFIED)
72
+
73
+ @diagram = Wx::SF::Diagram.new
74
+ # set some diagram manager properties if necessary...
75
+ # set accepted shapes (accept only Wx::SF::RectShape)
76
+ @diagram.clear_accepted_shapes
77
+ @diagram.accept_shape(SampleShape)
78
+
79
+ # create shape canvas and associate it with shape manager
80
+ @canvas = SampleCanvas.new(@diagram, self)
81
+
82
+ main_sizer.add(@canvas, 1, Wx::EXPAND, 0)
83
+
84
+ @text_log = Wx::TextCtrl.new(self, size: [-1, 150], style: Wx::TE_MULTILINE)
85
+ @text_log.set_font(Wx::Font.new(8, Wx::FONTFAMILY_SWISS, Wx::FONTSTYLE_NORMAL, Wx::FONTWEIGHT_NORMAL, false, 'Sans'))
86
+ @text_log.set_min_size(Wx::Size.new(-1, 150))
87
+
88
+ main_sizer.add(@text_log, 0, Wx::EXPAND, 0)
89
+
90
+ if Wx.has_feature?(:USE_STATUSBAR)
91
+ # create a status bar with some information about the used wxWidgets version
92
+ create_status_bar(2)
93
+ set_status_text('Hello wxRuby ShapeFramework user!',0)
94
+ set_status_text("wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM} (wxWidgets #{Wx::WXWIDGETS_VERSION})", 1)
95
+ end # wxUSE_STATUSBAR
96
+
97
+ set_sizer(main_sizer)
98
+ layout
99
+ center
100
+ end
101
+
102
+ attr_reader :log_menu, :text_log
103
+
104
+ # Window event handlers
105
+
106
+ def on_close(_event)
107
+ destroy
108
+ end
109
+
110
+ def on_quit(_event)
111
+ destroy
112
+ end
113
+
114
+ def on_about(_event)
115
+ msg = "wxRuby ShapeFramework #{Wx::SF::VERSION}\n(wxRuby #{Wx::WXRUBY_VERSION} #{Wx::PLATFORM}; #{Wx::WXWIDGETS_VERSION})\n\n"
116
+
117
+ msg += "Welcome to wxRuby ShapeFramework Sample1 (c) Martin Corino, 2023\n"
118
+ msg += "(ported from wxSFShapeFramework original (c) Michal Bliznak, 2007 - 2013)\n\n"
119
+ msg += "Sample demonstrates basic Wx::SF functionality.\n"
120
+ msg += "wxRuby SF event handlers are overridden in user-defined canvas and shape class.\n\n"
121
+ msg += "Usage:\n"
122
+ msg += " - Left mouse click operates with inserted shapes\n"
123
+ msg += " - Right mouse click inserts a rectangular shape to the canvas\n"
124
+ msg += " - DEL key removes selected shape\n"
125
+
126
+ Wx.message_box(msg, "wxRuby ShapeFramework Sample 2")
127
+ end
128
+
129
+ end
130
+
131
+ Wx::App.run do
132
+ SFSample2Frame.new('wxShapeFramework Sample 1').show
133
+ end
@@ -0,0 +1,35 @@
1
+ # Wx::SF - Sample2 SampleCanvas class
2
+ # Copyright (c) M.J.N. Corino, The Netherlands
3
+
4
+ require 'wx/shapes'
5
+
6
+ class SampleCanvas < Wx::SF::ShapeCanvas
7
+ def initialize(diagram, parent)
8
+ super
9
+ add_style(STYLE::GRID_SHOW)
10
+ add_style(STYLE::GRID_USE)
11
+ end
12
+
13
+ # override required wxSF virtual functions
14
+ def on_left_down(event)
15
+ # HINT: perform your user actions here...
16
+
17
+ # perform standard operations
18
+ super
19
+ end
20
+
21
+ def on_right_down(event)
22
+ # HINT: perform your user actions here...
23
+
24
+ # add new custom shape to the diagram ...
25
+ _, shape = get_diagram.create_shape(SampleShape, event.get_position)
26
+ # set some shape's properties...
27
+ if shape
28
+ # set accepted child shapes for the new shape
29
+ shape.accept_child(SampleShape)
30
+ end
31
+
32
+ # perform standard operations
33
+ super
34
+ end
35
+ end