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,404 @@
|
|
|
1
|
+
# Wx::SF::GridShape - grid shape class
|
|
2
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
|
3
|
+
|
|
4
|
+
require 'wx/shapes/shapes/rect_shape'
|
|
5
|
+
|
|
6
|
+
module Wx::SF
|
|
7
|
+
|
|
8
|
+
# Class encapsulates a rectangular shape derived from Wx::SF::RectShape class which acts as a grid-based
|
|
9
|
+
# container able to manage other assigned child shapes (it can control their position). The managed
|
|
10
|
+
# shapes are aligned into defined grid with a behaviour similar to classic Wx::GridSizer class.
|
|
11
|
+
class GridShape < RectShape
|
|
12
|
+
|
|
13
|
+
# default values
|
|
14
|
+
module DEFAULT
|
|
15
|
+
# Default value of GridShape @rows data member.
|
|
16
|
+
ROWS = 3
|
|
17
|
+
# Default value of GridShape @cols data member.
|
|
18
|
+
COLS = 3
|
|
19
|
+
# Default value of GridShape @cell_space data member.
|
|
20
|
+
CELLSPACE = 5
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
property :rows, :cols, :cell_space, :cells
|
|
24
|
+
|
|
25
|
+
# @overload initialize()
|
|
26
|
+
# Default constructor.
|
|
27
|
+
# @overload initialize(pos, size, rows, cols, cell_space, diagram)
|
|
28
|
+
# User constructor.
|
|
29
|
+
# @param [Wx::RealPoint] pos Initial position
|
|
30
|
+
# @param [Wx::RealPoint] size Initial size
|
|
31
|
+
# @param [Integer] cols Number of grid rows
|
|
32
|
+
# @param [Integer] rows Number of grid columns
|
|
33
|
+
# @param [Integer] cell_space Additional space between managed shapes
|
|
34
|
+
# @param [Wx::SF::Diagram] diagram parent diagram
|
|
35
|
+
def initialize(*args)
|
|
36
|
+
if args.empty?
|
|
37
|
+
super()
|
|
38
|
+
@rows = DEFAULT::ROWS
|
|
39
|
+
@cols = DEFAULT::COLS
|
|
40
|
+
@cell_space = DEFAULT::CELLSPACE
|
|
41
|
+
else
|
|
42
|
+
pos, size, rows, cols, cell_space, diagram = args
|
|
43
|
+
super(pos, size, diagram)
|
|
44
|
+
@rows = rows || 0
|
|
45
|
+
@cols = cols || 0
|
|
46
|
+
@cell_space = cell_space || 0
|
|
47
|
+
end
|
|
48
|
+
@cells = []
|
|
49
|
+
remove_style(Shape::STYLE::SIZE_CHANGE)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Set grid dimensions.
|
|
53
|
+
# @param [Integer] rows Number of rows
|
|
54
|
+
# @param [Integer] cols Number of columns
|
|
55
|
+
def set_dimensions(rows, cols)
|
|
56
|
+
return if (new_size = rows * cols) == 0
|
|
57
|
+
|
|
58
|
+
@rows = rows
|
|
59
|
+
@cols = cols
|
|
60
|
+
|
|
61
|
+
@cells.slice!(0, new_size) if new_size < @cells.size
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Get grid dimensions.
|
|
65
|
+
# @return [Array(Integer,Integer)] row and col numbers
|
|
66
|
+
def get_dimensions
|
|
67
|
+
[@rows, @cols]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Set space between grid cells (managed shapes).
|
|
71
|
+
# @param [Integer] cellspace Cellspace size
|
|
72
|
+
def set_cell_space(cellspace)
|
|
73
|
+
@cell_space = cellspace
|
|
74
|
+
end
|
|
75
|
+
alias :cell_space= :set_cell_space
|
|
76
|
+
|
|
77
|
+
# Get space between grid cells (managed shapes).
|
|
78
|
+
# @return [Integer] Cellspace size
|
|
79
|
+
def get_cell_space
|
|
80
|
+
@cell_space
|
|
81
|
+
end
|
|
82
|
+
alias :cell_space :get_cell_space
|
|
83
|
+
|
|
84
|
+
# Iterate all cells. If a block is given passes row, col and id for each cell to block.
|
|
85
|
+
# Returns Enumerator if no block given.
|
|
86
|
+
# @overload each_cell()
|
|
87
|
+
# @return [Enumerator]
|
|
88
|
+
# @overload each_cell(&block)
|
|
89
|
+
# @yieldparam [Integer] row
|
|
90
|
+
# @yieldparam [Integer] col
|
|
91
|
+
# @yieldparam [Wx::SF::Serializable::ID,nil] id
|
|
92
|
+
# @return [Object]
|
|
93
|
+
def each_cell(&block)
|
|
94
|
+
if block
|
|
95
|
+
@rows.times do |row|
|
|
96
|
+
@cols.times do |col|
|
|
97
|
+
block.call(row, col, @cells[row*@cols + col])
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
else
|
|
101
|
+
::Enumerator.new do |y|
|
|
102
|
+
@rows.times do |row|
|
|
103
|
+
@cols.times do |col|
|
|
104
|
+
y << [row, col, @cells[row*@cols + col]]
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def clear_cell(row, col)
|
|
112
|
+
if row>=0 && row<@rows && col>=0 && col<@cols
|
|
113
|
+
@cells[row*@cols + col] = nil
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def get_cell(row, col)
|
|
118
|
+
if row>=0 && row<@rows && col>=0 && col<@cols
|
|
119
|
+
@cells[row*@cols + col]
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Get managed shape specified by lexicographic cell index.
|
|
124
|
+
# @overload get_managed_shape(index)
|
|
125
|
+
# @param [Integer] index Lexicographic index of requested shape
|
|
126
|
+
# @return [Shape] shape object of given cell index if exists, otherwise nil
|
|
127
|
+
# @overload get_managed_shape(row, col)
|
|
128
|
+
# @param [Integer] row Zero-base row index
|
|
129
|
+
# @param [Integer] col Zero-based column index
|
|
130
|
+
# @return [Shape] shape object stored in specified grid cell if exists, otherwise nil
|
|
131
|
+
def get_managed_shape(*args)
|
|
132
|
+
index = args.size == 1 ? args.first : (args[0]*@cols)+args[1]
|
|
133
|
+
if index>=0 && index<@cells.size && @cells[index]
|
|
134
|
+
return @child_shapes.find { |child| @cells[index] == child.id }
|
|
135
|
+
end
|
|
136
|
+
nil
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Clear information about managed shapes and set number of rows and columns to zero.
|
|
140
|
+
#
|
|
141
|
+
# Note that this function doesn't remove managed (child) shapes from the parent grid shape
|
|
142
|
+
# (they are still its child shapes but aren't managed anymore).
|
|
143
|
+
def clear_grid
|
|
144
|
+
@rows = @cols = 0
|
|
145
|
+
@cells = []
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Append given shape to the grid at the last managed position.
|
|
149
|
+
# @param [Shape] shape shape to append
|
|
150
|
+
def append_to_grid(shape)
|
|
151
|
+
row = @cells.size / @cols
|
|
152
|
+
col = @cells.size - row*@cols
|
|
153
|
+
|
|
154
|
+
insert_to_grid(row, col, shape)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Insert given shape to the grid at the given position.
|
|
158
|
+
# @overload insert_to_grid(row, col, shape)
|
|
159
|
+
# Note that the grid can grow in a vertical direction only, so if the user specifies a desired
|
|
160
|
+
# horizontal position bigger than the current number of columns is then this function exits with
|
|
161
|
+
# an error (false) return value. If specified vertical position exceeds the number or grid rows than
|
|
162
|
+
# the grid is resized. Any occupied grid cells at given position or beyond will be shifted to the next
|
|
163
|
+
# lexicographic position.
|
|
164
|
+
# @param [Integer] row Vertical position
|
|
165
|
+
# @param [Integer] col Horizontal position
|
|
166
|
+
# @param [Shape] shape shape to insert
|
|
167
|
+
# @return [Boolean] true on success, otherwise false
|
|
168
|
+
# @overload insert_to_grid(index, shape)
|
|
169
|
+
# Note that the given index is a lexicographic position of inserted shape. The given shape is inserted before
|
|
170
|
+
# the existing item 'index', thus insert_to_grid(0, something) will insert an item in such way that it will become
|
|
171
|
+
# the first grid element. Any occupied grid cells at given position or beyond will be shifted to the next
|
|
172
|
+
# lexicographic position.
|
|
173
|
+
# @param [Integer] index Lexicographic position of inserted shape
|
|
174
|
+
# @param [Shape] shape shape to insert
|
|
175
|
+
# @return [Boolean] true on success, otherwise false
|
|
176
|
+
def insert_to_grid(*args)
|
|
177
|
+
if args.size > 2
|
|
178
|
+
row, col, shape = args
|
|
179
|
+
if shape && shape.is_a?(Shape) && is_child_accepted(shape.class)
|
|
180
|
+
# protect duplicated occurrences
|
|
181
|
+
return false if @cells.index(shape.id)
|
|
182
|
+
|
|
183
|
+
# protect unbounded horizontal index (grid can grow in a vertical direction only)
|
|
184
|
+
return false if col >= @cols
|
|
185
|
+
|
|
186
|
+
# add the shape to the children list if necessary
|
|
187
|
+
unless @child_shapes.include?(shape)
|
|
188
|
+
if @diagram
|
|
189
|
+
@diagram.reparent_shape(shape, self)
|
|
190
|
+
else
|
|
191
|
+
shape.set_parent_shape(self)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
@cells.insert(row * @cols + col, shape.id)
|
|
196
|
+
|
|
197
|
+
# adjust row count if necessary
|
|
198
|
+
if @cells.size > (@rows * @cols)
|
|
199
|
+
@rows = @cells.size / @cols
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
return true
|
|
203
|
+
end
|
|
204
|
+
else
|
|
205
|
+
index, shape = args
|
|
206
|
+
if shape && shape.is_a?(Shape) && is_child_accepted(shape.class)
|
|
207
|
+
# protect duplicated occurrences
|
|
208
|
+
return false if @cells.index(shape.id)
|
|
209
|
+
|
|
210
|
+
# protect unbounded index
|
|
211
|
+
return false if index >= (@rows * @cols)
|
|
212
|
+
|
|
213
|
+
# add the shape to the children list if necessary
|
|
214
|
+
unless @child_shapes.include?(shape)
|
|
215
|
+
if @diagram
|
|
216
|
+
@diagram.reparent_shape(shape, self)
|
|
217
|
+
else
|
|
218
|
+
shape.set_parent_shape(self)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
@cells.insert(index, shape.id)
|
|
223
|
+
|
|
224
|
+
# adjust row count if necessary
|
|
225
|
+
if @cells.size > (@rows * @cols)
|
|
226
|
+
@rows = @cells.size / @cols
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
return true
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
false
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Remove shape with given ID from the grid.
|
|
236
|
+
# Shifts any occupied cells beyond the cell containing the given id to the previous lexicographic position.
|
|
237
|
+
# @param [Serializable::ID] id ID of shape which should be removed
|
|
238
|
+
# @note Note this does *not* remove the shape as a child shape.
|
|
239
|
+
def remove_from_grid(id)
|
|
240
|
+
@cells.delete(id)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Update shape (align all child shapes an resize it to fit them)
|
|
244
|
+
def update
|
|
245
|
+
# check for existence of de-assigned shapes
|
|
246
|
+
@cells.delete_if do |id|
|
|
247
|
+
@child_shapes.find { |child| child.id == id }.nil?
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# check whether all child shapes' IDs are present in the cells array...
|
|
251
|
+
@child_shapes.each do |child|
|
|
252
|
+
@cells << child.id unless @cells.include?(child.id)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# do self-alignment
|
|
256
|
+
do_alignment
|
|
257
|
+
|
|
258
|
+
# do alignment of shape's children
|
|
259
|
+
do_children_layout
|
|
260
|
+
|
|
261
|
+
# fit the shape to its children
|
|
262
|
+
fit_to_children unless has_style?(STYLE::NO_FIT_TO_CHILDREN)
|
|
263
|
+
|
|
264
|
+
# do it recursively on all parent shapes
|
|
265
|
+
get_parent_shape.update if get_parent_shape
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Resize the shape to bound all child shapes. The function can be overridden if necessary.
|
|
269
|
+
def fit_to_children
|
|
270
|
+
# HINT: overload it for custom actions...
|
|
271
|
+
|
|
272
|
+
# get bounding box of the shape and children set be inside it
|
|
273
|
+
abs_pos = get_absolute_position
|
|
274
|
+
ch_bb = Wx::Rect.new(abs_pos.to_point, [0, 0])
|
|
275
|
+
|
|
276
|
+
@child_shapes.each do |child|
|
|
277
|
+
child.get_complete_bounding_box(ch_bb, BBMODE::SELF | BBMODE::CHILDREN) if child.has_style?(STYLE::ALWAYS_INSIDE)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# do not let the grid shape 'disappear' due to zero sizes...
|
|
281
|
+
if (ch_bb.width == 0 || ch_bb.height == 0) && @cell_space == 0
|
|
282
|
+
ch_bb.set_width(10)
|
|
283
|
+
ch_bb.set_height(10)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
@rect_size = Wx::RealPoint.new(ch_bb.width + 2*@cell_space, ch_bb.height + 2*@cell_space)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Do layout of assigned child shapes
|
|
290
|
+
def do_children_layout
|
|
291
|
+
return if @cols == 0 || @rows == 0
|
|
292
|
+
|
|
293
|
+
max_rect = Wx::Rect.new(0,0,0,0)
|
|
294
|
+
|
|
295
|
+
# get maximum size of all managed (child) shapes
|
|
296
|
+
@child_shapes.each do |shape|
|
|
297
|
+
curr_rect = shape.get_bounding_box
|
|
298
|
+
|
|
299
|
+
max_rect.set_width(curr_rect.width) if shape.get_h_align != HALIGN::EXPAND && curr_rect.width > max_rect.width
|
|
300
|
+
max_rect.set_height(curr_rect.height) if shape.get_v_align != VALIGN::EXPAND && curr_rect.height > max_rect.height
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
@cells.each_with_index do |id, i|
|
|
304
|
+
if id
|
|
305
|
+
shape = @child_shapes[id]
|
|
306
|
+
col = (i % @cols)
|
|
307
|
+
row = (i / @cols)
|
|
308
|
+
|
|
309
|
+
fit_shape_to_rect(shape, Wx::Rect.new(col*max_rect.width + (col+1)*@cell_space,
|
|
310
|
+
row*max_rect.height + (row+1)*@cell_space,
|
|
311
|
+
max_rect.width, max_rect.height))
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# Event handler called when any shape is dropped above this shape (and the dropped
|
|
317
|
+
# shape is accepted as a child of this shape). The function can be overridden if necessary.
|
|
318
|
+
#
|
|
319
|
+
# The function is called by the framework (by the shape canvas).
|
|
320
|
+
# @param [Wx::RealPoint] _pos Relative position of dropped shape
|
|
321
|
+
# @param [Shape] child dropped shape
|
|
322
|
+
def on_child_dropped(_pos, child)
|
|
323
|
+
append_to_grid(child) if child && !child.is_a?(LineShape)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
protected
|
|
327
|
+
|
|
328
|
+
# Move and resize given shape so it will fit the given bounding rectangle.
|
|
329
|
+
#
|
|
330
|
+
# The shape is aligned inside the given bounding rectangle in accordance to the shape's
|
|
331
|
+
# valign and halign flags.
|
|
332
|
+
# @param [Shape] shape modified shape
|
|
333
|
+
# @param [Wx::Rect] rct Bounding rectangle
|
|
334
|
+
# @see Shape#set_v_align
|
|
335
|
+
# @see Shape#set_h_align
|
|
336
|
+
def fit_shape_to_rect(shape, rct)
|
|
337
|
+
shape_bb = shape.get_bounding_box
|
|
338
|
+
prev_pos = shape.get_relative_position
|
|
339
|
+
|
|
340
|
+
# do vertical alignment
|
|
341
|
+
case shape.get_v_align
|
|
342
|
+
when VALIGN::TOP
|
|
343
|
+
shape.set_relative_position(prev_pos.x, rct.top + shape.get_v_border)
|
|
344
|
+
when VALIGN::MIDDLE
|
|
345
|
+
shape.set_relative_position(prev_pos.x, rct.top + (rct.height/2 - shape_bb.height/2))
|
|
346
|
+
when VALIGN::BOTTOM
|
|
347
|
+
shape.set_relative_position(prev_pos.x, rct.bottom - shape_bb.height - shape.get_v_border)
|
|
348
|
+
when VALIGN::EXPAND
|
|
349
|
+
if shape.has_style?(STYLE::SIZE_CHANGE)
|
|
350
|
+
shape.set_relative_position(prev_pos.x, rct.top + shape.get_v_border)
|
|
351
|
+
shape.scale(1.0, (rct.height - 2*shape.get_v_border).to_f/shape_bb.height)
|
|
352
|
+
end
|
|
353
|
+
else
|
|
354
|
+
shape.set_relative_position(prev_pos.x, rct.top)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
prev_pos = shape.get_relative_position
|
|
358
|
+
|
|
359
|
+
# do horizontal alignment
|
|
360
|
+
case shape.get_h_align
|
|
361
|
+
when HALIGN::LEFT
|
|
362
|
+
shape.set_relative_position(rct.left + shape.get_h_border, prev_pos.y)
|
|
363
|
+
when HALIGN::CENTER
|
|
364
|
+
shape.set_relative_position(rct.left + (rct.width/2 - shape_bb.width/2), prev_pos.y)
|
|
365
|
+
when HALIGN::RIGHT
|
|
366
|
+
shape.set_relative_position(rct.right - shape_bb.width - shape.get_h_border, prev_pos.y)
|
|
367
|
+
when HALIGN::EXPAND
|
|
368
|
+
if shape.has_style?(STYLE::SIZE_CHANGE)
|
|
369
|
+
shape.set_relative_position(rct.left + shape.get_h_border, prev_pos.y)
|
|
370
|
+
shape.scale((rct.width - 2*shape.get_h_border).to_f/shape_bb.width, 1.9)
|
|
371
|
+
end
|
|
372
|
+
else
|
|
373
|
+
shape.set_relative_position(rct.left, prev_pos.y)
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
private
|
|
378
|
+
|
|
379
|
+
# Deserialization only.
|
|
380
|
+
|
|
381
|
+
def get_rows
|
|
382
|
+
@rows
|
|
383
|
+
end
|
|
384
|
+
def set_rows(num)
|
|
385
|
+
@rows = num
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
def get_cols
|
|
389
|
+
@cols
|
|
390
|
+
end
|
|
391
|
+
def set_cols(num)
|
|
392
|
+
@cols = num
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def get_cells
|
|
396
|
+
@cells
|
|
397
|
+
end
|
|
398
|
+
def set_cells(cells)
|
|
399
|
+
@cells = cells
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
end
|