SVGHMI: Add Assign widget, doing multiple assignments on click.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_assign.ysl2 Tue Oct 04 11:04:33 2022 +0200
@@ -0,0 +1,88 @@
+// widget_assign.ysl2
+
+widget_desc("Assign") {
+ longdesc
+ ||
+
+ Arguments are either:
+
+ - name=value: setting variable with literal value.
+ - name=other_name: copy variable content into another
+
+ "active"+"inactive" labeled elements can be provided to show feedback when pressed
+
+ Exemples:
+
+ HMI:Assign:notify=1@notify=/PLCVAR
+ HMI:Assign:ack=2:notify=1@ack=.local_var@notify=/PLCVAR
+
+ ||
+
+ shortdesc > Assign variables on click
+
+}
+
+widget_class("Assign") {
+||
+ frequency = 2;
+
+ onmouseup(evt) {
+ svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
+ if(this.enable_state) {
+ this.activity_state = false
+ this.request_animate();
+ this.assign();
+ }
+ }
+
+ onmousedown(){
+ if(this.enable_state) {
+ svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
+ this.activity_state = true;
+ this.request_animate();
+ }
+ }
+
+||
+}
+
+widget_defs("Assign") {
+ optional_activable();
+
+ | init: function() {
+ | this.bound_onmouseup = this.onmouseup.bind(this);
+ | this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+ | },
+
+ | assignments: {},
+ | dispatch: function(value, oldval, varnum) {
+ const "widget", ".";
+ foreach "path" {
+ const "varid","generate-id()";
+ const "varnum","position()-1";
+ if "@assign" foreach "$widget/path[@assign]" if "$varid = generate-id()" {
+ | if(varnum == «$varnum») this.assignments["«@assign»"] = value;
+ }
+ }
+ | },
+ | assign: function() {
+ const "paths","path";
+ foreach "arg[contains(@value,'=')]"{
+ const "name","substring-before(@value,'=')";
+ const "value","substring-after(@value,'=')";
+ const "index" foreach "$paths" if "@assign = $name" value "position()-1";
+ const "isVarName", "regexp:test($value,'^[a-zA-Z_][a-zA-Z0-9_]+$')";
+ choose {
+ when "$isVarName"{
+ | const «$value» = this.assignments["«$value»"];
+ | if(«$value» != undefined)
+ | this.apply_hmi_value(«$index», «$value»);
+ }
+ otherwise {
+ | this.apply_hmi_value(«$index», «$value»);
+ }
+ }
+ }
+ | },
+}
+