mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 05:06:32 +00:00
HASPmota add generic setter and getters for style attributes (#20919)
This commit is contained in:
parent
268fad6d0d
commit
9e8bd2156b
File diff suppressed because it is too large
Load Diff
@ -48,91 +48,12 @@ class lvh_root
|
|||||||
#
|
#
|
||||||
# If mapping is null, we use set_X and get_X from our own class
|
# If mapping is null, we use set_X and get_X from our own class
|
||||||
static var _attr_map = {
|
static var _attr_map = {
|
||||||
"x": "x",
|
|
||||||
"y": "y",
|
|
||||||
"w": "width",
|
"w": "width",
|
||||||
"h": "height",
|
"h": "height",
|
||||||
# special case for height/width that can be in styles
|
|
||||||
"height": "style_height",
|
|
||||||
"width": "style_width",
|
|
||||||
# arc
|
|
||||||
# "asjustable": nil,
|
|
||||||
# "mode": nil,
|
|
||||||
"start_angle": "bg_start_angle",
|
"start_angle": "bg_start_angle",
|
||||||
"start_angle1": "start_angle",
|
"start_angle1": "start_angle",
|
||||||
"end_angle": "bg_end_angle",
|
"end_angle": "bg_end_angle",
|
||||||
"end_angle1": "end_angle",
|
"end_angle1": "end_angle",
|
||||||
"radius": "style_radius",
|
|
||||||
"border_side": "style_border_side",
|
|
||||||
"border_width": "style_border_width",
|
|
||||||
"border_color": "style_border_color",
|
|
||||||
"border_opa": "style_border_opa",
|
|
||||||
"border_post": "style_border_pot",
|
|
||||||
# "line_width": nil, # depends on class
|
|
||||||
# "line_width1": nil, # depends on class
|
|
||||||
# "action": nil, # store the action in self.action
|
|
||||||
# "hidden": nil, # apply to self
|
|
||||||
# "enabled": nil, # apply to self
|
|
||||||
# "click": nil, # synonym to enabled
|
|
||||||
# "toggle": nil,
|
|
||||||
"bg_color": "style_bg_color",
|
|
||||||
"bg_opa": "style_bg_opa",
|
|
||||||
"bg_grad_color": "style_bg_grad_color",
|
|
||||||
"bg_grad_dir": "style_bg_grad_dir",
|
|
||||||
"line_color": "style_line_color",
|
|
||||||
"line_rounded": "style_line_rounded",
|
|
||||||
"line_dash_gap": "style_line_dash_gap",
|
|
||||||
"line_dash_width": "style_line_dash_width",
|
|
||||||
"line_opa": "style_line_opa",
|
|
||||||
"arc_color": "style_arc_color",
|
|
||||||
"arc_opa": "style_arc_opa",
|
|
||||||
"arc_rounded": "style_arc_rounded",
|
|
||||||
"arc_width": "style_arc_width",
|
|
||||||
"pad_left": "style_pad_left",
|
|
||||||
"pad_right": "style_pad_right",
|
|
||||||
"pad_top": "style_pad_top",
|
|
||||||
"pad_bottom": "style_pad_bottom",
|
|
||||||
"pad_all": "style_pad_all", # write-only
|
|
||||||
# "type": nil,
|
|
||||||
# below automatically create a sub-label
|
|
||||||
# "text": nil, # apply to self
|
|
||||||
# "value_str": nil, # synonym to 'text'
|
|
||||||
# "align": nil,
|
|
||||||
# "text_font": nil,
|
|
||||||
# "value_font": nil, # synonym to text_font
|
|
||||||
# "text_color": nil,
|
|
||||||
# "value_color": nil, # synonym to text_color
|
|
||||||
# "value_ofs_x": nil,
|
|
||||||
# "value_ofs_y": nil,
|
|
||||||
#
|
|
||||||
# "min": nil,
|
|
||||||
# "max": nil,
|
|
||||||
# "val": nil,
|
|
||||||
"rotation": "rotation",
|
|
||||||
# img
|
|
||||||
"src": "src",
|
|
||||||
"image_recolor": "style_img_recolor",
|
|
||||||
"image_recolor_opa": "style_img_recolor_opa",
|
|
||||||
# spinner
|
|
||||||
# "angle": nil,
|
|
||||||
# "speed": nil,
|
|
||||||
# padding of knob
|
|
||||||
# "pad_top2": nil,
|
|
||||||
# "pad_bottom2": nil,
|
|
||||||
# "pad_left2": nil,
|
|
||||||
# "pad_right2": nil,
|
|
||||||
# "pad_all2": nil,
|
|
||||||
# "radius2": nil,
|
|
||||||
# rule based update of attributes
|
|
||||||
# supporting both `val` and `text`
|
|
||||||
# "val_rule": nil,
|
|
||||||
# "val_rule_formula": nil,
|
|
||||||
# "text_rule": nil,
|
|
||||||
# "text_rule_formula": nil,
|
|
||||||
# "text_rule_format": nil,
|
|
||||||
# "meta": nil,
|
|
||||||
# roller
|
|
||||||
# "options": nil,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#====================================================================
|
#====================================================================
|
||||||
@ -1007,23 +928,20 @@ class lvh_obj : lvh_root
|
|||||||
import string
|
import string
|
||||||
import introspect
|
import introspect
|
||||||
|
|
||||||
# print("> getmember", k)
|
if string.startswith(k, "set_") || string.startswith(k, "get_") return end
|
||||||
var prefix = k[0..3]
|
|
||||||
if prefix == "set_" || prefix == "get_" return end # avoid recursion
|
|
||||||
|
|
||||||
# check if the attribute ends with 2 digits, if so remove the two suffix digits
|
# check if the attribute ends with 2 digits, if so remove the two suffix digits
|
||||||
var style_modifier = 0
|
var style_modifier = nil
|
||||||
if size(k) >= 3
|
if size(k) >= 3
|
||||||
var char_last_1 = string.byte(k[-1])
|
var char_last_1 = string.byte(k[-1])
|
||||||
var char_last_2 = string.byte(k[-2])
|
var char_last_2 = string.byte(k[-2])
|
||||||
var suffix_digits = nil
|
|
||||||
if (char_last_1 >= 0x30 && char_last_1 <= 0x39 && char_last_2 >= 0x30 && char_last_2 <= 0x39)
|
if (char_last_1 >= 0x30 && char_last_1 <= 0x39 && char_last_2 >= 0x30 && char_last_2 <= 0x39)
|
||||||
# we extract the last 2 digits
|
# we extract the last 2 digits
|
||||||
suffix_digits = int(k[-2..])
|
var suffix_digits = int(k[-2..])
|
||||||
k = k [0..-3] # remove 2 last digits
|
k = k[0..-3] # remove 2 last digits
|
||||||
end
|
|
||||||
style_modifier = self.digits_to_style(suffix_digits)
|
style_modifier = self.digits_to_style(suffix_digits)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
# print(f">>>: getmember {k=} {style_modifier=}")
|
# print(f">>>: getmember {k=} {style_modifier=}")
|
||||||
|
|
||||||
# if attribute name is in ignore list, abort
|
# if attribute name is in ignore list, abort
|
||||||
@ -1033,30 +951,27 @@ class lvh_obj : lvh_root
|
|||||||
var f = introspect.get(self, "get_" + k) # call self method
|
var f = introspect.get(self, "get_" + k) # call self method
|
||||||
if type(f) == 'function'
|
if type(f) == 'function'
|
||||||
# print(f">>>: getmember local method get_{k}")
|
# print(f">>>: getmember local method get_{k}")
|
||||||
return f(self, style_modifier)
|
return f(self, style_modifier != nil ? style_modifier : 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
# next check if there is a mapping to an LVGL attribute
|
# apply any synonym from _attr_map
|
||||||
if self._attr_map.contains(k)
|
k = self._attr_map.find(k, k)
|
||||||
var kv = self._attr_map[k]
|
|
||||||
|
|
||||||
f = introspect.get(self._lv_obj, "get_" + kv)
|
# try first `get_X` from lvgl object, only if there is no style modifier
|
||||||
|
if (style_modifier == nil)
|
||||||
|
f = introspect.get(self._lv_obj, "get_" + k)
|
||||||
if type(f) == 'function' # found and function, call it
|
if type(f) == 'function' # found and function, call it
|
||||||
if string.find(kv, "style_") == 0
|
|
||||||
# print(f">>>: getmember style_ method get_{k}")
|
|
||||||
# style function need a selector as second parameter
|
|
||||||
return f(self._lv_obj, style_modifier)
|
|
||||||
else
|
|
||||||
# print(f">>>: getmember standard method get_{k}")
|
# print(f">>>: getmember standard method get_{k}")
|
||||||
return f(self._lv_obj)
|
return f(self._lv_obj)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# finally try any `get_XXX` within the LVGL object
|
# if not found, try `get_style_X`
|
||||||
f = introspect.get(self._lv_obj, "get_" + k)
|
f = introspect.get(self._lv_obj, "get_style_" + k)
|
||||||
if type(f) == 'function' # found and function, call it
|
if type(f) == 'function' # found and function, call it
|
||||||
return f(self._lv_obj)
|
# print(f">>>: getmember style_ method get_{k}")
|
||||||
|
# style function need a selector as second parameter
|
||||||
|
return f(self._lv_obj, style_modifier != nil ? style_modifier : 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
# fallback to exception if attribute unknown or not a function
|
# fallback to exception if attribute unknown or not a function
|
||||||
@ -1070,23 +985,20 @@ class lvh_obj : lvh_root
|
|||||||
import string
|
import string
|
||||||
import introspect
|
import introspect
|
||||||
|
|
||||||
# print(">>>: setmember", k, v)
|
if string.startswith(k, "set_") || string.startswith(k, "get_") return end
|
||||||
var prefix = k[0..3]
|
|
||||||
if prefix == "set_" || prefix == "get_" return end # avoid infinite loop
|
|
||||||
|
|
||||||
# check if the attribute ends with 2 digits, if so remove the two suffix digits
|
# check if the attribute ends with 2 digits, if so remove the two suffix digits
|
||||||
var style_modifier = 0
|
var style_modifier = nil
|
||||||
if size(k) >= 3
|
if size(k) >= 3
|
||||||
var char_last_1 = string.byte(k[-1])
|
var char_last_1 = string.byte(k[-1])
|
||||||
var char_last_2 = string.byte(k[-2])
|
var char_last_2 = string.byte(k[-2])
|
||||||
var suffix_digits = nil
|
|
||||||
if (char_last_1 >= 0x30 && char_last_1 <= 0x39 && char_last_2 >= 0x30 && char_last_2 <= 0x39)
|
if (char_last_1 >= 0x30 && char_last_1 <= 0x39 && char_last_2 >= 0x30 && char_last_2 <= 0x39)
|
||||||
# we extract the last 2 digits
|
# we extract the last 2 digits
|
||||||
suffix_digits = int(k[-2..])
|
var suffix_digits = int(k[-2..])
|
||||||
k = k [0..-3] # remove 2 last digits
|
k = k[0..-3] # remove 2 last digits
|
||||||
end
|
|
||||||
style_modifier = self.digits_to_style(suffix_digits)
|
style_modifier = self.digits_to_style(suffix_digits)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
# print(f">>>: setmember {k=} {style_modifier=}")
|
# print(f">>>: setmember {k=} {style_modifier=}")
|
||||||
|
|
||||||
# if attribute name is in ignore list, abort
|
# if attribute name is in ignore list, abort
|
||||||
@ -1096,51 +1008,37 @@ class lvh_obj : lvh_root
|
|||||||
var f = introspect.get(self, "set_" + k)
|
var f = introspect.get(self, "set_" + k)
|
||||||
if type(f) == 'function'
|
if type(f) == 'function'
|
||||||
# print(f">>>: setmember local method set_{k}")
|
# print(f">>>: setmember local method set_{k}")
|
||||||
f(self, v, style_modifier)
|
f(self, v, style_modifier != nil ? style_modifier : 0)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
# next check if there is a mapping to an LVGL attribute
|
# apply any synonym from _attr_map
|
||||||
if self._attr_map.contains(k)
|
k = self._attr_map.find(k, k)
|
||||||
|
|
||||||
var kv = self._attr_map[k]
|
|
||||||
f = introspect.get(self._lv_obj, "set_" + kv)
|
|
||||||
# if the attribute contains 'color', convert to lv_color
|
# if the attribute contains 'color', convert to lv_color
|
||||||
if self.is_color_attribute(kv)
|
if self.is_color_attribute(k)
|
||||||
v = self.parse_color(v)
|
v = self.parse_color(v)
|
||||||
end
|
end
|
||||||
# print("f=", f, v, kv, self._lv_obj, self)
|
|
||||||
if type(f) == 'function'
|
# try first `set_X` from lvgl object
|
||||||
try
|
if (style_modifier == nil)
|
||||||
if string.find(kv, "style_") == 0
|
|
||||||
# print(f">>>: setmember style_ method set_{k}")
|
|
||||||
# style function need a selector as second parameter
|
|
||||||
f(self._lv_obj, v, style_modifier)
|
|
||||||
else
|
|
||||||
# print(f">>>: setmember standard method set_{k}")
|
|
||||||
f(self._lv_obj, v)
|
|
||||||
end
|
|
||||||
except .. as e, m
|
|
||||||
raise e, m + " for " + k
|
|
||||||
end
|
|
||||||
return
|
|
||||||
else
|
|
||||||
print("HSP: Could not find function set_"+kv)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
f = introspect.get(self._lv_obj, "set_" + k)
|
f = introspect.get(self._lv_obj, "set_" + k)
|
||||||
if type(f) == 'function'
|
if type(f) == 'function' # found and function, call it
|
||||||
try
|
# print(f">>>: setmember standard method set_{k}")
|
||||||
f(self._lv_obj, v)
|
return f(self._lv_obj, v)
|
||||||
except .. as e, m
|
|
||||||
raise e, m + " for " + k
|
|
||||||
end
|
|
||||||
else
|
|
||||||
print("HSP: unknown attribute:", k)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# if not found, try `set_style_X`
|
||||||
|
f = introspect.get(self._lv_obj, "set_style_" + k)
|
||||||
|
if type(f) == 'function' # found and function, call it
|
||||||
|
# print(f">>>: setmember style_ method set_{k}")
|
||||||
|
# style function need a selector as second parameter
|
||||||
|
return f(self._lv_obj, v, style_modifier != nil ? style_modifier : 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
print("HSP: unknown attribute:", k)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
#################################################################################
|
#################################################################################
|
||||||
@ -1514,6 +1412,9 @@ class lvh_dropdown : lvh_obj
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#====================================================================
|
||||||
|
# bar
|
||||||
|
#====================================================================
|
||||||
class lvh_bar : lvh_obj
|
class lvh_bar : lvh_obj
|
||||||
static var _lv_class = lv.bar
|
static var _lv_class = lv.bar
|
||||||
|
|
||||||
@ -1533,6 +1434,40 @@ class lvh_bar : lvh_obj
|
|||||||
def get_max()
|
def get_max()
|
||||||
return self._lv_obj.get_max_value()
|
return self._lv_obj.get_max_value()
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#====================================================================
|
||||||
|
# scale
|
||||||
|
#====================================================================
|
||||||
|
class lvh_scale : lvh_obj
|
||||||
|
static var _lv_class = lv.scale
|
||||||
|
var _options # need to keep the reference alive to avoid GC
|
||||||
|
var _options_arr # need to keep the reference alive to avoid GC
|
||||||
|
|
||||||
|
def set_text_src(l)
|
||||||
|
if (isinstance(l, list))
|
||||||
|
self._options = l
|
||||||
|
self._options_arr = lv.str_arr(l)
|
||||||
|
self._lv_obj.set_text_src(self._options_arr)
|
||||||
|
else
|
||||||
|
print("HTP: 'scale' needs 'text_src' to be a list of strings")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def get_text_src()
|
||||||
|
return self._options
|
||||||
|
end
|
||||||
|
def set_min(t)
|
||||||
|
self._lv_obj.set_range(int(t), self._lv_obj.get_range_max_value())
|
||||||
|
end
|
||||||
|
def set_max(t)
|
||||||
|
self._lv_obj.set_range(self._lv_obj.get_range_min_value(), int(t))
|
||||||
|
end
|
||||||
|
def get_min()
|
||||||
|
return self._lv_obj.get_range_min_value()
|
||||||
|
end
|
||||||
|
def get_max()
|
||||||
|
return self._lv_obj.get_range_max_value()
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1599,10 +1534,7 @@ class lvh_span : lvh_root
|
|||||||
# import string
|
# import string
|
||||||
# import introspect
|
# import introspect
|
||||||
|
|
||||||
# do
|
# if string.startswith(k, "set_") || string.startswith(k, "get_") return end
|
||||||
# var prefix = k[0..3]
|
|
||||||
# if prefix == "set_" || prefix == "get_" return end # avoid recursion
|
|
||||||
# end
|
|
||||||
|
|
||||||
# # if attribute name is in ignore list, abort
|
# # if attribute name is in ignore list, abort
|
||||||
# if self._attr_ignore.find(k) != nil return end
|
# if self._attr_ignore.find(k) != nil return end
|
||||||
@ -1632,11 +1564,7 @@ class lvh_span : lvh_root
|
|||||||
import string
|
import string
|
||||||
import introspect
|
import introspect
|
||||||
|
|
||||||
do
|
if string.startswith(k, "set_") || string.startswith(k, "get_") return end
|
||||||
# print(">>>: span setmember", k, v)
|
|
||||||
var prefix = k[0..3]
|
|
||||||
if prefix == "set_" || prefix == "get_" return end # avoid infinite loop
|
|
||||||
end
|
|
||||||
|
|
||||||
# if attribute name is in ignore list, abort
|
# if attribute name is in ignore list, abort
|
||||||
if self._attr_ignore.find(k) != nil return end
|
if self._attr_ignore.find(k) != nil return end
|
||||||
@ -2006,6 +1934,7 @@ class HASPmota
|
|||||||
# static lvh_gauge = lvh_gauge
|
# static lvh_gauge = lvh_gauge
|
||||||
# static lvh_textarea = lvh_textarea # additional?
|
# static lvh_textarea = lvh_textarea # additional?
|
||||||
static lvh_led = lvh_led
|
static lvh_led = lvh_led
|
||||||
|
static lvh_scale = lvh_scale
|
||||||
static lvh_spangroup = lvh_spangroup
|
static lvh_spangroup = lvh_spangroup
|
||||||
static lvh_span = lvh_span
|
static lvh_span = lvh_span
|
||||||
static lvh_qrcode = lvh_qrcode
|
static lvh_qrcode = lvh_qrcode
|
||||||
@ -2483,6 +2412,7 @@ def solidify_haspmota()
|
|||||||
"btn", "switch", "checkbox",
|
"btn", "switch", "checkbox",
|
||||||
"label", "spinner", "line", "img", "roller", "btnmatrix",
|
"label", "spinner", "line", "img", "roller", "btnmatrix",
|
||||||
"bar", "slider", "arc", #- "textarea", -# "led", "dropdown",
|
"bar", "slider", "arc", #- "textarea", -# "led", "dropdown",
|
||||||
|
"scale",
|
||||||
"qrcode", "chart", "spangroup", "span",
|
"qrcode", "chart", "spangroup", "span",
|
||||||
# new internal names
|
# new internal names
|
||||||
"button", "image", "buttonmatrix",
|
"button", "image", "buttonmatrix",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user