52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
from esphome import config_validation as cv
|
|
from esphome.const import CONF_BUTTON, CONF_TEXT
|
|
from esphome.cpp_generator import MockObj
|
|
|
|
from ..defines import CONF_MAIN, CONF_WIDGETS, add_lv_use
|
|
from ..lv_validation import lv_text
|
|
from ..lvcode import lv, lv_expr
|
|
from ..schemas import TEXT_SCHEMA
|
|
from ..types import LvBoolean
|
|
from . import Widget, WidgetType
|
|
from .label import label_spec
|
|
|
|
lv_button_t = LvBoolean("lv_button_t")
|
|
|
|
|
|
class ButtonType(WidgetType):
|
|
def __init__(self):
|
|
super().__init__(
|
|
CONF_BUTTON, lv_button_t, (CONF_MAIN,), schema=TEXT_SCHEMA, lv_name="btn"
|
|
)
|
|
|
|
def validate(self, value):
|
|
if CONF_TEXT in value:
|
|
if CONF_WIDGETS in value:
|
|
raise cv.Invalid("Cannot use both text and widgets in a button")
|
|
add_lv_use("label")
|
|
return value
|
|
|
|
def get_uses(self):
|
|
return ("btn",)
|
|
|
|
async def on_create(self, var: MockObj, config: dict):
|
|
if CONF_TEXT in config:
|
|
lv.label_create(var)
|
|
return var
|
|
|
|
async def to_code(self, w: Widget, config):
|
|
if text := config.get(CONF_TEXT):
|
|
label_widget = Widget.create(
|
|
None, lv_expr.obj_get_child(w.obj, 0), label_spec
|
|
)
|
|
await label_widget.set_property(CONF_TEXT, await lv_text.process(text))
|
|
|
|
def final_validate(self, widget, update_config, widget_config, path):
|
|
if CONF_TEXT in update_config and CONF_TEXT not in widget_config:
|
|
raise cv.Invalid(
|
|
"Button must have 'text:' configured to allow updating text", path
|
|
)
|
|
|
|
|
|
button_spec = ButtonType()
|