SVGHMI: HMI:DropDown menu aligns to selected when opening svghmi
authorEdouard Tisserant <edouard.tisserant@gmail.com>
Tue, 14 Apr 2020 23:04:54 +0200
branchsvghmi
changeset 2934 ee483e8346f5
parent 2933 ed3f712a8eef
child 2935 83d83aa0f085
SVGHMI: HMI:DropDown menu aligns to selected when opening
svghmi/gen_index_xhtml.xslt
svghmi/widget_dropdown.ysl2
--- a/svghmi/gen_index_xhtml.xslt	Tue Apr 14 22:08:52 2020 +0200
+++ b/svghmi/gen_index_xhtml.xslt	Tue Apr 14 23:04:54 2020 +0200
@@ -905,11 +905,21 @@
 </xsl:text>
     <xsl:text>    set_selection: function(value) {
 </xsl:text>
-    <xsl:text>        this.text_elt.firstElementChild.textContent = 
-</xsl:text>
-    <xsl:text>          (value &gt;= 0 &amp;&amp; value &lt; this.content.length) ?
-</xsl:text>
-    <xsl:text>            this.content[value] : "?"+String(value)+"?";
+    <xsl:text>        let display_str;
+</xsl:text>
+    <xsl:text>        if(value &gt;= 0 &amp;&amp; value &lt; this.content.length){
+</xsl:text>
+    <xsl:text>            display_str = this.content[value];
+</xsl:text>
+    <xsl:text>            this.last_selection = value;
+</xsl:text>
+    <xsl:text>        } else {
+</xsl:text>
+    <xsl:text>            display_str = "?"+String(value)+"?";
+</xsl:text>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>        this.text_elt.firstElementChild.textContent = display_str;
 </xsl:text>
     <xsl:text>    },
 </xsl:text>
@@ -1131,6 +1141,18 @@
 </xsl:text>
     <xsl:text>        } else {
 </xsl:text>
+    <xsl:text>            // align to selection
+</xsl:text>
+    <xsl:text>            let offset = this.last_selection - this.lift;
+</xsl:text>
+    <xsl:text>            if(offset &gt; 0)
+</xsl:text>
+    <xsl:text>                this.menu_offset = Math.min(offset + 1, length - slots + 1);
+</xsl:text>
+    <xsl:text>            else
+</xsl:text>
+    <xsl:text>                this.menu_offset = 0;
+</xsl:text>
     <xsl:text>            this.set_partial_text();
 </xsl:text>
     <xsl:text>        }
--- a/svghmi/widget_dropdown.ysl2	Tue Apr 14 22:08:52 2020 +0200
+++ b/svghmi/widget_dropdown.ysl2	Tue Apr 14 23:04:54 2020 +0200
@@ -41,9 +41,14 @@
         this.move(true);
     },
     set_selection: function(value) {
-        this.text_elt.firstElementChild.textContent = 
-          (value >= 0 && value < this.content.length) ?
-            this.content[value] : "?"+String(value)+"?";
+        let display_str;
+        if(value >= 0 && value < this.content.length){
+            display_str = this.content[value];
+            this.last_selection = value;
+        } else {
+            display_str = "?"+String(value)+"?";
+        }
+        this.text_elt.firstElementChild.textContent = display_str;
     },
     grow_text: function(up_to) {
         let count = 1;
@@ -150,6 +155,12 @@
         if(slots == length) {
             this.set_complete_text();
         } else {
+            // align to selection
+            let offset = this.last_selection - this.lift;
+            if(offset > 0)
+                this.menu_offset = Math.min(offset + 1, length - slots + 1);
+            else
+                this.menu_offset = 0;
             this.set_partial_text();
         }
         this.adjust_box_to_text();