42 otherwise |
42 otherwise |
43 result "$descend"; |
43 result "$descend"; |
44 } |
44 } |
45 } |
45 } |
46 |
46 |
|
47 // variable "overlapping_geometry" was added for optimization. |
|
48 // It avoids calling func:overlapping_geometry 3 times for each page |
|
49 // (apparently libxml doesn't cache exslt function results) |
|
50 // in order to optimize further, func:overlapping_geometry |
|
51 // should be implemented in python or even C, |
|
52 // as this is still the main bottleneck here |
|
53 const "_overlapping_geometry" { |
|
54 const "k", "'overlapping'"; |
|
55 const "m", "'computing belonging of widgets to pages'"; |
|
56 value "ns:ProgressStart($k, $m)"; |
|
57 foreach "$hmi_pages | $keypads" { |
|
58 const "k2", "concat('overlapping:', @id)"; |
|
59 const "m2", "concat('collecting membership of ', @inkscape:label)"; |
|
60 value "ns:ProgressStart($k2, $m2)"; |
|
61 elt { |
|
62 attrib "id" > «@id» |
|
63 copy "func:overlapping_geometry(.)"; |
|
64 } |
|
65 value "ns:ProgressEnd($k2, $m2)"; |
|
66 } |
|
67 value "ns:ProgressEnd($k, $m)"; |
|
68 } |
|
69 |
|
70 const "overlapping_geometry", "exsl:node-set($_overlapping_geometry)"; |
|
71 |
47 def "func:all_related_elements" { |
72 def "func:all_related_elements" { |
48 param "page"; |
73 param "page"; |
49 const "page_overlapping_geometry", "func:overlapping_geometry($page)"; |
74 const "page_overlapping_geometry", "$overlapping_geometry/elt[@id = $page/@id]/*"; |
50 const "page_overlapping_elements", "//svg:*[@id = $page_overlapping_geometry/@Id]"; |
75 const "page_overlapping_elements", "//svg:*[@id = $page_overlapping_geometry/@Id]"; |
51 const "page_sub_elements", "func:refered_elements($page | $page_overlapping_elements)"; |
76 const "page_sub_elements", "func:refered_elements($page | $page_overlapping_elements)"; |
52 result "$page_sub_elements"; |
77 result "$page_sub_elements"; |
53 } |
78 } |
|
79 |
54 |
80 |
55 def "func:required_elements" { |
81 def "func:required_elements" { |
56 param "pages"; |
82 param "pages"; |
57 choose{ |
83 choose{ |
58 when "$pages"{ |
84 when "$pages"{ |
112 const "in_forEach_widget_ids", "func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]/@id"; |
138 const "in_forEach_widget_ids", "func:refered_elements($forEach_widgets)[not(@id = $forEach_widgets_ids)]/@id"; |
113 |
139 |
114 template "svg:*", mode="page_desc" { |
140 template "svg:*", mode="page_desc" { |
115 if "ancestor::*[@id = $hmi_pages/@id]" error > HMI:Page «@id» is nested in another HMI:Page |
141 if "ancestor::*[@id = $hmi_pages/@id]" error > HMI:Page «@id» is nested in another HMI:Page |
116 |
142 |
|
143 |
117 const "desc", "func:widget(@id)"; |
144 const "desc", "func:widget(@id)"; |
|
145 const "msg", "concat('generating page description ', $desc/arg[1]/@value)"; |
|
146 value "ns:ProgressStart($msg)"; |
118 const "page", "."; |
147 const "page", "."; |
119 const "p", "$geometry[@Id = $page/@id]"; |
148 const "p", "$geometry[@Id = $page/@id]"; |
120 |
149 |
121 const "page_all_elements", "func:all_related_elements($page)"; |
150 const "page_all_elements", "func:all_related_elements($page)"; |
122 |
151 |
125 const "page_relative_widgets", |
154 const "page_relative_widgets", |
126 "$page_managed_widgets[func:is_descendant_path(func:widget(@id)/path/@value, $desc/path/@value)]"; |
155 "$page_managed_widgets[func:is_descendant_path(func:widget(@id)/path/@value, $desc/path/@value)]"; |
127 |
156 |
128 // Take closest ancestor in detachable_elements |
157 // Take closest ancestor in detachable_elements |
129 // since nested detachable elements are filtered out |
158 // since nested detachable elements are filtered out |
|
159 const "sumarized_page", |
|
160 """func:sumarized_elements($page_all_elements)"""; |
|
161 |
130 const "required_detachables", |
162 const "required_detachables", |
131 """func:sumarized_elements($page_all_elements)/ |
163 """$sumarized_page/ |
132 ancestor-or-self::*[@id = $detachable_elements/@id]"""; |
164 ancestor-or-self::*[@id = $detachable_elements/@id]"""; |
133 |
165 |
134 | "«$desc/arg[1]/@value»": { |
166 | "«$desc/arg[1]/@value»": { |
135 //| widget: hmi_widgets["«@id»"], |
167 //| widget: hmi_widgets["«@id»"], |
136 | bbox: [«$p/@x», «$p/@y», «$p/@w», «$p/@h»], |
168 | bbox: [«$p/@x», «$p/@y», «$p/@w», «$p/@h»], |
162 /* TODO generate some code for init() instead */ |
194 /* TODO generate some code for init() instead */ |
163 apply "$parsed_widgets/widget[@id = $all_page_widgets/@id]", mode="per_page_widget_template"{ |
195 apply "$parsed_widgets/widget[@id = $all_page_widgets/@id]", mode="per_page_widget_template"{ |
164 with "page_desc", "$desc"; |
196 with "page_desc", "$desc"; |
165 } |
197 } |
166 | }`if "position()!=last()" > ,` |
198 | }`if "position()!=last()" > ,` |
|
199 value "ns:ProgressEnd($msg)"; |
167 } |
200 } |
168 |
201 |
169 emit "definitions:page-desc" { |
202 emit "definitions:page-desc" { |
170 | |
203 | |
171 | var page_desc = { |
204 | var page_desc = { |