wxruby3-shapes 0.9.0.pre.beta.3 → 0.9.6
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 +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,37 @@
|
|
1
|
+
# Wx::SF::SquareArrow - square arrow class
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
3
|
+
|
4
|
+
require 'wx/shapes/arrows/solid_arrow'
|
5
|
+
|
6
|
+
module Wx::SF
|
7
|
+
|
8
|
+
# Class extends the Wx::SolidArrow class and encapsulates
|
9
|
+
# square arrow shapes.
|
10
|
+
class SquareArrow < SolidArrow
|
11
|
+
|
12
|
+
# Default square size
|
13
|
+
SIZE = 11
|
14
|
+
|
15
|
+
class << self
|
16
|
+
|
17
|
+
def arrow(size)
|
18
|
+
y = size / 2.0
|
19
|
+
[Wx::RealPoint.new(0, y), Wx::RealPoint.new(size, y), Wx::RealPoint.new(size, -y), Wx::RealPoint.new(0 ,-y), Wx::RealPoint.new(size, 0)]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# Get the circle radius
|
25
|
+
def get_size
|
26
|
+
(SIZE * @ratio).to_i
|
27
|
+
end
|
28
|
+
alias :size :get_size
|
29
|
+
|
30
|
+
def vertices
|
31
|
+
@vertices ||= SquareArrow.arrow(get_size)
|
32
|
+
end
|
33
|
+
protected :vertices
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -145,7 +145,7 @@ module Wx::SF
|
|
145
145
|
rct_bb = node.get_bounding_box
|
146
146
|
curr_max_width = rct_bb.width if rct_bb.width > curr_max_width
|
147
147
|
|
148
|
-
lst_neighbours = node.get_neighbours(
|
148
|
+
lst_neighbours = node.get_neighbours(LineShape, Shape::CONNECTMODE::STARTING)
|
149
149
|
|
150
150
|
if lst_neighbours.empty?
|
151
151
|
min_x += curr_max_width + @h_space
|
@@ -204,7 +204,7 @@ module Wx::SF
|
|
204
204
|
rct_bb = node.get_bounding_box
|
205
205
|
curr_max_height = rct_bb.height if rct_bb.height > curr_max_height
|
206
206
|
|
207
|
-
lst_neighbours = node.get_neighbours(
|
207
|
+
lst_neighbours = node.get_neighbours(LineShape, Shape::CONNECTMODE::STARTING)
|
208
208
|
|
209
209
|
if lst_neighbours.empty?
|
210
210
|
min_y += curr_max_height + @v_space
|
data/lib/wx/shapes/base.rb
CHANGED
@@ -18,6 +18,19 @@ module Wx::SF
|
|
18
18
|
end
|
19
19
|
|
20
20
|
attr_accessor :max_states
|
21
|
+
attr_reader :current_state
|
22
|
+
|
23
|
+
# Returns true if no state has been saved yet.
|
24
|
+
# @return [Boolean]
|
25
|
+
def empty?
|
26
|
+
@current_state.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns true if the current state is the newest state saved.
|
30
|
+
# @return [Boolean]
|
31
|
+
def at_latest?
|
32
|
+
@current_state && @current_state_index == (@canvas_states.size-1)
|
33
|
+
end
|
21
34
|
|
22
35
|
# Save current canvas state.
|
23
36
|
# @param [String] state serialized diagram state
|
@@ -58,6 +71,13 @@ module Wx::SF
|
|
58
71
|
@current_state = @canvas_states[@current_state_index]
|
59
72
|
end
|
60
73
|
|
74
|
+
def clear_current_state
|
75
|
+
restore_older_state
|
76
|
+
if @current_state
|
77
|
+
@canvas_states.slice!(@current_state_index+1, @canvas_states.size)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
61
81
|
# Clear all canvas history.
|
62
82
|
def clear
|
63
83
|
@canvas_states.clear
|
@@ -7,7 +7,7 @@ module Wx::SF
|
|
7
7
|
|
8
8
|
class ConnectionPoint
|
9
9
|
|
10
|
-
include
|
10
|
+
include FIRM::Serializable
|
11
11
|
|
12
12
|
property :type
|
13
13
|
property :ortho_direction
|
@@ -73,6 +73,8 @@ module Wx::SF
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
attr_accessor :id
|
77
|
+
|
76
78
|
# Get connection point type.
|
77
79
|
# @return [CPTYPE] Connection point type
|
78
80
|
def get_type
|
@@ -80,6 +82,13 @@ module Wx::SF
|
|
80
82
|
end
|
81
83
|
alias :type :get_type
|
82
84
|
|
85
|
+
# Set connection point type.
|
86
|
+
# @param [CPTYPE] type
|
87
|
+
def set_type(type)
|
88
|
+
@type = type
|
89
|
+
end
|
90
|
+
alias :type= :set_type
|
91
|
+
|
83
92
|
# Set direction of orthogonal line's connection.
|
84
93
|
# @param [CPORTHODIR] dir Required direction
|
85
94
|
# @see CPORTHODIR
|
@@ -212,11 +221,6 @@ module Wx::SF
|
|
212
221
|
|
213
222
|
private
|
214
223
|
|
215
|
-
# For deserialization
|
216
|
-
def set_type(type)
|
217
|
-
@type = type
|
218
|
-
end
|
219
|
-
|
220
224
|
# Event handler called when the mouse pointer is moving above shape canvas.
|
221
225
|
# @param [Wx::Point] pos Current mouse position
|
222
226
|
def _on_mouse_move(pos)
|
data/lib/wx/shapes/diagram.rb
CHANGED
@@ -11,7 +11,7 @@ module Wx::SF
|
|
11
11
|
|
12
12
|
class Diagram
|
13
13
|
|
14
|
-
include Serializable
|
14
|
+
include FIRM::Serializable
|
15
15
|
|
16
16
|
property shapes: :serialize_shapes
|
17
17
|
property :accepted_shapes, :accepted_top_shapes
|
@@ -28,7 +28,7 @@ module Wx::SF
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# Returns the shape canvas.
|
31
|
-
# @return [Wx::SF::ShapeCanvas]
|
31
|
+
# @return [Wx::SF::ShapeCanvas, nil]
|
32
32
|
def get_shape_canvas
|
33
33
|
@shape_canvas
|
34
34
|
end
|
@@ -63,25 +63,25 @@ module Wx::SF
|
|
63
63
|
# This function creates new simple connection line (without arrows) between given
|
64
64
|
# shapes.
|
65
65
|
# @overload create_connection(src_id, trg_id, save_state = true)
|
66
|
-
# @param [
|
67
|
-
# @param [
|
66
|
+
# @param [Shape] src source shape
|
67
|
+
# @param [Shape] trg target shape
|
68
68
|
# @param [Boolean] save_state set the parameter true if you wish to save canvas state after the operation
|
69
69
|
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new connection object. the object is added to the shape canvas automatically.
|
70
70
|
# @overload create_connection(src_id, trg_id, line_info, save_state = true)
|
71
|
-
# @param [
|
72
|
-
# @param [
|
71
|
+
# @param [Shape] src source shape
|
72
|
+
# @param [Shape] trg target shape
|
73
73
|
# @param [Class] line_info Connection type (any class inherited from Wx::SF::LineShape)
|
74
74
|
# @param [Boolean] save_state set the parameter true if you wish to save canvas state after the operation
|
75
75
|
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new connection object. the object is added to the shape canvas automatically.
|
76
76
|
# @overload create_connection(src_id, trg_id, line, save_state = true)
|
77
|
-
# @param [
|
78
|
-
# @param [
|
77
|
+
# @param [Shape] src source shape
|
78
|
+
# @param [Shape] trg target shape
|
79
79
|
# @param [Wx::SF::LineShape] line the line shape
|
80
80
|
# @param [Boolean] save_state set the parameter true if you wish to save canvas state after the operation
|
81
81
|
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new connection object. the object is added to the shape canvas automatically.
|
82
82
|
# @see start_interactive_connection
|
83
|
-
def create_connection(
|
84
|
-
|
83
|
+
def create_connection(src, trg, *rest)
|
84
|
+
shape = nil
|
85
85
|
if rest.first.is_a?(LineShape)
|
86
86
|
line = rest.shift
|
87
87
|
save_state = rest.empty? ? true : rest.shift
|
@@ -93,8 +93,8 @@ module Wx::SF
|
|
93
93
|
err, shape = create_shape(line_type, DONT_SAVE_STATE)
|
94
94
|
end
|
95
95
|
if shape
|
96
|
-
shape.
|
97
|
-
shape.
|
96
|
+
shape.set_src_shape(src)
|
97
|
+
shape.set_trg_shape(trg)
|
98
98
|
|
99
99
|
if @shape_canvas
|
100
100
|
@shape_canvas.save_canvas_state if save_state
|
@@ -115,6 +115,24 @@ module Wx::SF
|
|
115
115
|
# @param [Boolean] save_state Set the parameter true if you wish to save canvas state after the operation
|
116
116
|
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new shape. the object is added to the shape canvas automatically.
|
117
117
|
def create_shape(shape_info, *rest)
|
118
|
+
if shape_info && is_shape_accepted(shape_info)
|
119
|
+
insert_shape(shape_info.new, *rest)
|
120
|
+
else
|
121
|
+
[ERRCODE::NOT_ACCEPTED, nil]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Insert new shape to the shape canvas.
|
126
|
+
# @overload insert_shape(shape, save_state = true)
|
127
|
+
# @param [Wx::SF::Shape] shape new shape
|
128
|
+
# @param [Boolean] save_state Set the parameter true if you wish to save canvas state after the operation
|
129
|
+
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new shape. the object is added to the shape canvas automatically.
|
130
|
+
# @overload insert_shape(shape, pos, save_state = true)
|
131
|
+
# @param [Wx::SF::Shape] shape new shape
|
132
|
+
# @param [Wx::Point] pos shape position (device coordinates)
|
133
|
+
# @param [Boolean] save_state Set the parameter true if you wish to save canvas state after the operation
|
134
|
+
# @return [Array(Wx::SF::ERRCODE, Wx::SF::Shape)] operation result and new shape. the object is added to the shape canvas automatically.
|
135
|
+
def insert_shape(shape, *rest)
|
118
136
|
pos = if rest.first.respond_to?(:to_point)
|
119
137
|
rest.shift.to_point
|
120
138
|
elsif @shape_canvas
|
@@ -125,20 +143,26 @@ module Wx::SF
|
|
125
143
|
Wx::Point.new
|
126
144
|
end
|
127
145
|
save_state = rest.empty? ? true : rest.shift
|
128
|
-
if
|
129
|
-
# create shape object from class info
|
130
|
-
shape = shape_info.new
|
131
|
-
|
146
|
+
if shape && is_shape_accepted(shape.class)
|
132
147
|
parent_shape = nil
|
133
148
|
# update given position
|
134
|
-
lpos = pos
|
135
|
-
lpos = @shape_canvas.fit_position_to_grid(@shape_canvas.dp2lp(pos)) if @shape_canvas
|
149
|
+
lpos = @shape_canvas ? @shape_canvas.dp2lp(pos) : pos
|
136
150
|
# line shapes can be assigned to root only
|
137
151
|
parent_shape = get_shape_at_position(lpos) unless shape.is_a?(LineShape)
|
138
|
-
|
139
|
-
|
152
|
+
# In case the matching shape does not accept ANY children see if this shape has a
|
153
|
+
# parent that does also match the position and DOES accept children.
|
154
|
+
# This allows dropping shapes onto child shapes inside a (container) shapes like
|
155
|
+
# grids and/or boxes.
|
156
|
+
while parent_shape&.does_not_accept_children? && parent_shape.parent_shape
|
157
|
+
parent_shape = parent_shape.parent_shape
|
158
|
+
parent_shape = nil unless parent_shape.get_bounding_box.contains?(lpos)
|
159
|
+
end
|
160
|
+
# see if the located parent (if any) accepts this particular type of child
|
161
|
+
if parent_shape && parent_shape.is_child_accepted(shape.class)
|
162
|
+
# add shape as child of located parent
|
140
163
|
err = add_shape(shape, parent_shape, pos - parent_shape.get_absolute_position.to_point, INITIALIZE, save_state)
|
141
164
|
else
|
165
|
+
# add shape as new toplevel shape (if acceptable)
|
142
166
|
err = add_shape(shape, nil, pos, INITIALIZE, save_state)
|
143
167
|
end
|
144
168
|
|
@@ -153,7 +177,7 @@ module Wx::SF
|
|
153
177
|
# Add an existing shape to the canvas.
|
154
178
|
# @param [Wx::SF::Shape] shape new shape
|
155
179
|
# @param [Wx::SF::Shape] parent the parent shape
|
156
|
-
# @param [Wx::Point] pos shape position
|
180
|
+
# @param [Wx::Point] pos shape position (device coordinates)
|
157
181
|
# @param [Boolean] initialize true if the shape should be reinitialized, otherwise false
|
158
182
|
# @param [Boolean] save_state true if the canvas state should be saved
|
159
183
|
# @return [Wx::SF::ERRCODE] operation result
|
@@ -192,11 +216,13 @@ module Wx::SF
|
|
192
216
|
# initialize shape's children
|
193
217
|
lst_children.each do |child|
|
194
218
|
child.create_handles
|
195
|
-
child.update
|
219
|
+
child.update(false)
|
196
220
|
|
197
221
|
child.set_hover_colour(@shape_canvas.get_hover_colour) if @shape_canvas
|
198
222
|
end
|
199
223
|
end
|
224
|
+
|
225
|
+
shape.update
|
200
226
|
end
|
201
227
|
|
202
228
|
# reset scale of assigned shape canvas (if exists and it is necessary...)
|
@@ -246,9 +272,7 @@ module Wx::SF
|
|
246
272
|
end
|
247
273
|
|
248
274
|
# remove the shape and it's children from canvas cache and shape index list
|
249
|
-
|
250
|
-
@shape_canvas.send(:remove_from_temporaries, shape) if @shape_canvas
|
251
|
-
end
|
275
|
+
@shape_canvas.send(:remove_from_temporaries, shape) if @shape_canvas
|
252
276
|
|
253
277
|
# remove the shape
|
254
278
|
shape.set_parent_shape(nil) # also removes shape from parent if it had a parent
|
@@ -288,7 +312,7 @@ module Wx::SF
|
|
288
312
|
# @param [Wx::SF::Shape] shape
|
289
313
|
# @return [Boolean]
|
290
314
|
def contains_shape(shape)
|
291
|
-
@shapes.include?(shape
|
315
|
+
@shapes.include?(shape,true)
|
292
316
|
end
|
293
317
|
alias :contains_shape? :contains_shape
|
294
318
|
alias :contains? :contains_shape
|
@@ -315,7 +339,7 @@ module Wx::SF
|
|
315
339
|
min_x = min_y = 0.0
|
316
340
|
|
317
341
|
# find the maximal negative position value
|
318
|
-
shapes =
|
342
|
+
shapes = get_all_shapes
|
319
343
|
|
320
344
|
shapes.each_with_index do |shape, ix|
|
321
345
|
shape_pos = shape.get_absolute_position
|
@@ -341,7 +365,7 @@ module Wx::SF
|
|
341
365
|
|
342
366
|
# Update all shapes in the diagram manager
|
343
367
|
def update_all
|
344
|
-
|
368
|
+
get_all_shapes.each { |shape| shape.update unless shape.has_children? }
|
345
369
|
end
|
346
370
|
|
347
371
|
# Add given shape type to an acceptance list. The acceptance list contains class
|
@@ -350,7 +374,7 @@ module Wx::SF
|
|
350
374
|
# @param [Class] type Class of accepted shape object
|
351
375
|
# @see is_shape_accepted
|
352
376
|
def accept_shape(type)
|
353
|
-
::Kernel.raise ArgumentError, 'Class or ACCEPT_ALL expected' unless type.is_a?(::Class)
|
377
|
+
::Kernel.raise ArgumentError, 'Class or ACCEPT_ALL expected' unless type.is_a?(::Class)
|
354
378
|
@accepted_shapes << type
|
355
379
|
end
|
356
380
|
|
@@ -386,7 +410,7 @@ module Wx::SF
|
|
386
410
|
# @param [Class] type Class of accepted shape object
|
387
411
|
# @see is_top_shape_accepted
|
388
412
|
def accept_top_shape(type)
|
389
|
-
::Kernel.raise ArgumentError, 'Class or ACCEPT_ALL expected' unless type.is_a?(::Class)
|
413
|
+
::Kernel.raise ArgumentError, 'Class or ACCEPT_ALL expected' unless type.is_a?(::Class)
|
390
414
|
@accepted_top_shapes << type
|
391
415
|
end
|
392
416
|
|
@@ -415,13 +439,6 @@ module Wx::SF
|
|
415
439
|
end
|
416
440
|
alias :accepted_top_shapes :get_accepted_top_shapes
|
417
441
|
|
418
|
-
# Find shape with given ID.
|
419
|
-
# @param [Wx::SF::Serializable::ID] id Shape's ID
|
420
|
-
# @return [Wx::SF::Shape] shape if exists, otherwise nil
|
421
|
-
def find_shape(id)
|
422
|
-
@shapes.get(id, true)
|
423
|
-
end
|
424
|
-
|
425
442
|
# Get list of connections assigned to given parent shape.
|
426
443
|
# @param [Wx::SF::Shape] parent parent shape
|
427
444
|
# @param [Class] shape_info Line object type
|
@@ -430,19 +447,19 @@ module Wx::SF
|
|
430
447
|
# @return [Array<Wx::SF::Shape>] shape list
|
431
448
|
# @see Wx::SF::Shape::CONNECTMODE
|
432
449
|
def get_assigned_connections(parent, shape_info, mode, lines = [])
|
433
|
-
return lines unless parent
|
450
|
+
return lines unless parent
|
434
451
|
|
435
452
|
# lines are all toplevel so we do not have to search recursively...
|
436
|
-
lst_lines = @shapes.select { |shape| shape.is_a?(shape_info) }
|
453
|
+
lst_lines = @shapes.select { |shape| shape.is_a?(shape_info) && !shape.stand_alone? }
|
437
454
|
|
438
455
|
lst_lines.each do |line|
|
439
456
|
case mode
|
440
457
|
when Shape::CONNECTMODE::STARTING
|
441
|
-
lines << line if line.
|
458
|
+
lines << line if line.get_src_shape == parent
|
442
459
|
when Shape::CONNECTMODE::ENDING
|
443
|
-
lines << line if line.
|
460
|
+
lines << line if line.get_trg_shape == parent
|
444
461
|
when Shape::CONNECTMODE::BOTH
|
445
|
-
lines << line if line.
|
462
|
+
lines << line if line.get_src_shape == parent || line.get_trg_shape == parent
|
446
463
|
end
|
447
464
|
end
|
448
465
|
lines
|
@@ -453,6 +470,9 @@ module Wx::SF
|
|
453
470
|
@shapes
|
454
471
|
end
|
455
472
|
|
473
|
+
# Get all shapes recursively.
|
474
|
+
# This is an optimized convenience method which returns all shapes the same as if #get_shapes() was called with
|
475
|
+
# default arguments.
|
456
476
|
def get_all_shapes
|
457
477
|
@shapes.all
|
458
478
|
end
|
@@ -478,7 +498,7 @@ module Wx::SF
|
|
478
498
|
# @param [Wx::Point] pos Logical position
|
479
499
|
# @param [Integer] zorder Z-order of searched shape (useful if several shapes are located at the given position)
|
480
500
|
# @param [SEARCHMODE] mode Search mode
|
481
|
-
# @return [Wx::SF::Shape] shape if found, otherwise nil
|
501
|
+
# @return [Wx::SF::Shape, nil] shape if found, otherwise nil
|
482
502
|
# @see SEARCHMODE
|
483
503
|
# @see Wx::SF::ShapeCanvas::dp2lp
|
484
504
|
# @see Wx::SF::ShapeCanvas#get_shape_under_cursor
|
@@ -487,7 +507,7 @@ module Wx::SF
|
|
487
507
|
# and all non-line shapes get listed in reversed order as returned from get_shapes (for z order)
|
488
508
|
ins_pos = 0
|
489
509
|
pos = pos.to_point
|
490
|
-
shapes =
|
510
|
+
shapes = get_all_shapes.inject([]) do |list, shape|
|
491
511
|
if shape.is_a?(LineShape)
|
492
512
|
list.prepend(shape)
|
493
513
|
ins_pos += 1
|
@@ -528,7 +548,7 @@ module Wx::SF
|
|
528
548
|
# @see Wx::SF::ShapeCanvas::dp2lp
|
529
549
|
def get_shapes_at_position(pos, shapes = [])
|
530
550
|
pos = pos.to_point
|
531
|
-
|
551
|
+
get_all_shapes.each do |shape|
|
532
552
|
shapes << shape if shape.visible? && shape.active? && shape.contains?(pos)
|
533
553
|
end
|
534
554
|
end
|
@@ -538,7 +558,7 @@ module Wx::SF
|
|
538
558
|
# @param [Array<Wx::SF::Shape>] shapes shape list where all found shapes will be stored
|
539
559
|
# @return [Array<Wx::SF::Shape>] shape list
|
540
560
|
def get_shapes_inside(rct, shapes = [])
|
541
|
-
|
561
|
+
get_all_shapes.each do |shape|
|
542
562
|
shapes << shape if shape.visible? && shape.active? && shape.intersects?(rct)
|
543
563
|
end
|
544
564
|
end
|
@@ -576,20 +596,20 @@ module Wx::SF
|
|
576
596
|
shape.get_neighbours(shape_info, condir, direct, neighbours)
|
577
597
|
end
|
578
598
|
end
|
599
|
+
neighbours
|
579
600
|
end
|
580
601
|
|
581
602
|
private
|
582
603
|
|
583
|
-
# Update
|
584
|
-
def
|
585
|
-
#
|
586
|
-
# lines and both connected shapes should
|
587
|
-
#
|
604
|
+
# Update shapes after importing/dropping of new shapes
|
605
|
+
def on_import(new_shapes)
|
606
|
+
# Deserializing will create unique new shapes from the serialized data where
|
607
|
+
# lines and both connected shapes should be present.
|
608
|
+
# We will remove any lines for which one or both connected shapes are missing (not copied).
|
588
609
|
new_shapes.select! do |shape|
|
589
610
|
if shape.is_a?(LineShape)
|
590
|
-
#
|
591
|
-
|
592
|
-
if @shapes.include?(shape.get_src_shape_id) && @shapes.include?(shape.get_trg_shape_id)
|
611
|
+
# remove any lines for which one or both connected shapes are missing (not copied)
|
612
|
+
if @shapes.include?(shape.get_src_shape, true) && @shapes.include?(shape.get_trg_shape, true)
|
593
613
|
shape.create_handles
|
594
614
|
true # keep
|
595
615
|
else
|
@@ -601,39 +621,39 @@ module Wx::SF
|
|
601
621
|
true # keep
|
602
622
|
end
|
603
623
|
end
|
604
|
-
# deserializing will create unique ids
|
605
|
-
#
|
606
|
-
#
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
# Update grid shapes after importing/dropping of new shapes
|
611
|
-
def update_grids(new_shapes)
|
612
|
-
# deserializing will create unique ids synchronized across all deserialized shapes
|
613
|
-
# so that grids and shapes linked to it's cells will have matching ids
|
614
|
-
# we will clear any cells for which shapes are missing (not copied)
|
624
|
+
# deserializing will create unique ids which should have synchronized across
|
625
|
+
# all deserialized shapes and their internal links
|
626
|
+
# existing links to shapes that have not been copied/imported may be dangling
|
627
|
+
# and should be cleared
|
628
|
+
# iterate all accepted imported shapes and signal them to check links (if any)
|
615
629
|
new_shapes.each do |shape|
|
616
|
-
|
617
|
-
|
618
|
-
grid.clear_cell(row, col) unless id.nil? || @shapes.include?(id)
|
619
|
-
end
|
620
|
-
elsif shape.has_children?
|
630
|
+
shape.__send__(:on_import)
|
631
|
+
if shape.has_children?
|
621
632
|
shape.get_children_recursively(nil, Shape::SEARCHMODE::DFS).each do |child|
|
622
|
-
|
623
|
-
grid.each_cell do |row, col, id|
|
624
|
-
grid.clear_cell(row, col) unless id.nil? || @shapes.include?(id)
|
625
|
-
end
|
626
|
-
end
|
633
|
+
child.__send__(:on_import)
|
627
634
|
end
|
628
635
|
end
|
629
636
|
end
|
630
637
|
end
|
631
638
|
|
632
|
-
# Shape
|
639
|
+
# Shape list (de-)serialization
|
633
640
|
def serialize_shapes(*arg)
|
634
641
|
unless arg.empty?
|
635
|
-
@shapes = arg.shift
|
636
|
-
|
642
|
+
@shapes = arg.shift # get deserialized shapes
|
643
|
+
# initialize deserialized shapes
|
644
|
+
@shapes.each do |shape|
|
645
|
+
# set diagram for shape (incl. children)
|
646
|
+
shape.set_diagram(self)
|
647
|
+
shape.create_handles
|
648
|
+
if has_children(shape)
|
649
|
+
# get shape's children (if exist)
|
650
|
+
lst_children = shape.get_child_shapes(ANY, RECURSIVE)
|
651
|
+
# initialize shape's children
|
652
|
+
lst_children.each do |child|
|
653
|
+
child.create_handles
|
654
|
+
end
|
655
|
+
end
|
656
|
+
end
|
637
657
|
end
|
638
658
|
@shapes
|
639
659
|
end
|
data/lib/wx/shapes/events.rb
CHANGED
@@ -7,7 +7,7 @@ module Wx::SF
|
|
7
7
|
class ShapeEvent < Wx::Event
|
8
8
|
# Constructor
|
9
9
|
# @param [Integer] evt_type
|
10
|
-
# @param [
|
10
|
+
# @param [Integer] id
|
11
11
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
12
12
|
super(evt_type, id.to_i)
|
13
13
|
@shape = nil
|
@@ -45,7 +45,7 @@ module Wx::SF
|
|
45
45
|
class ShapeKeyEvent < Wx::Event
|
46
46
|
# Constructor
|
47
47
|
# @param [Integer] evt_type
|
48
|
-
# @param [
|
48
|
+
# @param [Integer] id
|
49
49
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
50
50
|
super(evt_type, id.to_i)
|
51
51
|
@shape = nil
|
@@ -85,7 +85,7 @@ module Wx::SF
|
|
85
85
|
class ShapeMouseEvent < Wx::Event
|
86
86
|
# Constructor
|
87
87
|
# @param [Integer] evt_type
|
88
|
-
# @param [
|
88
|
+
# @param [Integer] id
|
89
89
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
90
90
|
super(evt_type, id.to_i)
|
91
91
|
@shape = nil
|
@@ -125,7 +125,7 @@ module Wx::SF
|
|
125
125
|
class ShapeTextEvent < Wx::Event
|
126
126
|
# Constructor
|
127
127
|
# @param [Integer] evt_type
|
128
|
-
# @param [
|
128
|
+
# @param [Integer] id
|
129
129
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
130
130
|
super(evt_type, id.to_i)
|
131
131
|
@shape = nil
|
@@ -165,7 +165,7 @@ module Wx::SF
|
|
165
165
|
class ShapeHandleEvent < Wx::Event
|
166
166
|
# Constructor
|
167
167
|
# @param [Integer] evt_type
|
168
|
-
# @param [
|
168
|
+
# @param [Integer] id
|
169
169
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
170
170
|
super(evt_type, id.to_i)
|
171
171
|
@shape = nil
|
@@ -211,7 +211,7 @@ module Wx::SF
|
|
211
211
|
# @param [Integer] y
|
212
212
|
# @param [Wx::SF::ShapeCanvas] target
|
213
213
|
# @param [Wx::DragResult] def_result
|
214
|
-
# @param [
|
214
|
+
# @param [Integer] id
|
215
215
|
def initialize(evt_type = Wx::EVT_NULL, x = 0, y = 0, target = nil, def_result = Wx::DragResult::DragNone, id = 0)
|
216
216
|
super(evt_type, id.to_i)
|
217
217
|
@dropped_shapes = []
|
@@ -284,7 +284,7 @@ module Wx::SF
|
|
284
284
|
# Constructor
|
285
285
|
# @param [Integer] evt_type
|
286
286
|
# @param [Wx::SF::ShapeCanvas] target
|
287
|
-
# @param [
|
287
|
+
# @param [Integer] id
|
288
288
|
def initialize(evt_type = Wx::EVT_NULL, target = nil, id = 0)
|
289
289
|
super(evt_type, id.to_i)
|
290
290
|
@pasted_shapes = []
|
@@ -324,7 +324,7 @@ module Wx::SF
|
|
324
324
|
class ShapeChildDropEvent < Wx::Event
|
325
325
|
# Constructor
|
326
326
|
# @param [Integer] evt_type
|
327
|
-
# @param [
|
327
|
+
# @param [Integer] id
|
328
328
|
def initialize(evt_type = Wx::EVT_NULL, id = 0)
|
329
329
|
super(evt_type, id.to_i)
|
330
330
|
@shape = nil
|
data/lib/wx/shapes/printout.rb
CHANGED
@@ -100,27 +100,14 @@ module Wx::SF
|
|
100
100
|
|
101
101
|
# store current canvas properties
|
102
102
|
prev_scale = @canvas.get_scale
|
103
|
-
|
104
|
-
prev_colour = @canvas.get_canvas_colour
|
105
|
-
|
106
|
-
# disable canvas background drawing if required
|
107
|
-
unless @canvas.has_style?(ShapeCanvas::STYLE::PRINT_BACKGROUND)
|
108
|
-
@canvas.remove_style(ShapeCanvas::STYLE::GRADIENT_BACKGROUND)
|
109
|
-
@canvas.remove_style(ShapeCanvas::STYLE::GRID_SHOW)
|
110
|
-
@canvas.set_canvas_colour(Wx::WHITE)
|
111
|
-
end
|
112
|
-
|
103
|
+
|
113
104
|
# draw the canvas content without any scale (dc is scaled by the printing framework)
|
114
105
|
@canvas.set_scale(1.0)
|
106
|
+
@canvas.draw_background(dc, NOT_FROM_PAINT) if @canvas.has_style?(ShapeCanvas::STYLE::PRINT_BACKGROUND)
|
115
107
|
@canvas.draw_content(dc, NOT_FROM_PAINT)
|
108
|
+
@canvas.draw_foreground(dc, NOT_FROM_PAINT)
|
116
109
|
@canvas.set_scale(prev_scale)
|
117
110
|
|
118
|
-
# restore previous canvas properties if needed
|
119
|
-
unless @canvas.has_style?(ShapeCanvas::STYLE::PRINT_BACKGROUND)
|
120
|
-
@canvas.set_style(prev_style)
|
121
|
-
@canvas.set_canvas_colour(prev_colour)
|
122
|
-
end
|
123
|
-
|
124
111
|
return true
|
125
112
|
end
|
126
113
|
false
|