From 1d3ceacb14de42beb78bf579a33f6f4a9b970fd1 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Tue, 10 May 2022 21:31:35 +0200 Subject: [PATCH] Universal Sliders for Settings framework --- js/helpers.js | 8 ++++- js/settings.js | 86 ++++++++++++++++++++++++++++++++++++++++++++ tabs/pid_tuning.html | 62 +++++++++++++++++++++----------- 3 files changed, 135 insertions(+), 21 deletions(-) diff --git a/js/helpers.js b/js/helpers.js index 25ff1bae..cdba079b 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -57,4 +57,10 @@ function generateFilename(prefix, suffix) { + zeroPad(date.getSeconds(), 2); return filename + '.' + suffix; -} \ No newline at end of file +} + +function scaleRangeInt(x, srcMin, srcMax, destMin, destMax) { + let a = (destMax - destMin) * (x - srcMin); + let b = srcMax - srcMin; + return Math.round((a / b) + destMin); +} \ No newline at end of file diff --git a/js/settings.js b/js/settings.js index 76e9b640..e07ea3c8 100644 --- a/js/settings.js +++ b/js/settings.js @@ -66,6 +66,91 @@ var Settings = (function () { } else if (s.setting.type == 'string') { input.val(s.value); input.attr('maxlength', s.setting.max); + } else if (input.data('presentation') == 'range') { + + let scaledMax; + let scalingThreshold; + + if (input.data('normal-max')) { + scaledMax = s.setting.max * 2; + scalingThreshold = Math.round(scaledMax * 0.8); + } else { + scaledMax = s.setting.max; + scalingThreshold = scaledMax; + } + + + let $range = $(''); + if (input.data('step')) { + $range.attr('step', input.data('step')); + } + $range.css({ + 'display': 'block', + 'flex-grow': 100, + 'margin-left': '1em', + 'margin-right': '1em', + }); + + input.attr('min', s.setting.min); + input.attr('max', s.setting.max); + input.val(parseInt(s.value)); + input.css({ + 'width': 'auto', + 'min-width': '75px', + }); + + input.parent().css({ + 'display': 'flex', + 'width': '100%' + }); + $range.insertAfter(input); + + input.parent().find('.helpicon').css({ + 'top': '5px', + 'left': '-10px' + }); + + /* + * Update slider to input + */ + $range.on('input', function() { + let val = $(this).val(); + let normalMax = parseInt(input.data('normal-max')); + + console.log(val, normalMax); + + if (normalMax) { + if (val <= scalingThreshold) { + val = scaleRangeInt(val, 0, scalingThreshold, 0, normalMax); + } else { + val = scaleRangeInt(val, scalingThreshold + 1, scaledMax, normalMax + 1, s.setting.max); + } + } + console.log(val); + + input.val(val); + }); + + input.on('change', function() { + + let val = $(this).val(); + let newVal; + let normalMax = parseInt(input.data('normal-max')); + if (normalMax) { + if (val <= normalMax) { + newVal = scaleRangeInt(val, 0, normalMax, 0, scalingThreshold); + } else { + newVal = scaleRangeInt(val, normalMax + 1, s.setting.max, scalingThreshold + 1, scaledMax); + } + } else { + newVal = val; + } + + $range.val(newVal); + }); + + input.trigger('change'); + } else if (s.setting.type == 'float') { input.attr('type', 'number'); @@ -80,6 +165,7 @@ var Settings = (function () { input.attr('min', s.setting.min); input.attr('max', s.setting.max); input.val(s.value.toFixed(2)); + } else { var multiplier = parseFloat(input.data('setting-multiplier') || 1); diff --git a/tabs/pid_tuning.html b/tabs/pid_tuning.html index 352ea50a..c1298112 100644 --- a/tabs/pid_tuning.html +++ b/tabs/pid_tuning.html @@ -258,28 +258,36 @@ -
-
+
+ +
+
-
-
+
+ +
+
-
-
+
+ +
+
-
+
+ +
@@ -294,8 +302,10 @@ -
-
+
+ +
+
@@ -316,7 +326,9 @@ -
+
+ +
@@ -333,8 +345,10 @@ -
-
+
+ +
+
@@ -358,8 +372,10 @@ -
-
+
+ +
+
@@ -395,8 +411,10 @@ -
-
+
+ +
+
@@ -410,15 +428,19 @@ -
-
+
+ +
+
-
-
+
+ +
+