svghmi/detachable_pages.ysl2
branchsvghmi
changeset 3165 2db69e2c5673
parent 3161 edd558965f58
child 3170 aaa203270ab0
equal deleted inserted replaced
3164:ea4a61b4a325 3165:2db69e2c5673
    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 = {
   184     }
   217     }
   185     | In Foreach:
   218     | In Foreach:
   186     foreach "$in_forEach_widget_ids"{
   219     foreach "$in_forEach_widget_ids"{
   187         |  «.»
   220         |  «.»
   188     }
   221     }
   189 }
   222     | Overlapping 
       
   223     apply "$overlapping_geometry", mode="testtree";
       
   224 }