wxruby3-shapes 0.9.0.pre.beta.3 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/INSTALL.md +5 -7
- data/README.md +38 -6
- data/assets/logo.svg +339 -0
- data/assets/logo.xpm +60 -0
- data/assets/screenshot.png +0 -0
- data/assets/social.png +0 -0
- data/bin/wx-shapes +1 -1
- data/lib/wx/shapes/arrow_base.rb +4 -11
- data/lib/wx/shapes/arrows/circle_arrow.rb +22 -11
- data/lib/wx/shapes/arrows/circle_prong_arrow.rb +48 -0
- data/lib/wx/shapes/arrows/cross_bar_arrow.rb +57 -0
- data/lib/wx/shapes/arrows/cross_bar_circle_arrow.rb +56 -0
- data/lib/wx/shapes/arrows/cross_bar_prong_arrow.rb +49 -0
- data/lib/wx/shapes/arrows/crossed_circle.rb +46 -0
- data/lib/wx/shapes/arrows/cup_arrow.rb +65 -0
- data/lib/wx/shapes/arrows/diamond_arrow.rb +8 -13
- data/lib/wx/shapes/arrows/double_cross_bar_arrow.rb +27 -0
- data/lib/wx/shapes/arrows/filled_arrow.rb +60 -0
- data/lib/wx/shapes/arrows/line_arrow.rb +67 -0
- data/lib/wx/shapes/arrows/open_arrow.rb +22 -23
- data/lib/wx/shapes/arrows/prong_arrow.rb +42 -0
- data/lib/wx/shapes/arrows/solid_arrow.rb +21 -35
- data/lib/wx/shapes/arrows/square_arrow.rb +37 -0
- data/lib/wx/shapes/auto_layout.rb +2 -2
- data/lib/wx/shapes/base.rb +1 -1
- data/lib/wx/shapes/canvas_history.rb +20 -0
- data/lib/wx/shapes/connection_point.rb +10 -6
- data/lib/wx/shapes/diagram.rb +98 -78
- data/lib/wx/shapes/events.rb +8 -8
- data/lib/wx/shapes/printout.rb +3 -16
- data/lib/wx/shapes/serializable.rb +2 -436
- data/lib/wx/shapes/serialize/wx.rb +30 -18
- data/lib/wx/shapes/shape.rb +211 -168
- data/lib/wx/shapes/shape_canvas.rb +728 -267
- data/lib/wx/shapes/shape_data_object.rb +99 -18
- data/lib/wx/shapes/shape_handle.rb +18 -11
- data/lib/wx/shapes/shape_list.rb +34 -67
- data/lib/wx/shapes/shapes/bitmap_shape.rb +23 -24
- data/lib/wx/shapes/shapes/box_shape.rb +389 -0
- data/lib/wx/shapes/shapes/circle_shape.rb +19 -22
- data/lib/wx/shapes/shapes/control_shape.rb +77 -41
- data/lib/wx/shapes/shapes/curve_shape.rb +38 -31
- data/lib/wx/shapes/shapes/diamond_shape.rb +7 -17
- data/lib/wx/shapes/shapes/edit_text_shape.rb +6 -9
- data/lib/wx/shapes/shapes/ellipse_shape.rb +12 -15
- data/lib/wx/shapes/shapes/flex_grid_shape.rb +58 -33
- data/lib/wx/shapes/shapes/grid_shape.rb +259 -161
- data/lib/wx/shapes/shapes/line_shape.rb +155 -161
- data/lib/wx/shapes/shapes/manager_shape.rb +77 -0
- data/lib/wx/shapes/shapes/multi_sel_rect.rb +8 -8
- data/lib/wx/shapes/shapes/ortho_shape.rb +31 -36
- data/lib/wx/shapes/shapes/polygon_shape.rb +23 -29
- data/lib/wx/shapes/shapes/rect_shape.rb +95 -53
- data/lib/wx/shapes/shapes/round_ortho_shape.rb +6 -8
- data/lib/wx/shapes/shapes/round_rect_shape.rb +20 -24
- data/lib/wx/shapes/shapes/square_shape.rb +14 -17
- data/lib/wx/shapes/shapes/text_shape.rb +95 -53
- data/lib/wx/shapes/version.rb +1 -1
- data/lib/wx/shapes/wx.rb +16 -7
- data/lib/wx/wx-shapes/cmd/test.rb +1 -1
- data/samples/demo/arrows.json +1 -0
- data/samples/demo/arrows.yaml +793 -0
- data/samples/demo/art/HBox.xpm +22 -0
- data/samples/demo/art/VBox.xpm +22 -0
- data/samples/demo/art/logo.xpm +60 -0
- data/samples/demo/class.json +1 -0
- data/samples/demo/class.yaml +5631 -0
- data/samples/demo/demo.rb +301 -91
- data/samples/demo/dialogs.rb +1405 -0
- data/samples/demo/erd.json +1 -0
- data/samples/demo/erd.yaml +4072 -0
- data/samples/demo/frame_canvas.rb +409 -33
- data/samples/sample1/art/logo.xpm +60 -0
- data/samples/sample1/sample.rb +11 -11
- data/samples/sample2/art/logo.xpm +60 -0
- data/samples/sample2/sample.rb +2 -2
- data/samples/sample2/sample_shape.rb +15 -15
- data/samples/sample3/art/logo.xpm +60 -0
- data/samples/sample3/sample.rb +3 -3
- data/samples/sample4/art/logo.xpm +60 -0
- data/samples/sample4/sample.rb +2 -2
- data/tests/lib/wxapp_runner.rb +4 -0
- data/tests/serializer_tests.rb +8 -441
- data/tests/test_grid_shapes.rb +2 -2
- data/tests/test_serialize_xml.rb +17 -0
- data/tests/test_serialize_yaml.rb +2 -2
- metadata +78 -28
- data/lib/wx/shapes/serialize/core.rb +0 -40
- data/lib/wx/shapes/serialize/id.rb +0 -82
- data/lib/wx/shapes/serializer/json.rb +0 -258
- data/lib/wx/shapes/serializer/yaml.rb +0 -125
- data/samples/demo/art/sample.xpm +0 -251
- data/samples/sample1/art/sample.xpm +0 -251
- data/samples/sample2/art/sample.xpm +0 -251
- data/samples/sample3/art/sample.xpm +0 -251
- data/samples/sample4/art/sample.xpm +0 -251
@@ -0,0 +1,77 @@
|
|
1
|
+
# Wx::SF::ContainerShape - container shape mixin
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
3
|
+
|
4
|
+
module Wx::SF
|
5
|
+
|
6
|
+
# Mixin for container shape classes that control there child shape size/position/alignment.
|
7
|
+
module ManagerShape
|
8
|
+
|
9
|
+
# Returns true if the shape manages (size/position/alignment) of it's child shapes.
|
10
|
+
# @return [Boolean] true
|
11
|
+
def is_manager
|
12
|
+
true
|
13
|
+
end
|
14
|
+
alias :manager? :is_manager
|
15
|
+
|
16
|
+
# Update the shape's position in order to its alignment
|
17
|
+
def do_alignment
|
18
|
+
super
|
19
|
+
|
20
|
+
# do alignment of shape's children
|
21
|
+
do_children_layout
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def do_children_layout
|
27
|
+
raise NotImplementedError, 'Manager shapes need override'
|
28
|
+
end
|
29
|
+
|
30
|
+
# Move and resize given shape so it will fit the given bounding rectangle.
|
31
|
+
#
|
32
|
+
# The shape is aligned inside the given bounding rectangle in accordance to the shape's
|
33
|
+
# valign and halign flags.
|
34
|
+
# @param [Shape] shape modified shape
|
35
|
+
# @param [Wx::Rect] rct Bounding rectangle
|
36
|
+
# @see Shape#set_v_align
|
37
|
+
# @see Shape#set_h_align
|
38
|
+
def fit_shape_to_rect(shape, rct)
|
39
|
+
shape_bb = shape.get_bounding_box
|
40
|
+
prev_pos = shape.get_relative_position
|
41
|
+
|
42
|
+
# do vertical alignment
|
43
|
+
case shape.get_v_align
|
44
|
+
when Shape::VALIGN::TOP
|
45
|
+
shape.set_relative_position(prev_pos.x, rct.top + shape.get_v_border)
|
46
|
+
when Shape::VALIGN::MIDDLE
|
47
|
+
shape.set_relative_position(prev_pos.x, rct.top + (rct.height/2 - shape_bb.height/2))
|
48
|
+
when Shape::VALIGN::BOTTOM
|
49
|
+
shape.set_relative_position(prev_pos.x, rct.bottom - shape_bb.height - shape.get_v_border)
|
50
|
+
when Shape::VALIGN::EXPAND
|
51
|
+
shape.set_relative_position(prev_pos.x, rct.top + shape.get_v_border)
|
52
|
+
shape.scale(1.0, (rct.height - 2*shape.get_v_border).to_f/shape_bb.height)
|
53
|
+
else
|
54
|
+
shape.set_relative_position(prev_pos.x, rct.top)
|
55
|
+
end
|
56
|
+
|
57
|
+
prev_pos = shape.get_relative_position
|
58
|
+
|
59
|
+
# do horizontal alignment
|
60
|
+
case shape.get_h_align
|
61
|
+
when Shape::HALIGN::LEFT
|
62
|
+
shape.set_relative_position(rct.left + shape.get_h_border, prev_pos.y)
|
63
|
+
when Shape::HALIGN::CENTER
|
64
|
+
shape.set_relative_position(rct.left + (rct.width/2 - shape_bb.width/2), prev_pos.y)
|
65
|
+
when Shape::HALIGN::RIGHT
|
66
|
+
shape.set_relative_position(rct.right - shape_bb.width - shape.get_h_border, prev_pos.y)
|
67
|
+
when Shape::HALIGN::EXPAND
|
68
|
+
shape.set_relative_position(rct.left + shape.get_h_border, prev_pos.y)
|
69
|
+
shape.scale((rct.width - 2*shape.get_h_border).to_f/shape_bb.width, 1.0)
|
70
|
+
else
|
71
|
+
shape.set_relative_position(rct.left, prev_pos.y)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -60,7 +60,7 @@ module Wx::SF
|
|
60
60
|
lst_selection.each do |shape|
|
61
61
|
# scale main parent shape
|
62
62
|
if !shape.is_a?(LineShape)
|
63
|
-
shape.scale(sx, 1, WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
63
|
+
shape.scale(sx, 1, children: WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
64
64
|
if shape.has_style?(STYLE::POSITION_CHANGE)
|
65
65
|
dx = (shape.get_absolute_position.x - (get_absolute_position.x + DEFAULT_ME_OFFSET))/(get_rect_size.x - 2*DEFAULT_ME_OFFSET)*handle.get_delta.x
|
66
66
|
shape.move_by(dx, 0)
|
@@ -90,7 +90,7 @@ module Wx::SF
|
|
90
90
|
|
91
91
|
lst_selection.each do |shape|
|
92
92
|
if !shape.is_a?(LineShape)
|
93
|
-
if shape.has_style?(STYLE
|
93
|
+
if shape.has_style?(STYLE::POSITION_CHANGE)
|
94
94
|
if shape.get_parent_shape
|
95
95
|
shape.set_relative_position(shape.get_relative_position.x*sx, shape.get_relative_position.y)
|
96
96
|
else
|
@@ -98,7 +98,7 @@ module Wx::SF
|
|
98
98
|
shape.move_by(dx, 0)
|
99
99
|
end
|
100
100
|
end
|
101
|
-
shape.scale(sx, 1, WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
101
|
+
shape.scale(sx, 1, children: WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
102
102
|
shape.fit_to_children unless shape.has_style?(STYLE::NO_FIT_TO_CHILDREN)
|
103
103
|
else
|
104
104
|
if shape.has_style?(STYLE::POSITION_CHANGE)
|
@@ -132,7 +132,7 @@ module Wx::SF
|
|
132
132
|
shape.move_by(0, dy)
|
133
133
|
end
|
134
134
|
end
|
135
|
-
shape.scale(1, sy, WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
135
|
+
shape.scale(1, sy, children: WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
136
136
|
shape.fit_to_children unless shape.has_style?(STYLE::NO_FIT_TO_CHILDREN)
|
137
137
|
else
|
138
138
|
if shape.has_style?(STYLE::POSITION_CHANGE)
|
@@ -153,12 +153,12 @@ module Wx::SF
|
|
153
153
|
def on_bottom_handle(handle)
|
154
154
|
if get_parent_canvas && !any_height_exceeded(handle.get_delta)
|
155
155
|
sy = (get_rect_size.y - 2*DEFAULT_ME_OFFSET + handle.get_delta.y).to_f/(get_rect_size.y - 2*DEFAULT_ME_OFFSET)
|
156
|
-
|
156
|
+
|
157
157
|
lst_selection = get_parent_canvas.get_selected_shapes
|
158
158
|
|
159
159
|
lst_selection.each do |shape|
|
160
160
|
if !shape.is_a?(LineShape)
|
161
|
-
shape.scale(1, sy, WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
161
|
+
shape.scale(1, sy, children: WITHCHILDREN) if shape.has_style?(STYLE::SIZE_CHANGE)
|
162
162
|
if shape.has_style?(STYLE::POSITION_CHANGE)
|
163
163
|
dy = (shape.get_absolute_position.y - (get_absolute_position.y + DEFAULT_ME_OFFSET))/(get_rect_size.y - 2*DEFAULT_ME_OFFSET)*handle.get_delta.y
|
164
164
|
shape.move_by(0, dy)
|
@@ -187,7 +187,7 @@ module Wx::SF
|
|
187
187
|
lst_selection = get_parent_canvas.get_selected_shapes
|
188
188
|
# determine whether any shape in the selection exceeds its bounds
|
189
189
|
lst_selection.each do |shape|
|
190
|
-
return true if !shape.is_a?(LineShape) && (shape.get_bounding_box.width + delta.x)
|
190
|
+
return true if !shape.is_a?(LineShape) && (shape.get_bounding_box.width + delta.x) < 1
|
191
191
|
end
|
192
192
|
return false
|
193
193
|
end
|
@@ -202,7 +202,7 @@ module Wx::SF
|
|
202
202
|
lst_selection = get_parent_canvas.get_selected_shapes
|
203
203
|
# determine whether any shape in the selection exceeds its bounds
|
204
204
|
lst_selection.each do |shape|
|
205
|
-
return true if !shape.is_a?(LineShape) && (shape.get_bounding_box.height + delta.y)
|
205
|
+
return true if !shape.is_a?(LineShape) && (shape.get_bounding_box.height + delta.y) < 1
|
206
206
|
end
|
207
207
|
return false
|
208
208
|
end
|
@@ -11,14 +11,12 @@ module Wx::SF
|
|
11
11
|
|
12
12
|
SEGMENTCPS = ::Struct.new(:src, :trg)
|
13
13
|
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# @
|
17
|
-
#
|
18
|
-
#
|
19
|
-
|
20
|
-
# @param [Diagram] diagram containing diagram
|
21
|
-
def initialize(*args)
|
14
|
+
# Constructor
|
15
|
+
# @param [Shape] src source shape
|
16
|
+
# @param [Shape] trg target shape
|
17
|
+
# @param [Array<Wx::RealPoint>] path List of the line control points (can be empty)
|
18
|
+
# @param [Diagram] diagram containing diagram
|
19
|
+
def initialize(src = nil, trg = nil, path: nil, diagram: nil)
|
22
20
|
super
|
23
21
|
end
|
24
22
|
|
@@ -31,33 +29,33 @@ module Wx::SF
|
|
31
29
|
|
32
30
|
src = trg = cp_src = cp_trg = nil
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
cp_src = shape.get_nearest_connection_point(get_mod_src_point)
|
32
|
+
if @src_shape
|
33
|
+
cp_src = @src_shape.get_nearest_connection_point(get_mod_src_point)
|
37
34
|
end
|
38
|
-
|
39
|
-
|
40
|
-
cp_trg = shape.get_nearest_connection_point(get_mod_trg_point)
|
35
|
+
if @trg_shape
|
36
|
+
cp_trg = @trg_shape.get_nearest_connection_point(get_mod_trg_point)
|
41
37
|
end
|
42
38
|
|
43
39
|
case @mode
|
44
40
|
when LINEMODE::READY
|
45
41
|
# draw basic line parts
|
46
|
-
|
42
|
+
n = line_segment_count-1
|
43
|
+
(0..n).each do |i|
|
47
44
|
src, trg = get_line_segment(i)
|
45
|
+
# at starting (src) segment draw src arrow and get updated arrow connection point
|
46
|
+
if i == 0 && @src_arrow
|
47
|
+
asrc, atrg = get_first_subsegment(src, trg, get_used_connection_points(cp_src, cp_trg, 0))
|
48
|
+
src = @src_arrow.draw(atrg, asrc, dc)
|
49
|
+
cp_src = nil
|
50
|
+
end
|
51
|
+
# at end (tgt) segment draw tgt arrow and get updated connection point
|
52
|
+
if i == n && @trg_arrow
|
53
|
+
asrc, atrg = get_last_subsegment(src, trg, get_used_connection_points(cp_src, cp_trg, @lst_points.size))
|
54
|
+
trg = @trg_arrow.draw(asrc, atrg, dc)
|
55
|
+
cp_trg = nil
|
56
|
+
end
|
48
57
|
draw_line_segment(dc, src, trg, get_used_connection_points(cp_src, cp_trg, i))
|
49
58
|
end
|
50
|
-
# draw target arrow
|
51
|
-
if @trg_arrow
|
52
|
-
asrc, atrg = get_last_subsegment(src, trg, get_used_connection_points(cp_src, cp_trg, @lst_points.size))
|
53
|
-
@trg_arrow.draw(asrc, atrg, dc)
|
54
|
-
end
|
55
|
-
# draw source arrow
|
56
|
-
if @src_arrow
|
57
|
-
src, trg = get_line_segment(0)
|
58
|
-
asrc, atrg = get_first_subsegment(src, trg, get_used_connection_points(cp_src, cp_trg, 0))
|
59
|
-
@src_arrow.draw(atrg, asrc, dc)
|
60
|
-
end
|
61
59
|
|
62
60
|
when LINEMODE::UNDERCONSTRUCTION
|
63
61
|
# draw basic line parts
|
@@ -71,11 +69,10 @@ module Wx::SF
|
|
71
69
|
if @lst_points.size>1
|
72
70
|
draw_line_segment(dc, trg, @unfinished_point.to_real, get_used_connection_points(cp_src, cp_trg, @lst_points.size))
|
73
71
|
else
|
74
|
-
|
75
|
-
|
76
|
-
if src_shape.get_connection_points.empty?
|
72
|
+
if @src_shape
|
73
|
+
if @src_shape.get_connection_points.empty?
|
77
74
|
draw_line_segment(dc,
|
78
|
-
src_shape.get_border_point(src_shape.get_center, @unfinished_point.to_real),
|
75
|
+
@src_shape.get_border_point(@src_shape.get_center, @unfinished_point.to_real),
|
79
76
|
@unfinished_point.to_real,
|
80
77
|
get_used_connection_points(cp_src, cp_trg, 0))
|
81
78
|
else
|
@@ -133,13 +130,11 @@ module Wx::SF
|
|
133
130
|
cp_src = nil
|
134
131
|
cp_trg = nil
|
135
132
|
|
136
|
-
|
137
|
-
|
138
|
-
cp_src = shape.get_nearest_connection_point(get_mod_src_point)
|
133
|
+
if @src_shape
|
134
|
+
cp_src = @src_shape.get_nearest_connection_point(get_mod_src_point)
|
139
135
|
end
|
140
|
-
|
141
|
-
|
142
|
-
cp_trg = shape.get_nearest_connection_point(get_mod_trg_point)
|
136
|
+
if @trg_shape
|
137
|
+
cp_trg = @trg_shape.get_nearest_connection_point(get_mod_trg_point)
|
143
138
|
end
|
144
139
|
|
145
140
|
# Get all polyline segments
|
@@ -19,23 +19,14 @@ module Wx::SF
|
|
19
19
|
|
20
20
|
property :connect_to_vertex, :vertices
|
21
21
|
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# @
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
# @param [Wx::SF::Diagram] diagram parent diagram
|
29
|
-
def initialize(*args)
|
22
|
+
# Constructor.
|
23
|
+
# @param [Wx::RealPoint,Wx::Point] pos Initial position
|
24
|
+
# @param [Array<Wx::RealPoint>] vertices Array of the polygon vertices
|
25
|
+
# @param [Wx::SF::Diagram] diagram parent diagram
|
26
|
+
def initialize(pos = Shape::DEFAULT::POSITION, vertices: [], diagram: nil)
|
27
|
+
super(pos, Wx::RealPoint.new(1,1), diagram: diagram)
|
30
28
|
@connect_to_vertex = DEFAULT::VERTEXCONNECTIONS
|
31
|
-
|
32
|
-
if args.empty?
|
33
|
-
super
|
34
|
-
else
|
35
|
-
pts, pos, diagram = args
|
36
|
-
super(pos,Wx::RealPoint.new(1,1), diagram)
|
37
|
-
set_vertices(pts)
|
38
|
-
end
|
29
|
+
set_vertices(vertices)
|
39
30
|
end
|
40
31
|
|
41
32
|
# Set connecting mode.
|
@@ -104,8 +95,9 @@ module Wx::SF
|
|
104
95
|
intersection
|
105
96
|
else
|
106
97
|
success = false
|
98
|
+
min_dist = 0.0
|
107
99
|
pts.each_with_index do |pt, i|
|
108
|
-
if tmp_intersection = Wx::SF::Shape.lines_intersection(pt, pts[(i+1) % pts.size], start, end_pt)
|
100
|
+
if (tmp_intersection = Wx::SF::Shape.lines_intersection(pt, pts[(i+1) % pts.size], start, end_pt))
|
109
101
|
if !success
|
110
102
|
min_dist = intersection.distance_to(end_pt)
|
111
103
|
intersection = tmp_intersection
|
@@ -166,12 +158,14 @@ module Wx::SF
|
|
166
158
|
def fit_vertices_to_bounding_box
|
167
159
|
minx, miny, maxx, maxy = get_extents
|
168
160
|
|
169
|
-
|
170
|
-
|
161
|
+
width = (maxx - minx)
|
162
|
+
height = (maxy - miny)
|
163
|
+
sx = rect_size.x/width
|
164
|
+
sy = rect_size.y/height
|
171
165
|
|
172
166
|
@vertices.each do |pt|
|
173
|
-
pt.x
|
174
|
-
pt.y
|
167
|
+
pt.x = (width != 0.0) ? pt.x*sx : minx
|
168
|
+
pt.y = (height != 0.0) ? pt.y*sy : miny
|
175
169
|
end
|
176
170
|
end
|
177
171
|
|
@@ -227,8 +221,8 @@ module Wx::SF
|
|
227
221
|
def draw_normal(dc)
|
228
222
|
# HINT: overload it for custom actions...
|
229
223
|
|
230
|
-
dc.with_pen(
|
231
|
-
dc.with_brush(
|
224
|
+
dc.with_pen(border) do
|
225
|
+
dc.with_brush(fill) do
|
232
226
|
draw_polygon_shape(dc)
|
233
227
|
end
|
234
228
|
end
|
@@ -241,7 +235,7 @@ module Wx::SF
|
|
241
235
|
# HINT: overload it for custom actions...
|
242
236
|
|
243
237
|
dc.with_pen(Wx::Pen.new(get_hover_colour, 1)) do
|
244
|
-
dc.with_brush(
|
238
|
+
dc.with_brush(fill) do
|
245
239
|
draw_polygon_shape(dc)
|
246
240
|
end
|
247
241
|
end
|
@@ -255,7 +249,7 @@ module Wx::SF
|
|
255
249
|
# HINT: overload it for custom actions...
|
256
250
|
|
257
251
|
dc.with_pen(Wx::Pen.new(get_hover_colour, 2)) do
|
258
|
-
dc.with_brush(
|
252
|
+
dc.with_brush(fill) do
|
259
253
|
draw_polygon_shape(dc)
|
260
254
|
end
|
261
255
|
end
|
@@ -266,7 +260,7 @@ module Wx::SF
|
|
266
260
|
def draw_shadow(dc)
|
267
261
|
# HINT: overload it for custom actions...
|
268
262
|
|
269
|
-
if
|
263
|
+
if fill.get_style != Wx::BrushStyle::BRUSHSTYLE_TRANSPARENT
|
270
264
|
dc.with_pen(Wx::TRANSPARENT_PEN) do
|
271
265
|
dc.with_brush(get_parent_canvas.get_shadow_fill) do
|
272
266
|
offset = get_parent_canvas.get_shadow_offset
|
@@ -280,15 +274,15 @@ module Wx::SF
|
|
280
274
|
end
|
281
275
|
|
282
276
|
# Deserialize attributes and recalculate rectangle size afterwards.
|
283
|
-
# @param [Hash] data
|
284
277
|
# @return [self]
|
285
|
-
def
|
286
|
-
super
|
278
|
+
def deserialize_finalize
|
287
279
|
normalize_vertices
|
288
280
|
fit_vertices_to_bounding_box
|
289
281
|
self
|
290
282
|
end
|
291
283
|
|
284
|
+
define_deserialize_finalizer :deserialize_finalize
|
285
|
+
|
292
286
|
end
|
293
287
|
|
294
288
|
end
|
@@ -7,64 +7,76 @@ module Wx::SF
|
|
7
7
|
|
8
8
|
# default values
|
9
9
|
module DEFAULT
|
10
|
+
class << self
|
11
|
+
# Default value of RectShape fill data member.
|
12
|
+
def fill; fill ||= Wx::WHITE_BRUSH.dup; end
|
13
|
+
# Default value of RectShape @border data member.
|
14
|
+
def border; @border ||= Wx::BLACK_PEN.dup; end
|
15
|
+
end
|
10
16
|
# Default value of RectShape @rect_size data member.
|
11
17
|
SIZE = Wx::RealPoint.new(100, 50)
|
12
|
-
# Default value of RectShape @fill data member.
|
13
|
-
FILL = Wx::Brush.new(Wx::WHITE) if Wx::App.is_main_loop_running
|
14
|
-
Wx.add_delayed_constant(self, :FILL) { Wx::Brush.new(Wx::WHITE) }
|
15
|
-
# Default value of RectShape @border data member.
|
16
|
-
BORDER = Wx::Pen.new(Wx::BLACK) if Wx::App.is_main_loop_running
|
17
|
-
Wx.add_delayed_constant(self, :BORDER) { Wx::Pen.new(Wx::BLACK) }
|
18
18
|
end
|
19
19
|
|
20
|
-
property
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
def initialize(
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
pos, size, diagram = args
|
35
|
-
super(pos, diagram)
|
36
|
-
end
|
37
|
-
@rect_size = size ? size.to_real_point : DEFAULT::SIZE.dup
|
38
|
-
@fill = DEFAULT::FILL
|
39
|
-
@border = DEFAULT::BORDER
|
40
|
-
@prev_size = @prev_position = Wx::RealPoint
|
20
|
+
property rect_size: :serialize_rect_size
|
21
|
+
property({ fill: :serialize_rect_fill,
|
22
|
+
border: :serialize_rect_border },
|
23
|
+
optional: true)
|
24
|
+
|
25
|
+
# Constructor.
|
26
|
+
# @param [Wx::RealPoint,Wx::Point] pos Initial position
|
27
|
+
# @param [Wx::RealPoint,Wx::Size,Wx::Point,Array(Float,Float)] size Initial size
|
28
|
+
# @param [Wx::SF::Diagram] diagram parent diagram
|
29
|
+
def initialize(pos = Shape::DEFAULT::POSITION, size = DEFAULT::SIZE, diagram: nil)
|
30
|
+
super(pos, diagram: diagram)
|
31
|
+
set_rect_size(size.to_real_point)
|
32
|
+
@fill = nil
|
33
|
+
@border = nil
|
41
34
|
end
|
42
35
|
|
43
36
|
# Set rectangle's fill style.
|
44
|
-
# @
|
45
|
-
|
46
|
-
|
37
|
+
# @overload set_fill(brush)
|
38
|
+
# @param [Wx::Brush] brush
|
39
|
+
# @overload set_fill(color, style=Wx::BrushStyle::BRUSHSTYLE_SOLID)
|
40
|
+
# @param [Wx::Colour,Symbol,String] color brush color
|
41
|
+
# @param [Wx::BrushStyle] style
|
42
|
+
# @overload set_fill(stipple_bitmap)
|
43
|
+
# @param [Wx::Bitmap] stipple_bitmap
|
44
|
+
def set_fill(*args)
|
45
|
+
@fill = if args.size == 1 && Wx::Brush === args.first
|
46
|
+
args.first
|
47
|
+
else
|
48
|
+
Wx::Brush.new(*args)
|
49
|
+
end
|
47
50
|
end
|
48
51
|
alias :fill= :set_fill
|
49
52
|
|
50
53
|
# Get current fill style.
|
51
54
|
# @return [Wx::Brush] Current brush
|
52
55
|
def get_fill
|
53
|
-
@fill
|
56
|
+
@fill || (@diagram&.shape_canvas ? @diagram.shape_canvas.fill_brush : DEFAULT.fill)
|
54
57
|
end
|
55
58
|
alias :fill :get_fill
|
56
59
|
|
57
60
|
# Set rectangle's border style.
|
58
|
-
# @
|
59
|
-
|
60
|
-
|
61
|
+
# @overload set_border(pen)
|
62
|
+
# @param [Wx::Pen] pen
|
63
|
+
# @overload set_border(color, width=1, style=Wx::PenStyle::PENSTYLE_SOLID)
|
64
|
+
# @param [Wx::Colour,String,Symbol] color
|
65
|
+
# @param [Integer] width
|
66
|
+
# @param [Wx::PenStyle] style
|
67
|
+
def set_border(*args)
|
68
|
+
@border = if args.size == 1 && Wx::Pen === args.first
|
69
|
+
args.first
|
70
|
+
else
|
71
|
+
Wx::Pen.new(*args)
|
72
|
+
end
|
61
73
|
end
|
62
74
|
alias :border= :set_border
|
63
75
|
|
64
76
|
# Get current border style.
|
65
77
|
# @return [Wx::Pen] Current pen
|
66
78
|
def get_border
|
67
|
-
@border
|
79
|
+
@border || (@diagram&.shape_canvas ? @diagram.shape_canvas.border_pen : DEFAULT.border)
|
68
80
|
end
|
69
81
|
alias :border :get_border
|
70
82
|
|
@@ -73,9 +85,11 @@ module Wx::SF
|
|
73
85
|
# @param [Float] x Horizontal size
|
74
86
|
# @param [Float] y Vertical size
|
75
87
|
# @overload set_rect_size(size)
|
76
|
-
# @param [Wx::RealPoint] size New size
|
77
|
-
def set_rect_size(
|
78
|
-
|
88
|
+
# @param [Wx::RealPoint,Array(Float, Float)] size New size
|
89
|
+
def set_rect_size(*args)
|
90
|
+
x, y = args.size == 1 ? args.first.to_real_point : args
|
91
|
+
# set new size while preventing 'invisible' shapes
|
92
|
+
@rect_size = Wx::RealPoint.new([1.0, x].max, [1.0, y].max)
|
79
93
|
end
|
80
94
|
alias :rect_size= :set_rect_size
|
81
95
|
|
@@ -163,7 +177,7 @@ module Wx::SF
|
|
163
177
|
def fit_to_children
|
164
178
|
# HINT: overload it for custom actions...
|
165
179
|
|
166
|
-
# get bounding box of the shape and children set be inside it
|
180
|
+
# get bounding box of the shape and children set to be inside it
|
167
181
|
ch_bb = get_bounding_box
|
168
182
|
shp_bb = ch_bb.dup
|
169
183
|
|
@@ -183,7 +197,7 @@ module Wx::SF
|
|
183
197
|
move_to(shp_bb.get_position.x, shp_bb.get_position.y)
|
184
198
|
@rect_size = Wx::RealPoint.new(shp_bb.get_size.x.to_f, shp_bb.get_size.y.to_f)
|
185
199
|
if has_style?(STYLE::EMIT_EVENTS)
|
186
|
-
evt = ShapeEvent.new(EVT_SF_SHAPE_SIZE_CHANGED,
|
200
|
+
evt = ShapeEvent.new(EVT_SF_SHAPE_SIZE_CHANGED, self.object_id)
|
187
201
|
evt.set_shape(self)
|
188
202
|
get_parent_canvas.get_event_handler.process_event(evt)
|
189
203
|
end
|
@@ -200,11 +214,11 @@ module Wx::SF
|
|
200
214
|
end
|
201
215
|
|
202
216
|
# Scale the shape size by in both directions. The function can be overridden if necessary
|
203
|
-
# (new implementation should call default one ore scale shape's children
|
217
|
+
# (new implementation should call default one ore scale shape's children manually if necessary).
|
204
218
|
# @param [Float] x Horizontal scale factor
|
205
219
|
# @param [Float] y Vertical scale factor
|
206
220
|
# @param [Boolean] children true if the shape's children should be scaled as well, otherwise the shape will be updated after scaling via update() function.
|
207
|
-
def scale(x, y, children
|
221
|
+
def scale(x, y, children: WITHCHILDREN)
|
208
222
|
# HINT: overload it for custom actions...
|
209
223
|
if x > 0 && y > 0
|
210
224
|
scale_rectangle(x, y)
|
@@ -218,8 +232,7 @@ module Wx::SF
|
|
218
232
|
|
219
233
|
# Handle action at handle drag beginning
|
220
234
|
def do_begin_handle
|
221
|
-
|
222
|
-
@prev_size = @rect_size.dup
|
235
|
+
# noop
|
223
236
|
end
|
224
237
|
|
225
238
|
# Scale the rectangle size for this shape.
|
@@ -270,8 +283,8 @@ module Wx::SF
|
|
270
283
|
def draw_normal(dc)
|
271
284
|
# HINT: overload it for custom actions...
|
272
285
|
|
273
|
-
dc.with_pen(
|
274
|
-
dc.with_brush(
|
286
|
+
dc.with_pen(border) do
|
287
|
+
dc.with_brush(fill) do
|
275
288
|
dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
|
276
289
|
end
|
277
290
|
end
|
@@ -283,8 +296,8 @@ module Wx::SF
|
|
283
296
|
def draw_hover(dc)
|
284
297
|
# HINT: overload it for custom actions...
|
285
298
|
|
286
|
-
dc.with_pen(Wx::Pen.new(
|
287
|
-
dc.with_brush(
|
299
|
+
dc.with_pen(Wx::Pen.new(hover_colour, 1)) do
|
300
|
+
dc.with_brush(fill) do
|
288
301
|
dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
|
289
302
|
end
|
290
303
|
end
|
@@ -297,8 +310,8 @@ module Wx::SF
|
|
297
310
|
def draw_highlighted(dc)
|
298
311
|
# HINT: overload it for custom actions...
|
299
312
|
|
300
|
-
dc.with_pen(Wx::Pen.new(
|
301
|
-
dc.with_brush(
|
313
|
+
dc.with_pen(Wx::Pen.new(hover_colour, 2)) do
|
314
|
+
dc.with_brush(fill) do
|
302
315
|
dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
|
303
316
|
end
|
304
317
|
end
|
@@ -309,7 +322,7 @@ module Wx::SF
|
|
309
322
|
def draw_shadow(dc)
|
310
323
|
# HINT: overload it for custom actions...
|
311
324
|
|
312
|
-
if
|
325
|
+
if fill.style != Wx::BrushStyle::BRUSHSTYLE_TRANSPARENT
|
313
326
|
dc.with_pen(Wx::TRANSPARENT_PEN) do
|
314
327
|
dc.with_brush(get_parent_canvas.get_shadow_fill) do
|
315
328
|
dc.draw_rectangle((get_absolute_position + get_parent_canvas.get_shadow_offset).to_point, @rect_size.to_size)
|
@@ -325,6 +338,7 @@ module Wx::SF
|
|
325
338
|
# HINT: overload it for custom actions...
|
326
339
|
|
327
340
|
@rect_size.x += handle.get_delta.x
|
341
|
+
@rect_size.x = 1.0 if @rect_size.x < 1.0
|
328
342
|
end
|
329
343
|
|
330
344
|
# Event handler called during dragging of the left shape handle.
|
@@ -334,7 +348,11 @@ module Wx::SF
|
|
334
348
|
# HINT: overload it for custom actions...
|
335
349
|
|
336
350
|
dx = handle.get_delta.x.to_f
|
337
|
-
|
351
|
+
|
352
|
+
if (@rect_size.x - dx) < 1.0
|
353
|
+
dx = @rect_size.x - 1.0
|
354
|
+
end
|
355
|
+
|
338
356
|
# update position of children
|
339
357
|
unless has_style?(STYLE::LOCK_CHILDREN)
|
340
358
|
@child_shapes.each do |child|
|
@@ -353,7 +371,11 @@ module Wx::SF
|
|
353
371
|
# HINT: overload it for custom actions...
|
354
372
|
|
355
373
|
dy = handle.get_delta.y.to_f
|
356
|
-
|
374
|
+
|
375
|
+
if (@rect_size.y - dy) < 1.0
|
376
|
+
dy = @rect_size.y - 1.0
|
377
|
+
end
|
378
|
+
|
357
379
|
# update position of children
|
358
380
|
unless has_style?(STYLE::LOCK_CHILDREN)
|
359
381
|
@child_shapes.each do |child|
|
@@ -372,7 +394,27 @@ module Wx::SF
|
|
372
394
|
# HINT: overload it for custom actions...
|
373
395
|
|
374
396
|
@rect_size.y += handle.get_delta.y
|
397
|
+
@rect_size.y = 1.0 if @rect_size.y < 1.0
|
398
|
+
end
|
399
|
+
|
400
|
+
def serialize_rect_size(*val)
|
401
|
+
@rect_size = val.first unless val.empty?
|
402
|
+
@rect_size
|
375
403
|
end
|
404
|
+
private :serialize_rect_size
|
405
|
+
|
406
|
+
def serialize_rect_fill(*val)
|
407
|
+
@fill = val.first unless val.empty?
|
408
|
+
@fill
|
409
|
+
end
|
410
|
+
private :serialize_rect_fill
|
411
|
+
|
412
|
+
def serialize_rect_border(*val)
|
413
|
+
@border = val.first unless val.empty?
|
414
|
+
@border
|
415
|
+
end
|
416
|
+
private :serialize_rect_border
|
417
|
+
|
376
418
|
end
|
377
419
|
|
378
420
|
end
|
@@ -13,14 +13,12 @@ module Wx::SF
|
|
13
13
|
|
14
14
|
property :max_radius
|
15
15
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# @
|
19
|
-
#
|
20
|
-
#
|
21
|
-
|
22
|
-
# @param [Diagram] diagram containing diagram
|
23
|
-
def initialize(*args)
|
16
|
+
# Constructor
|
17
|
+
# @param [Shape] src source shape
|
18
|
+
# @param [Shape] trg target shape
|
19
|
+
# @param [Array<Wx::RealPoint>] path List of the line control points (can be empty)
|
20
|
+
# @param [Diagram] diagram containing diagram
|
21
|
+
def initialize(src = nil, trg = nil, path: nil, diagram: nil)
|
24
22
|
super
|
25
23
|
@max_radius = MAX_RADIUS
|
26
24
|
end
|