1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-01 10:52:19 +01:00

[lvgl] Replace spinbox step with selected_digit (#10349)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Clyde Stubbs
2025-08-29 11:58:58 +10:00
committed by GitHub
parent 6a92b691a0
commit ef98f67b41
4 changed files with 22 additions and 13 deletions

View File

@@ -451,6 +451,7 @@ CONF_GRID_ROWS = "grid_rows"
CONF_HEADER_MODE = "header_mode" CONF_HEADER_MODE = "header_mode"
CONF_HOME = "home" CONF_HOME = "home"
CONF_INITIAL_FOCUS = "initial_focus" CONF_INITIAL_FOCUS = "initial_focus"
CONF_SELECTED_DIGIT = "selected_digit"
CONF_KEY_CODE = "key_code" CONF_KEY_CODE = "key_code"
CONF_KEYPADS = "keypads" CONF_KEYPADS = "keypads"
CONF_LAYOUT = "layout" CONF_LAYOUT = "layout"

View File

@@ -67,7 +67,6 @@ class Widget:
self.type = wtype self.type = wtype
self.config = config self.config = config
self.scale = 1.0 self.scale = 1.0
self.step = 1.0
self.range_from = -sys.maxsize self.range_from = -sys.maxsize
self.range_to = sys.maxsize self.range_to = sys.maxsize
if wtype.is_compound(): if wtype.is_compound():

View File

@@ -11,6 +11,7 @@ from ..defines import (
CONF_ROLLOVER, CONF_ROLLOVER,
CONF_SCROLLBAR, CONF_SCROLLBAR,
CONF_SELECTED, CONF_SELECTED,
CONF_SELECTED_DIGIT,
CONF_TEXTAREA_PLACEHOLDER, CONF_TEXTAREA_PLACEHOLDER,
) )
from ..lv_validation import lv_bool, lv_float from ..lv_validation import lv_bool, lv_float
@@ -38,18 +39,24 @@ def validate_spinbox(config):
min_val = -1 - max_val min_val = -1 - max_val
range_from = int(config[CONF_RANGE_FROM]) range_from = int(config[CONF_RANGE_FROM])
range_to = int(config[CONF_RANGE_TO]) range_to = int(config[CONF_RANGE_TO])
step = int(config[CONF_STEP]) step = config[CONF_SELECTED_DIGIT]
digits = config[CONF_DIGITS]
if ( if (
range_from > max_val range_from > max_val
or range_from < min_val or range_from < min_val
or range_to > max_val or range_to > max_val
or range_to < min_val or range_to < min_val
): ):
raise cv.Invalid("Range outside allowed limits") raise cv.Invalid("Range outside allowed limits", path=[CONF_RANGE_FROM])
if step <= 0 or step >= (range_to - range_from) / 2: if digits <= config[CONF_DECIMAL_PLACES]:
raise cv.Invalid("Invalid step value") raise cv.Invalid(
if config[CONF_DIGITS] <= config[CONF_DECIMAL_PLACES]: "Number of digits must exceed number of decimal places", path=[CONF_DIGITS]
raise cv.Invalid("Number of digits must exceed number of decimal places") )
if step >= digits:
raise cv.Invalid(
"Initial selected digit must be less than number of digits",
path=[CONF_SELECTED_DIGIT],
)
return config return config
@@ -59,7 +66,10 @@ SPINBOX_SCHEMA = cv.Schema(
cv.Optional(CONF_RANGE_FROM, default=0): cv.float_, cv.Optional(CONF_RANGE_FROM, default=0): cv.float_,
cv.Optional(CONF_RANGE_TO, default=100): cv.float_, cv.Optional(CONF_RANGE_TO, default=100): cv.float_,
cv.Optional(CONF_DIGITS, default=4): cv.int_range(1, 10), cv.Optional(CONF_DIGITS, default=4): cv.int_range(1, 10),
cv.Optional(CONF_STEP, default=1.0): cv.positive_float, cv.Optional(CONF_STEP): cv.invalid(
f"{CONF_STEP} has been replaced by {CONF_SELECTED_DIGIT}"
),
cv.Optional(CONF_SELECTED_DIGIT, default=0): cv.positive_int,
cv.Optional(CONF_DECIMAL_PLACES, default=0): cv.int_range(0, 6), cv.Optional(CONF_DECIMAL_PLACES, default=0): cv.int_range(0, 6),
cv.Optional(CONF_ROLLOVER, default=False): lv_bool, cv.Optional(CONF_ROLLOVER, default=False): lv_bool,
} }
@@ -93,13 +103,12 @@ class SpinboxType(WidgetType):
scale = 10 ** config[CONF_DECIMAL_PLACES] scale = 10 ** config[CONF_DECIMAL_PLACES]
range_from = int(config[CONF_RANGE_FROM]) * scale range_from = int(config[CONF_RANGE_FROM]) * scale
range_to = int(config[CONF_RANGE_TO]) * scale range_to = int(config[CONF_RANGE_TO]) * scale
step = int(config[CONF_STEP]) * scale step = config[CONF_SELECTED_DIGIT]
w.scale = scale w.scale = scale
w.step = step
w.range_to = range_to w.range_to = range_to
w.range_from = range_from w.range_from = range_from
lv.spinbox_set_range(w.obj, range_from, range_to) lv.spinbox_set_range(w.obj, range_from, range_to)
await w.set_property(CONF_STEP, step) await w.set_property("step", 10**step)
await w.set_property(CONF_ROLLOVER, config) await w.set_property(CONF_ROLLOVER, config)
lv.spinbox_set_digit_format( lv.spinbox_set_digit_format(
w.obj, digits, digits - config[CONF_DECIMAL_PLACES] w.obj, digits, digits - config[CONF_DECIMAL_PLACES]
@@ -120,7 +129,7 @@ class SpinboxType(WidgetType):
return config[CONF_RANGE_FROM] return config[CONF_RANGE_FROM]
def get_step(self, config: dict): def get_step(self, config: dict):
return config[CONF_STEP] return 10 ** config[CONF_SELECTED_DIGIT]
spinbox_spec = SpinboxType() spinbox_spec = SpinboxType()

View File

@@ -684,7 +684,7 @@ lvgl:
width: 120 width: 120
range_from: -10 range_from: -10
range_to: 1000 range_to: 1000
step: 5.0 selected_digit: 2
rollover: false rollover: false
digits: 6 digits: 6
decimal_places: 2 decimal_places: 2