svghmi/widgets_common.ysl2
changeset 3520 b27e50143083
parent 3504 9d895a103019
child 3522 f3a14422d56e
--- a/svghmi/widgets_common.ysl2	Mon Jun 20 09:30:11 2022 +0200
+++ b/svghmi/widgets_common.ysl2	Wed Jun 22 11:48:40 2022 +0200
@@ -14,6 +14,13 @@
     }
 };
 
+decl activable() alias - {
+    |     activable_sub:{
+    labels("/active /inactive") {
+        content;
+    }
+    |     }
+};
 decl activable_labels(*ptr) alias - {
     optional_labels(*ptr) {
         with "subelements","'active inactive'";
@@ -165,6 +172,33 @@
     ||
     var pending_widget_animates = [];
 
+    function _hide(elt, placeholder){
+        if(elt.parentNode != null)
+            placeholder.parentNode.removeChild(elt);
+    }
+    function _show(elt, placeholder){
+        placeholder.parentNode.insertBefore(elt, placeholder);
+    }
+
+    function set_activation_state(eltsub, state){
+        if(eltsub.active_elt_placeholder == undefined){
+            eltsub.active_elt_placeholder = document.createComment("");
+            eltsub.active_elt.parentNode.insertBefore(eltsub.active_elt_placeholder, eltsub.active_elt);
+            eltsub.inactive_elt_placeholder = document.createComment("");
+            eltsub.inactive_elt.parentNode.insertBefore(eltsub.inactive_elt_placeholder, eltsub.inactive_elt);
+        }
+        (state?_show:_hide)(eltsub.active_elt, eltsub.active_elt_placeholder);
+        ((state || state==undefined)?_hide:_show)(eltsub.inactive_elt, eltsub.inactive_elt_placeholder);
+    }
+
+    function activate_activable(eltsub) {
+        set_activation_state(eltsub, true);
+    }
+
+    function inactivate_activable(eltsub) {
+        set_activation_state(eltsub, false);
+    }
+
     class Widget {
         offset = 0;
         frequency = 10; /* FIXME arbitrary default max freq. Obtain from config ? */
@@ -411,17 +445,10 @@
                 this.pending_animate = true;
                 requestHMIAnimation();
             }
-
-        }
-
-        activate_activable(eltsub) {
-            eltsub.inactive.style.display = "none";
-            eltsub.active.style.display = "";
-        }
-
-        inactivate_activable(eltsub) {
-            eltsub.active.style.display = "none";
-            eltsub.inactive.style.display = "";
+        }
+
+        set_activation_state(state){
+            set_activation_state(this.activable_sub, state);
         }
     }
     ||
@@ -489,7 +516,7 @@
                 |         /* missing «$name»/«$subname» element */
                             }
                             otherwise {
-                |         "«$subname»": id("«$subelt/@id»")`if "position()!=last()" > ,`
+                |         "«$subname»_elt": id("«$subelt/@id»")`if "position()!=last()" > ,`
                             }
                         }
                     }