summaryrefslogtreecommitdiff
path: root/scripts/gui-common/widget-set.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gui-common/widget-set.js')
-rw-r--r--scripts/gui-common/widget-set.js95
1 files changed, 84 insertions, 11 deletions
diff --git a/scripts/gui-common/widget-set.js b/scripts/gui-common/widget-set.js
index b515831..bd6ccd8 100644
--- a/scripts/gui-common/widget-set.js
+++ b/scripts/gui-common/widget-set.js
@@ -1,9 +1,13 @@
+'use strict';
+
/**
* JSDoc types
*/
/**
- * @typedef {"button" | "toggle" | "checkbox" | "slider" | "color-temp" | "color-light" | "color-wheel" | "thermostat" | "scrubber"} DescType
+ * @typedef {"button" | "toggle" | "checkbox" | "radio" |
+ * "slider" | "color-temp" | "color-light" |
+ * "color-wheel" | "thermostat" | "multi-select" | "scrubber"} DescType
*/
/**
@@ -41,6 +45,14 @@
*/
/**
+ * @typedef OSmMultiSelectProps
+ * @property {Array<srting>} labels
+ * @property {Array<any>} values
+ * @property {number} max
+ * @property {boolean} remove
+ */
+
+/**
* @typedef OSmScrubberProps
* @property {number} max
* @property {number} min
@@ -51,7 +63,13 @@
*/
/**
- * @typedef {OSmButtonProps | OSmToggleProps | OSmSliderProps | OSmThermostatProps | OSmScrubberProps} OSmAnyProps
+ * @typedef OSmRadioSelectProps
+ * @property {Array<any>} values
+ * @property {Array<string>} labels
+ */
+
+/**
+ * @typedef {OSmButtonProps | OSmToggleProps | OSmSliderProps | OSmThermostatProps | OSmMultiSelectProps | OSmScrubberProps | OSmRadioSelectProps} OSmAnyProps
*/
/**
@@ -89,11 +107,19 @@
*/
/**
+ * @typedef {DescBase & {type: "multi-select", props: OSmMultiSelectProps, state: Array<number>}} DescMultiSelect
+ */
+
+/**
* @typedef {DescBase & {type: "scrubber", props: OSmScrubberProps, state: number}} DescScrubber
*/
/**
- * @typedef {DescButton | DescToggle | DescSlider | DescColorTemp | DescColorLight | DescColorWheel | DescThermostat | DescScrubber} DescAny
+ * @typedef {DescBase & {type: "radio", props: OSmRadioSelectProps, state: number | null}} DescRadioSelect
+ */
+
+/**
+ * @typedef {DescButton | DescToggle | DescSlider | DescColorTemp | DescColorLight | DescColorWheel | DescThermostat | DescMultiSelect | DescScrubber | DescRadioSelect} DescAny
*/
class WidgetSet extends EventTarget{
@@ -130,7 +156,7 @@ class WidgetSet extends EventTarget{
{
let merge = {...{tv: true, fv: false, text: ""}, ...desc.props};
let out = new WidgetButton(merge.tv, merge.fv);
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
out.element.innerText = merge.text;
return out;
}
@@ -151,7 +177,7 @@ class WidgetSet extends EventTarget{
out = new WidgetToggle(desc.state ? merge.tv : merge.fv, merge.tv, merge.fv);
out.element.innerText = merge.text;
}
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
return out;
}
@@ -164,7 +190,7 @@ class WidgetSet extends EventTarget{
{
let merge = {...{step: 0.1, precision: 1, percent: false}, ...desc.props};
let out = new WidgetSlider(desc.state, merge.min, merge.max, merge.step, merge.precision, merge.percent);
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
return out;
}
@@ -175,7 +201,7 @@ class WidgetSet extends EventTarget{
static parse_color_light(desc)
{
let out = new WidgetColorLight(Math.max(Math.min(desc.state, 1), 0));
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
return out;
}
@@ -186,7 +212,7 @@ class WidgetSet extends EventTarget{
static parse_color_temp(desc)
{
let out = new WidgetColorTemp(Math.max(Math.min(desc.state, 6000), 2700));
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
return out;
}
@@ -198,7 +224,7 @@ class WidgetSet extends EventTarget{
{
let value = new Color(...desc.state.channels);
let out = new WidgetColorWheel(value);
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
return out;
}
@@ -222,7 +248,26 @@ class WidgetSet extends EventTarget{
let cw = new Color(...merge.color_warm.channels);
let out = new WidgetThermostat(desc.state, merge.gague, merge.deviation, cc, ct, cw, merge.ct, merge.tw);
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
+ return out;
+ }
+
+ /**
+ * @param {DescMultiSelect} desc
+ * @returns {WidgetSelectButton}
+ */
+ static parse_multi_select(desc)
+ {
+ let merge = {...{max: 1, remove: true, labels: [], values: []}, ...desc.props};
+
+ let out = new WidgetSelectButton(merge.max, merge.remove);
+
+ for(let i = 0; i < Math.min(merge.labels.length, merge.values.length); i++) {
+ out.add_option(merge.labels[i], merge.values[i]);
+ }
+
+ out.set_indices(desc.state);
+
return out;
}
@@ -239,7 +284,30 @@ class WidgetSet extends EventTarget{
}, ...desc.props};
let out = new WidgetScrubber(desc.state, merge.max, merge.min, merge.step, merge.zones, merge.speed, merge.spring);
- out.setId("name", desc.name);
+ out.set_by_id("name", desc.name);
+ return out;
+ }
+
+ /**
+ *
+ * @param {DescRadioSelect} desc
+ * @returns {WidgetRadio}
+ */
+ static parse_radio(desc)
+ {
+ let merge = {...{
+
+ }, ...desc.props};
+ let out = new WidgetRadioGroup();
+
+ for (let i = 0; i < Math.min(merge.labels.length, merge.values.length); i++) {
+ out.add_option(merge.labels[i], merge.values[i]);
+ }
+
+ if (desc.state !== null)
+ out.set_by_index(desc.state);
+
+ out.set_by_id("name", desc.name);
return out;
}
@@ -276,9 +344,14 @@ class WidgetSet extends EventTarget{
case "thermostat":
out = WidgetSet.parse_thermostat(i);
break;
+ case "multi-select":
+ out = WidgetSet.parse_multi_select(i);
+ break;
case "scrubber":
out = WidgetSet.parse_scrubber(i);
break;
+ case "radio":
+ out = WidgetSet.parse_radio(i);
}
this.widgets[i.name] = out;
}