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.
- checksums.yaml +7 -0
- data/.yardopts +12 -0
- data/CREDITS.md +18 -0
- data/INSTALL.md +39 -0
- data/LICENSE +21 -0
- data/README.md +118 -0
- data/assets/screenshot.png +0 -0
- data/bin/wx-shapes +9 -0
- data/lib/wx/shapes/arrow_base.rb +86 -0
- data/lib/wx/shapes/arrows/circle_arrow.rb +39 -0
- data/lib/wx/shapes/arrows/diamond_arrow.rb +33 -0
- data/lib/wx/shapes/arrows/open_arrow.rb +56 -0
- data/lib/wx/shapes/arrows/solid_arrow.rb +69 -0
- data/lib/wx/shapes/art/shape_canvas/page.xpm +73 -0
- data/lib/wx/shapes/auto_layout.rb +358 -0
- data/lib/wx/shapes/base.rb +33 -0
- data/lib/wx/shapes/canvas_history.rb +84 -0
- data/lib/wx/shapes/connection_point.rb +238 -0
- data/lib/wx/shapes/core.rb +19 -0
- data/lib/wx/shapes/diagram.rb +659 -0
- data/lib/wx/shapes/events.rb +389 -0
- data/lib/wx/shapes/printout.rb +136 -0
- data/lib/wx/shapes/serializable.rb +440 -0
- data/lib/wx/shapes/serialize/core.rb +40 -0
- data/lib/wx/shapes/serialize/id.rb +82 -0
- data/lib/wx/shapes/serialize/wx.rb +104 -0
- data/lib/wx/shapes/serializer/json.rb +258 -0
- data/lib/wx/shapes/serializer/yaml.rb +125 -0
- data/lib/wx/shapes/shape.rb +2129 -0
- data/lib/wx/shapes/shape_canvas.rb +3285 -0
- data/lib/wx/shapes/shape_data_object.rb +43 -0
- data/lib/wx/shapes/shape_handle.rb +287 -0
- data/lib/wx/shapes/shape_list.rb +161 -0
- data/lib/wx/shapes/shapes/bitmap_shape.rb +257 -0
- data/lib/wx/shapes/shapes/circle_shape.rb +136 -0
- data/lib/wx/shapes/shapes/control_shape.rb +483 -0
- data/lib/wx/shapes/shapes/curve_shape.rb +231 -0
- data/lib/wx/shapes/shapes/diamond_shape.rb +62 -0
- data/lib/wx/shapes/shapes/edit_text_shape.rb +317 -0
- data/lib/wx/shapes/shapes/ellipse_shape.rb +106 -0
- data/lib/wx/shapes/shapes/flex_grid_shape.rb +78 -0
- data/lib/wx/shapes/shapes/grid_shape.rb +404 -0
- data/lib/wx/shapes/shapes/line_shape.rb +907 -0
- data/lib/wx/shapes/shapes/multi_sel_rect.rb +214 -0
- data/lib/wx/shapes/shapes/ortho_shape.rb +357 -0
- data/lib/wx/shapes/shapes/polygon_shape.rb +294 -0
- data/lib/wx/shapes/shapes/rect_shape.rb +378 -0
- data/lib/wx/shapes/shapes/round_ortho_shape.rb +131 -0
- data/lib/wx/shapes/shapes/round_rect_shape.rb +142 -0
- data/lib/wx/shapes/shapes/square_shape.rb +119 -0
- data/lib/wx/shapes/shapes/text_shape.rb +324 -0
- data/lib/wx/shapes/thumbnail.rb +234 -0
- data/lib/wx/shapes/version.rb +12 -0
- data/lib/wx/shapes/wx.rb +29 -0
- data/lib/wx/shapes.rb +18 -0
- data/lib/wx/wx-shapes/base.rb +87 -0
- data/lib/wx/wx-shapes/cmd/sampler.rb +58 -0
- data/lib/wx/wx-shapes/cmd/test.rb +27 -0
- data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +7 -0
- data/rakelib/yard/templates/default/layout/html/setup.rb +5 -0
- data/rakelib/yard/yard/relative_markdown_links/version.rb +8 -0
- data/rakelib/yard/yard/relative_markdown_links.rb +39 -0
- data/rakelib/yard/yard-custom-templates.rb +2 -0
- data/rakelib/yard/yard-relative_markdown_links.rb +4 -0
- data/samples/demo/art/AlignBottom.xpm +35 -0
- data/samples/demo/art/AlignCenter.xpm +35 -0
- data/samples/demo/art/AlignLeft.xpm +35 -0
- data/samples/demo/art/AlignMiddle.xpm +35 -0
- data/samples/demo/art/AlignRight.xpm +35 -0
- data/samples/demo/art/AlignTop.xpm +35 -0
- data/samples/demo/art/Bitmap.xpm +25 -0
- data/samples/demo/art/Circle.xpm +22 -0
- data/samples/demo/art/Curve.xpm +21 -0
- data/samples/demo/art/Diamond.xpm +22 -0
- data/samples/demo/art/EditText.xpm +21 -0
- data/samples/demo/art/Ellipse.xpm +22 -0
- data/samples/demo/art/FixedRect.xpm +22 -0
- data/samples/demo/art/FlexGrid.xpm +22 -0
- data/samples/demo/art/GC.xpm +23 -0
- data/samples/demo/art/Grid.xpm +22 -0
- data/samples/demo/art/Line.xpm +21 -0
- data/samples/demo/art/NoSource.xpm +69 -0
- data/samples/demo/art/OrthoLine.xpm +21 -0
- data/samples/demo/art/Rect.xpm +22 -0
- data/samples/demo/art/RoundOrthoLine.xpm +21 -0
- data/samples/demo/art/RoundRect.xpm +22 -0
- data/samples/demo/art/Shadow.xpm +23 -0
- data/samples/demo/art/StandAloneLine.xpm +22 -0
- data/samples/demo/art/Text.xpm +21 -0
- data/samples/demo/art/Tool.xpm +23 -0
- data/samples/demo/art/sample.xpm +251 -0
- data/samples/demo/demo.rb +658 -0
- data/samples/demo/frame_canvas.rb +422 -0
- data/samples/demo/images/motyl.bmp +0 -0
- data/samples/demo/images/motyl2.bmp +0 -0
- data/samples/sample1/art/sample.xpm +251 -0
- data/samples/sample1/sample.rb +263 -0
- data/samples/sample2/art/sample.xpm +251 -0
- data/samples/sample2/sample.rb +133 -0
- data/samples/sample2/sample_canvas.rb +35 -0
- data/samples/sample2/sample_shape.rb +108 -0
- data/samples/sample3/art/sample.xpm +251 -0
- data/samples/sample3/sample.rb +281 -0
- data/samples/sample4/art/sample.xpm +251 -0
- data/samples/sample4/sample.rb +180 -0
- data/tests/art/motyl.bmp +0 -0
- data/tests/lib/wxapp_runner.rb +64 -0
- data/tests/serializer_tests.rb +521 -0
- data/tests/test_grid_shapes.rb +42 -0
- data/tests/test_serialize.rb +7 -0
- data/tests/test_serialize_yaml.rb +17 -0
- metadata +242 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Wx::SF::Thumbnail - canvas thumbnail class
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
|
|
4
|
+
module Wx::SF
|
|
5
|
+
|
|
6
|
+
class Thumbnail < Wx::Panel
|
|
7
|
+
|
|
8
|
+
# Internally used IDs
|
|
9
|
+
module ID
|
|
10
|
+
include Wx::IDHelper
|
|
11
|
+
UPDATETIMER = self.next_id
|
|
12
|
+
M_SHOWELEMENTS = self.next_id
|
|
13
|
+
M_SHOWCONNECTIONS = self.next_id
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Thumbnail style
|
|
17
|
+
class THUMBSTYLE < Wx::Enum
|
|
18
|
+
# Show diagram elements (excluding connections) in the thumbnail.
|
|
19
|
+
SHOW_ELEMENTS = self.new(1)
|
|
20
|
+
# Show diagram connections in the thumbnail.
|
|
21
|
+
SHOW_CONNECTIONS = self.new(2)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize(parent)
|
|
25
|
+
super(parent, Wx::ID_ANY, size: [200, 150], style: Wx::TAB_TRAVERSAL | Wx::FULL_REPAINT_ON_RESIZE)
|
|
26
|
+
set_extra_style(Wx::WS_EX_BLOCK_EVENTS)
|
|
27
|
+
set_size_hints([10, 10])
|
|
28
|
+
|
|
29
|
+
@canvas = nil
|
|
30
|
+
@scale = 1.0
|
|
31
|
+
@thumb_style = THUMBSTYLE::SHOW_ELEMENTS | THUMBSTYLE::SHOW_CONNECTIONS
|
|
32
|
+
@prev_mouse_pos = nil
|
|
33
|
+
|
|
34
|
+
@update_timer = Wx::Timer.new(self, ID::UPDATETIMER)
|
|
35
|
+
|
|
36
|
+
set_background_style(Wx::BG_STYLE_PAINT)
|
|
37
|
+
|
|
38
|
+
evt_paint :_on_paint
|
|
39
|
+
evt_erase_background :_on_erase_background
|
|
40
|
+
evt_motion :_on_mouse_move
|
|
41
|
+
evt_left_down :_on_left_down
|
|
42
|
+
evt_right_down :_on_right_down
|
|
43
|
+
evt_timer(ID::UPDATETIMER, :_on_timer)
|
|
44
|
+
evt_update_ui(ID::M_SHOWELEMENTS, :_on_update_show_elements)
|
|
45
|
+
evt_update_ui(ID::M_SHOWCONNECTIONS, :_on_update_show_connections)
|
|
46
|
+
evt_menu(ID::M_SHOWELEMENTS, :_on_show_elements)
|
|
47
|
+
evt_menu(ID::M_SHOWCONNECTIONS, :_on_show_connections)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Access (get/set) thumbnail style.
|
|
51
|
+
attr_accessor :thumb_style
|
|
52
|
+
|
|
53
|
+
# Set canvas managed by the thumbnail.
|
|
54
|
+
# @param [ShapeCanvas] canvas shape canvas
|
|
55
|
+
def set_canvas(canvas)
|
|
56
|
+
@canvas = canvas
|
|
57
|
+
|
|
58
|
+
if @canvas
|
|
59
|
+
@update_timer.start(100)
|
|
60
|
+
else
|
|
61
|
+
@update_timer.stop
|
|
62
|
+
refresh(false)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Implementation of drawing of the thumbnail's content. This virtual function can be overridden
|
|
67
|
+
# by the user for customization of the thumbnail appearance.
|
|
68
|
+
# @param [Wx::DC] dc Reference to output device context
|
|
69
|
+
def draw_content(dc)
|
|
70
|
+
# HINT: overload it for custom actions...
|
|
71
|
+
bmp_pen = nil
|
|
72
|
+
@canvas.get_diagram.get_all_shapes.each do |shape|
|
|
73
|
+
if (@thumb_style & THUMBSTYLE::SHOW_CONNECTIONS) != 0 && shape.is_a?(LineShape)
|
|
74
|
+
shape.draw(dc, WITHOUTCHILDREN)
|
|
75
|
+
elsif (@thumb_style & THUMBSTYLE::SHOW_ELEMENTS) != 0
|
|
76
|
+
if shape.is_a?(BitmapShape)
|
|
77
|
+
bmp_pen ||= Wx::Pen.new(Wx::BLACK, 1, Wx::PENSTYLE_DOT)
|
|
78
|
+
dc.with_pen(bmp_pen) do
|
|
79
|
+
dc.with_brush(Wx::WHITE_BRUSH) do
|
|
80
|
+
dc.draw_rectangle(shape.get_bounding_box)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
elsif !shape.is_a?(LineShape)
|
|
84
|
+
shape.draw(dc, WITHOUTCHILDREN)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
protected
|
|
91
|
+
|
|
92
|
+
# Internally used event handler.
|
|
93
|
+
# @param [Wx::PaintEvent] _event
|
|
94
|
+
def _on_paint(_event)
|
|
95
|
+
paint_buffered do |dc|
|
|
96
|
+
# clear background
|
|
97
|
+
dc.set_background(Wx::Brush.new(Wx::Colour.new(150, 150, 150)))
|
|
98
|
+
dc.clear
|
|
99
|
+
|
|
100
|
+
if @canvas
|
|
101
|
+
sz_canvas = @canvas.get_client_size
|
|
102
|
+
vsx, vsy = @canvas.get_virtual_size
|
|
103
|
+
sz_canvas_offset = get_canvas_offset
|
|
104
|
+
sz_thumb = get_client_size
|
|
105
|
+
|
|
106
|
+
# scale and copy bitmap to DC
|
|
107
|
+
cx = vsx.to_f
|
|
108
|
+
cy = vsy.to_f
|
|
109
|
+
tx = sz_thumb.x
|
|
110
|
+
ty = sz_thumb.y
|
|
111
|
+
|
|
112
|
+
if (tx/ty) > (cx/cy)
|
|
113
|
+
@scale = ty/cy
|
|
114
|
+
else
|
|
115
|
+
@scale = tx/cx
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# draw virtual canvas area
|
|
119
|
+
dc.with_pen(Wx::WHITE_PEN) do
|
|
120
|
+
dc.with_brush(Wx::Brush.new(Wx::Colour.new(240, 240, 240))) do
|
|
121
|
+
dc.draw_rectangle(0, 0, (cx*@scale).to_i, (cy*@scale).to_i)
|
|
122
|
+
|
|
123
|
+
# draw top level shapes
|
|
124
|
+
Wx::ScaledDC.draw_on(dc, @scale * @canvas.get_scale) do |sdc|
|
|
125
|
+
draw_content(sdc)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# draw canvas client area
|
|
129
|
+
dc.set_pen(Wx::RED_PEN)
|
|
130
|
+
dc.set_brush(Wx::TRANSPARENT_BRUSH)
|
|
131
|
+
dc.draw_rectangle((sz_canvas_offset.x.to_f*@scale).to_i, (sz_canvas_offset.y.to_f*@scale).to_i, (sz_canvas.x.to_f*@scale).to_i, (sz_canvas.y.to_f*@scale).to_i)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
dc.set_background(Wx::NULL_BRUSH)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Get offset (view start) of managed shape canvas defined in pixels.
|
|
141
|
+
# @return [Wx::Size] Canvas offset in pixels
|
|
142
|
+
def get_canvas_offset
|
|
143
|
+
if @canvas
|
|
144
|
+
ux, uy = @canvas.get_scroll_pixels_per_unit
|
|
145
|
+
offset_x, offset_y = @canvas.get_view_start
|
|
146
|
+
|
|
147
|
+
return Wx::Size.new(offset_x*ux, offset_y*uy)
|
|
148
|
+
end
|
|
149
|
+
Wx::Size.new
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
private
|
|
153
|
+
|
|
154
|
+
# Internally used event handler.
|
|
155
|
+
# @param [Wx::EraseEvent] _event
|
|
156
|
+
def _on_erase_background(_event)
|
|
157
|
+
# noop
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Internally used event handler.
|
|
161
|
+
# @param [Wx::MouseEvent] event
|
|
162
|
+
def _on_mouse_move(event)
|
|
163
|
+
if @canvas && is_shown && event.dragging
|
|
164
|
+
ux, uy = @canvas.get_scroll_pixels_per_unit
|
|
165
|
+
|
|
166
|
+
sz_delta = @prev_mouse_pos ? event.get_position - @prev_mouse_pos : event.get_position
|
|
167
|
+
sz_canvas_offset = get_canvas_offset
|
|
168
|
+
|
|
169
|
+
@canvas.scroll(((sz_delta.x/@scale + sz_canvas_offset.x)/ux).to_i, ((sz_delta.y/@scale + sz_canvas_offset.y)/uy).to_i)
|
|
170
|
+
|
|
171
|
+
@prev_mouse_pos = event.get_position
|
|
172
|
+
|
|
173
|
+
refresh(false)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Internally used event handler.
|
|
178
|
+
# @param [Wx::MouseEvent] event
|
|
179
|
+
def _on_left_down(event)
|
|
180
|
+
@prev_mouse_pos = event.get_position
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Internally used event handler.
|
|
184
|
+
# @param [Wx::MouseEvent] event
|
|
185
|
+
def _on_right_down(event)
|
|
186
|
+
menu_popup = Wx::Menu.new
|
|
187
|
+
|
|
188
|
+
menu_popup.append_check_item(IDM_SHOWELEMENTS, 'Show elements')
|
|
189
|
+
menu_popup.append_check_item(IDM_SHOWCONNECTIONS, 'Show connections')
|
|
190
|
+
|
|
191
|
+
popup_menu(menu_popup, event.get_position)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Internally used event handler.
|
|
195
|
+
# @param [Wx::TimerEvent] _event
|
|
196
|
+
def _on_timer(_event)
|
|
197
|
+
refresh(false) if @canvas && is_shown
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Internally used event handler.
|
|
201
|
+
# @param [Wx::CommandEvent] _event
|
|
202
|
+
def _on_show_elements(_event)
|
|
203
|
+
if (@thumb_style & THUMBSTYLE::SHOW_ELEMENTS) != 0
|
|
204
|
+
@thumb_style &= ~THUMBSTYLE::SHOW_ELEMENTS
|
|
205
|
+
else
|
|
206
|
+
@thumb_style |= THUMBSTYLE::SHOW_ELEMENTS
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Internally used event handler.
|
|
211
|
+
# @param [Wx::CommandEvent] _event
|
|
212
|
+
def _on_show_connections(_event)
|
|
213
|
+
if (@thumb_style & THUMBSTYLE::SHOW_CONNECTIONS) != 0
|
|
214
|
+
@thumb_style &= ~THUMBSTYLE::SHOW_CONNECTIONS
|
|
215
|
+
else
|
|
216
|
+
@thumb_style |= THUMBSTYLE::SHOW_CONNECTIONS
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Internally used event handler.
|
|
221
|
+
# @param [Wx::UpdateUIEvent] event
|
|
222
|
+
def _on_update_show_elements(event)
|
|
223
|
+
event.check((@thumb_style & THUMBSTYLE::SHOW_ELEMENTS) != 0)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Internally used event handler.
|
|
227
|
+
# @param [Wx::UpdateUIEvent] event
|
|
228
|
+
def _on_update_show_connections(event)
|
|
229
|
+
event.check((@thumb_style & THUMBSTYLE::SHOW_CONNECTIONS) != 0)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
end
|
data/lib/wx/shapes/wx.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Wx - extensions
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
|
|
4
|
+
module Wx
|
|
5
|
+
|
|
6
|
+
class Wx::RealPoint
|
|
7
|
+
|
|
8
|
+
# Returns distance from this point to given point.
|
|
9
|
+
# @param [Wx::RealPoint,Wx::Point,Array(Integer,Integer)] pt2
|
|
10
|
+
# @return [Float] distance to given point
|
|
11
|
+
def distance_to(pt2)
|
|
12
|
+
if Array === pt2 && pt2.size == 2
|
|
13
|
+
to_x, to_y = pt2
|
|
14
|
+
else
|
|
15
|
+
to_x = pt2.x; to_y = pt2.y
|
|
16
|
+
end
|
|
17
|
+
Math.sqrt((to_x - self.x)*(to_x - self.x) + (to_y - self.y)*(to_y - self.y))
|
|
18
|
+
end
|
|
19
|
+
alias :distance :distance_to
|
|
20
|
+
|
|
21
|
+
# Returns this point as a Wx::Size
|
|
22
|
+
# @return [Wx::Size]
|
|
23
|
+
def to_size
|
|
24
|
+
Wx::Size.new(self.x.to_i, self.y.to_i)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
data/lib/wx/shapes.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Wx::SF loader for wxRuby3/Shapes
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
|
|
4
|
+
require 'wx/core'
|
|
5
|
+
require 'wx/prt'
|
|
6
|
+
|
|
7
|
+
require 'wx/shapes/version'
|
|
8
|
+
require 'wx/shapes/core'
|
|
9
|
+
require 'wx/shapes/wx'
|
|
10
|
+
require 'wx/shapes/base'
|
|
11
|
+
require 'wx/shapes/serializable'
|
|
12
|
+
require 'wx/shapes/connection_point'
|
|
13
|
+
require 'wx/shapes/shape_list'
|
|
14
|
+
require 'wx/shapes/shape'
|
|
15
|
+
require 'wx/shapes/events'
|
|
16
|
+
require 'wx/shapes/diagram'
|
|
17
|
+
require 'wx/shapes/auto_layout'
|
|
18
|
+
require 'wx/shapes/thumbnail'
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# wx-shapes command handler base
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
|
|
4
|
+
require 'optparse'
|
|
5
|
+
require "rbconfig"
|
|
6
|
+
|
|
7
|
+
module WxShapes
|
|
8
|
+
|
|
9
|
+
RUBY = ENV["RUBY"] || File.join(
|
|
10
|
+
RbConfig::CONFIG["bindir"],
|
|
11
|
+
RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]).sub(/.*\s.*/m, '"\&"')
|
|
12
|
+
|
|
13
|
+
module Commands
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
|
|
17
|
+
def commands
|
|
18
|
+
@commands ||= ::Hash.new do |hash, key|
|
|
19
|
+
STDERR.puts "Unknown command #{key} specified."
|
|
20
|
+
exit(1)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
private :commands
|
|
24
|
+
|
|
25
|
+
def options
|
|
26
|
+
@options ||= {
|
|
27
|
+
:verbose => false
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
private :options
|
|
31
|
+
|
|
32
|
+
def register(cmdid, cmdhandler)
|
|
33
|
+
commands[cmdid.to_s] = case
|
|
34
|
+
when Proc === cmdhandler || Method === cmdhandler
|
|
35
|
+
cmdhandler
|
|
36
|
+
when cmdhandler.respond_to?(:run)
|
|
37
|
+
Proc.new { |args| cmdhandler.run(args) }
|
|
38
|
+
else
|
|
39
|
+
raise RuntimeError, "Invalid wx-shapes command handler : #{cmdhandler}"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def describe_all
|
|
44
|
+
puts " wx-shapes commands:"
|
|
45
|
+
commands.each do |id, cmd|
|
|
46
|
+
puts
|
|
47
|
+
puts cmd.call(:describe)
|
|
48
|
+
end
|
|
49
|
+
puts
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def run(cmdid, args)
|
|
53
|
+
commands[cmdid.to_s].call(args)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def parse_args(args)
|
|
57
|
+
opts = OptionParser.new
|
|
58
|
+
opts.banner = "Usage: wx-shapes [global options] COMMAND [arguments]\n\n" +
|
|
59
|
+
" COMMAND\t\t\tSpecifies wx-shapes command to execute."
|
|
60
|
+
opts.separator ''
|
|
61
|
+
opts.on('-v', '--verbose',
|
|
62
|
+
'Show verbose output') { |v| ::WxShapes::Commands.options[:verbose] = true }
|
|
63
|
+
opts.on('-h', '--help',
|
|
64
|
+
'Show this message.') do |v|
|
|
65
|
+
puts opts
|
|
66
|
+
puts
|
|
67
|
+
describe_all
|
|
68
|
+
exit(0)
|
|
69
|
+
end
|
|
70
|
+
opts.raise_unknown = false
|
|
71
|
+
opts.parse!(args)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.run(argv = ARGV)
|
|
77
|
+
# parse global options (upto first command)
|
|
78
|
+
argv = WxShapes::Commands.parse_args(argv)
|
|
79
|
+
while !argv.empty?
|
|
80
|
+
WxShapes::Commands.run(argv.shift, argv)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
Dir[File.join(__dir__, 'cmd', '*.rb')].each do |file|
|
|
86
|
+
require file
|
|
87
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# wx-shapes sampler command handler
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
#--------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
|
|
7
|
+
module WxShapes
|
|
8
|
+
module Commands
|
|
9
|
+
class Sampler
|
|
10
|
+
OPTIONS = {
|
|
11
|
+
save_path: nil
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def self.description
|
|
15
|
+
" sampler help|[SAMPLE [copy PATH]]\tRun wxRuby3/Shapes sample application (or copy sample)."
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.run(argv)
|
|
19
|
+
if argv == :describe
|
|
20
|
+
description
|
|
21
|
+
else
|
|
22
|
+
arg = argv.shift || 'demo'
|
|
23
|
+
if arg == 'help'
|
|
24
|
+
puts "Usage: wx-shapes [global options] sampler help|[SAMPLE [copy PATH]]\n\n" +
|
|
25
|
+
"\twhere SAMPLE := optional name of the sample to run or copy (sample1/2/3/4 or demo; default is 'demo')\n" +
|
|
26
|
+
"\t PATH := optional path to copy sample to"
|
|
27
|
+
else
|
|
28
|
+
if arg != 'copy'
|
|
29
|
+
sample = arg
|
|
30
|
+
arg = argv.shift
|
|
31
|
+
else
|
|
32
|
+
sample = 'demo'
|
|
33
|
+
end
|
|
34
|
+
sample_dir = File.join(WxShapes::ROOT, 'samples', sample)
|
|
35
|
+
unless File.directory?(sample_dir)
|
|
36
|
+
STDERR.puts "ERROR: Unknown sample #{sample}"
|
|
37
|
+
exit(1)
|
|
38
|
+
end
|
|
39
|
+
if arg == 'copy'
|
|
40
|
+
dest = argv.shift
|
|
41
|
+
unless dest && File.directory?(dest)
|
|
42
|
+
STDERR.puts "ERROR: Invalid destination folder #{dest}"
|
|
43
|
+
exit(1)
|
|
44
|
+
end
|
|
45
|
+
Dir[File.join(sample_dir, '*')].each do |fp|
|
|
46
|
+
FileUtils.cp_r(fp, dest, verbose: true)
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
exec(RUBY, File.join(sample_dir, sample.gsub(/\d+/, '')+'.rb'))
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
self.register('sampler', Sampler)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# wx-shapes unit test command handler
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
#--------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
|
|
7
|
+
module WxShapes
|
|
8
|
+
module Commands
|
|
9
|
+
class Test
|
|
10
|
+
def self.description
|
|
11
|
+
" test\t\t\tRun wxRuby3/Shapes regression tests."
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.run(argv)
|
|
15
|
+
if argv == :describe
|
|
16
|
+
description
|
|
17
|
+
else
|
|
18
|
+
Dir[File.join(WxShapes::ROOT, 'tests', 'test_*.rb')].each do |test|
|
|
19
|
+
system(RUBY, test)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
self.register('test', Test)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "nokogiri"
|
|
4
|
+
require "uri"
|
|
5
|
+
require "yard"
|
|
6
|
+
require_relative 'relative_markdown_links/version'
|
|
7
|
+
|
|
8
|
+
module YARD # rubocop:disable Style/Documentation
|
|
9
|
+
# GitHub and YARD render Markdown files differently. In particular, relative
|
|
10
|
+
# links between Markdown files that work in GitHub don't work in YARD.
|
|
11
|
+
# For example, if you have `[hello](FOO.md)` in your README, YARD renders it
|
|
12
|
+
# as `<a href="FOO.md">hello</a>`, creating a broken link in your docs.
|
|
13
|
+
#
|
|
14
|
+
# With this plugin enabled, you'll get `<a href="file.FOO.html">hello</a>`
|
|
15
|
+
# instead, which correctly links through to the rendered HTML file.
|
|
16
|
+
module RelativeMarkdownLinks
|
|
17
|
+
# Resolves relative links from Markdown files.
|
|
18
|
+
# @param [String] text the HTML fragment in which to resolve links.
|
|
19
|
+
# @return [String] HTML with relative links to extra files converted to `{file:}` links.
|
|
20
|
+
def resolve_links(text)
|
|
21
|
+
html = Nokogiri::HTML.fragment(text)
|
|
22
|
+
html.css("a[href]").each do |link|
|
|
23
|
+
href = URI(link["href"])
|
|
24
|
+
|
|
25
|
+
if href.relative? && options.files
|
|
26
|
+
fnames = options.files.map(&:filename)
|
|
27
|
+
if fnames.include?(href.path)
|
|
28
|
+
link.replace "{file:#{href} #{link.inner_html}}"
|
|
29
|
+
elsif href.path.end_with?('_md.html') && (fname = fnames.find {|fnm| fnm.end_with?(href.path.sub(/_md.html\Z/, '.md')) })
|
|
30
|
+
link.replace "{file:#{fname} #{link.inner_html}}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
super(html.to_s)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
Templates::Template.extra_includes << RelativeMarkdownLinks
|
|
39
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* XPM */
|
|
2
|
+
static const char * AlignBottom_xpm[] = {
|
|
3
|
+
"16 16 16 1",
|
|
4
|
+
" c #000000",
|
|
5
|
+
". c #800000",
|
|
6
|
+
"+ c #008000",
|
|
7
|
+
"@ c #808000",
|
|
8
|
+
"# c #000080",
|
|
9
|
+
"$ c #800080",
|
|
10
|
+
"% c None",
|
|
11
|
+
"& c #808080",
|
|
12
|
+
"* c #C0C0C0",
|
|
13
|
+
"= c #FF0000",
|
|
14
|
+
"- c #00FF00",
|
|
15
|
+
"; c #FFFF00",
|
|
16
|
+
"> c #0000FF",
|
|
17
|
+
", c #FF00FF",
|
|
18
|
+
"' c #00FFFF",
|
|
19
|
+
") c #FFFFFF",
|
|
20
|
+
"%%%%%%%%%%%%%%%%",
|
|
21
|
+
"%%%%%%%%%%%%%%%%",
|
|
22
|
+
"%%%%%%%%%%%%%%%%",
|
|
23
|
+
"%%%%%%%% %%",
|
|
24
|
+
"%%%%%%%% )))) %%",
|
|
25
|
+
"%%%%%%%% )))) %%",
|
|
26
|
+
"%%%%%%%% )))) %%",
|
|
27
|
+
"%% % )))) %%",
|
|
28
|
+
"%% ))) % )))) %%",
|
|
29
|
+
"%% ))) % )))) %%",
|
|
30
|
+
"%% ))) % )))) %%",
|
|
31
|
+
"%% ))) % )))) %%",
|
|
32
|
+
"%% ))) % )))) %%",
|
|
33
|
+
"% %",
|
|
34
|
+
"%%%%%%%%%%%%%%%%",
|
|
35
|
+
"%%%%%%%%%%%%%%%%"};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* XPM */
|
|
2
|
+
static const char * AlignCenter_xpm[] = {
|
|
3
|
+
"16 16 16 1",
|
|
4
|
+
" c #000000",
|
|
5
|
+
". c #800000",
|
|
6
|
+
"+ c #008000",
|
|
7
|
+
"@ c #808000",
|
|
8
|
+
"# c #000080",
|
|
9
|
+
"$ c #800080",
|
|
10
|
+
"% c None",
|
|
11
|
+
"& c #808080",
|
|
12
|
+
"* c #C0C0C0",
|
|
13
|
+
"= c #FF0000",
|
|
14
|
+
"- c #00FF00",
|
|
15
|
+
"; c #FFFF00",
|
|
16
|
+
"> c #0000FF",
|
|
17
|
+
", c #FF00FF",
|
|
18
|
+
"' c #00FFFF",
|
|
19
|
+
") c #FFFFFF",
|
|
20
|
+
"%%%%%%%%%%%%%%%%",
|
|
21
|
+
"%%%%%%% %%%%%%%%",
|
|
22
|
+
"%%%% %%%%%",
|
|
23
|
+
"%%%% )) )) %%%%%",
|
|
24
|
+
"%%%% )) )) %%%%%",
|
|
25
|
+
"%%%% )) )) %%%%%",
|
|
26
|
+
"%%%% %%%%%",
|
|
27
|
+
"%%%%%%% %%%%%%%%",
|
|
28
|
+
"%% %%%",
|
|
29
|
+
"%% )))) )))) %%%",
|
|
30
|
+
"%% )))) )))) %%%",
|
|
31
|
+
"%% )))) )))) %%%",
|
|
32
|
+
"%% )))) )))) %%%",
|
|
33
|
+
"%% %%%",
|
|
34
|
+
"%%%%%%% %%%%%%%%",
|
|
35
|
+
"%%%%%%%%%%%%%%%%"};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* XPM */
|
|
2
|
+
static const char * AlignLeft_xpm[] = {
|
|
3
|
+
"16 16 16 1",
|
|
4
|
+
" c #000000",
|
|
5
|
+
". c #800000",
|
|
6
|
+
"+ c #008000",
|
|
7
|
+
"@ c #808000",
|
|
8
|
+
"# c #000080",
|
|
9
|
+
"$ c #800080",
|
|
10
|
+
"% c None",
|
|
11
|
+
"& c #808080",
|
|
12
|
+
"* c #C0C0C0",
|
|
13
|
+
"= c #FF0000",
|
|
14
|
+
"- c #00FF00",
|
|
15
|
+
"; c #FFFF00",
|
|
16
|
+
"> c #0000FF",
|
|
17
|
+
", c #FF00FF",
|
|
18
|
+
"' c #00FFFF",
|
|
19
|
+
") c #FFFFFF",
|
|
20
|
+
"%%%%%%%%%%%%%%%%",
|
|
21
|
+
"%% %%%%%%%%%%%%%",
|
|
22
|
+
"%% %%%%%%%",
|
|
23
|
+
"%% ))))) %%%%%%%",
|
|
24
|
+
"%% ))))) %%%%%%%",
|
|
25
|
+
"%% ))))) %%%%%%%",
|
|
26
|
+
"%% %%%%%%%",
|
|
27
|
+
"%% %%%%%%%%%%%%%",
|
|
28
|
+
"%% %%%",
|
|
29
|
+
"%% ))))))))) %%%",
|
|
30
|
+
"%% ))))))))) %%%",
|
|
31
|
+
"%% ))))))))) %%%",
|
|
32
|
+
"%% ))))))))) %%%",
|
|
33
|
+
"%% %%%",
|
|
34
|
+
"%% %%%%%%%%%%%%%",
|
|
35
|
+
"%%%%%%%%%%%%%%%%"};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* XPM */
|
|
2
|
+
static const char * AlignMiddle_xpm[] = {
|
|
3
|
+
"16 16 16 1",
|
|
4
|
+
" c #000000",
|
|
5
|
+
". c #800000",
|
|
6
|
+
"+ c #008000",
|
|
7
|
+
"@ c #808000",
|
|
8
|
+
"# c #000080",
|
|
9
|
+
"$ c #800080",
|
|
10
|
+
"% c None",
|
|
11
|
+
"& c #808080",
|
|
12
|
+
"* c #C0C0C0",
|
|
13
|
+
"= c #FF0000",
|
|
14
|
+
"- c #00FF00",
|
|
15
|
+
"; c #FFFF00",
|
|
16
|
+
"> c #0000FF",
|
|
17
|
+
", c #FF00FF",
|
|
18
|
+
"' c #00FFFF",
|
|
19
|
+
") c #FFFFFF",
|
|
20
|
+
"%%%%%%%%%%%%%%%%",
|
|
21
|
+
"%%%%%%%%%%%%%%%%",
|
|
22
|
+
"%% %%%%%%%%",
|
|
23
|
+
"%% )))) %%%%%%%%",
|
|
24
|
+
"%% )))) % %%",
|
|
25
|
+
"%% )))) % ))) %%",
|
|
26
|
+
"%% )))) % ))) %%",
|
|
27
|
+
"% %",
|
|
28
|
+
"%% )))) % ))) %%",
|
|
29
|
+
"%% )))) % ))) %%",
|
|
30
|
+
"%% )))) % %%",
|
|
31
|
+
"%% )))) %%%%%%%%",
|
|
32
|
+
"%% %%%%%%%%",
|
|
33
|
+
"%%%%%%%%%%%%%%%%",
|
|
34
|
+
"%%%%%%%%%%%%%%%%",
|
|
35
|
+
"%%%%%%%%%%%%%%%%"};
|