84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
import esphome.config_validation as cv
|
|
from esphome.const import CONF_MODE, CONF_OPTIONS
|
|
|
|
from ..defines import (
|
|
CONF_ANIMATED,
|
|
CONF_MAIN,
|
|
CONF_SELECTED,
|
|
CONF_SELECTED_INDEX,
|
|
CONF_SELECTED_TEXT,
|
|
CONF_VISIBLE_ROW_COUNT,
|
|
ROLLER_MODES,
|
|
literal,
|
|
)
|
|
from ..helpers import lvgl_components_required
|
|
from ..lv_validation import animated, lv_int, lv_text, option_string
|
|
from ..lvcode import lv_add
|
|
from ..types import LvSelect
|
|
from . import WidgetType
|
|
from .label import CONF_LABEL
|
|
|
|
CONF_ROLLER = "roller"
|
|
lv_roller_t = LvSelect("LvRollerType")
|
|
|
|
ROLLER_BASE_SCHEMA = cv.Schema(
|
|
{
|
|
cv.Exclusive(CONF_SELECTED_INDEX, CONF_SELECTED_TEXT): lv_int,
|
|
cv.Exclusive(CONF_SELECTED_TEXT, CONF_SELECTED_TEXT): lv_text,
|
|
cv.Optional(CONF_VISIBLE_ROW_COUNT): lv_int,
|
|
cv.Optional(CONF_MODE): ROLLER_MODES.one_of,
|
|
}
|
|
)
|
|
|
|
ROLLER_SCHEMA = ROLLER_BASE_SCHEMA.extend(
|
|
{
|
|
cv.Required(CONF_OPTIONS): cv.ensure_list(option_string),
|
|
}
|
|
)
|
|
|
|
ROLLER_MODIFY_SCHEMA = ROLLER_BASE_SCHEMA.extend(
|
|
{
|
|
cv.Optional(CONF_ANIMATED, default=True): animated,
|
|
cv.Optional(CONF_OPTIONS): cv.ensure_list(option_string),
|
|
}
|
|
)
|
|
|
|
|
|
class RollerType(WidgetType):
|
|
def __init__(self):
|
|
super().__init__(
|
|
CONF_ROLLER,
|
|
lv_roller_t,
|
|
(CONF_MAIN, CONF_SELECTED),
|
|
ROLLER_SCHEMA,
|
|
ROLLER_MODIFY_SCHEMA,
|
|
)
|
|
|
|
async def to_code(self, w, config):
|
|
lvgl_components_required.add(CONF_ROLLER)
|
|
if mode := config.get(CONF_MODE):
|
|
mode = await ROLLER_MODES.process(mode)
|
|
lv_add(w.var.set_mode(mode))
|
|
if options := config.get(CONF_OPTIONS):
|
|
lv_add(w.var.set_options(options))
|
|
animopt = literal(config.get(CONF_ANIMATED, "LV_ANIM_OFF"))
|
|
if (selected := config.get(CONF_SELECTED_INDEX)) is not None:
|
|
value = await lv_int.process(selected)
|
|
lv_add(w.var.set_selected_index(value, animopt))
|
|
if (selected := config.get(CONF_SELECTED_TEXT)) is not None:
|
|
value = await lv_text.process(selected)
|
|
lv_add(w.var.set_selected_text(value, animopt))
|
|
await w.set_property(
|
|
CONF_VISIBLE_ROW_COUNT,
|
|
await lv_int.process(config.get(CONF_VISIBLE_ROW_COUNT)),
|
|
)
|
|
|
|
@property
|
|
def animated(self):
|
|
return True
|
|
|
|
def get_uses(self):
|
|
return (CONF_LABEL,)
|
|
|
|
|
|
roller_spec = RollerType()
|