22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/dedalus/view_traversal.rb', line 22
def walk!(structure, origin:, dimensions:, freeform: false, render: false, z_index: ZOrder::Background)
width, height = *dimensions
height = structure.height if !structure.is_a?(Array) && structure.height
width = structure.width if !structure.is_a?(Array) && structure.width
x0, y0 = *origin
if structure.is_a?(Dedalus::Atom)
@atom_callback.call(structure, origin: origin, dimensions: dimensions, freeform: freeform, z_index: z_index) if @atom_callback
elsif structure.is_a?(Array)
walk_rows!(structure, origin: origin, dimensions: dimensions, render: render)
elsif structure.is_a?(Dedalus::Element)
offset = structure.offset || [0,0]
ox,oy = *offset
margin = structure.margin || 0.0
x,y = x0 + ox + margin, y0 + oy + margin
margin_origin = [ x, y ]
margin_dims = [ width - margin*2, height - margin*2 ]
if structure.is_a?(Dedalus::Molecule) && @molecule_callback
@molecule_callback.call(structure, origin: margin_origin, dimensions: margin_dims, z_index: z_index)
end
if @element_callback
@element_callback.call(structure, origin: margin_origin, dimensions: margin_dims, z_index: z_index)
end
pad = structure.padding || 0.0
pad_origin = [x+pad,y+pad]
pad_dims = [width - pad*2 - margin*2, height - pad*2 - margin*2 ]
if structure.is_a?(LayerStack)
structure.layers.each do |layer|
if layer.freeform?
if layer.shown.is_a?(Array)
layer.elements.each_with_index do |layer_element, z_offset|
walk!(layer_element, origin: pad_origin, dimensions: pad_dims, freeform: true, render: render, z_index: z_index+z_offset)
end
else
walk!(layer.elements, origin: pad_origin, dimensions: pad_dims, freeform: true, render: render, z_index: z_index)
end
else
walk!(layer.elements, origin: pad_origin, dimensions: pad_dims, freeform: false, render: render, z_index: z_index)
end
end
else
if structure.record? && render
recorded_image = ImageRepository.lookup_recording(structure.name, structure.width, structure.height, structure.window, force: structure.rerecord?) do
walk!(structure.shown, origin: [0,0], dimensions: pad_dims, freeform: freeform, render: render)
end
ox,oy = *pad_origin
recorded_image.draw(ox,oy,z_index)
else
walk!(structure.shown, origin: pad_origin, dimensions: pad_dims, freeform: freeform, render: render, z_index: z_index)
end
end
end
rescue => ex
puts "ERROR: Encountered an error with structure of type #{structure.class.name}"
p ex.message
p ex.backtrace
raise ex
end
|