mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 00:18:11 +01:00
[lvgl] Implement qrcode (#7623)
This commit is contained in:
parent
1e2497748d
commit
22f30d42a6
3 changed files with 68 additions and 0 deletions
|
@ -71,6 +71,7 @@ from .widgets.meter import meter_spec
|
||||||
from .widgets.msgbox import MSGBOX_SCHEMA, msgboxes_to_code
|
from .widgets.msgbox import MSGBOX_SCHEMA, msgboxes_to_code
|
||||||
from .widgets.obj import obj_spec
|
from .widgets.obj import obj_spec
|
||||||
from .widgets.page import add_pages, generate_page_triggers, page_spec
|
from .widgets.page import add_pages, generate_page_triggers, page_spec
|
||||||
|
from .widgets.qrcode import qr_code_spec
|
||||||
from .widgets.roller import roller_spec
|
from .widgets.roller import roller_spec
|
||||||
from .widgets.slider import slider_spec
|
from .widgets.slider import slider_spec
|
||||||
from .widgets.spinbox import spinbox_spec
|
from .widgets.spinbox import spinbox_spec
|
||||||
|
@ -109,6 +110,7 @@ for w_type in (
|
||||||
spinbox_spec,
|
spinbox_spec,
|
||||||
keyboard_spec,
|
keyboard_spec,
|
||||||
tileview_spec,
|
tileview_spec,
|
||||||
|
qr_code_spec,
|
||||||
):
|
):
|
||||||
WIDGET_TYPES[w_type.name] = w_type
|
WIDGET_TYPES[w_type.name] = w_type
|
||||||
|
|
||||||
|
|
54
esphome/components/lvgl/widgets/qrcode.py
Normal file
54
esphome/components/lvgl/widgets/qrcode.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import esphome.codegen as cg
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.const import CONF_SIZE, CONF_TEXT
|
||||||
|
from esphome.cpp_generator import MockObjClass
|
||||||
|
|
||||||
|
from ..defines import CONF_MAIN, literal
|
||||||
|
from ..lv_validation import color, color_retmapper, lv_text
|
||||||
|
from ..lvcode import LocalVariable, lv, lv_expr
|
||||||
|
from ..schemas import TEXT_SCHEMA
|
||||||
|
from ..types import WidgetType, lv_obj_t
|
||||||
|
from . import Widget
|
||||||
|
|
||||||
|
CONF_QRCODE = "qrcode"
|
||||||
|
CONF_DARK_COLOR = "dark_color"
|
||||||
|
CONF_LIGHT_COLOR = "light_color"
|
||||||
|
|
||||||
|
QRCODE_SCHEMA = TEXT_SCHEMA.extend(
|
||||||
|
{
|
||||||
|
cv.Optional(CONF_DARK_COLOR, default="black"): color,
|
||||||
|
cv.Optional(CONF_LIGHT_COLOR, default="white"): color,
|
||||||
|
cv.Required(CONF_SIZE): cv.int_,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class QrCodeType(WidgetType):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(
|
||||||
|
CONF_QRCODE,
|
||||||
|
lv_obj_t,
|
||||||
|
(CONF_MAIN,),
|
||||||
|
QRCODE_SCHEMA,
|
||||||
|
modify_schema=TEXT_SCHEMA,
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_uses(self):
|
||||||
|
return ("canvas", "img")
|
||||||
|
|
||||||
|
def obj_creator(self, parent: MockObjClass, config: dict):
|
||||||
|
dark_color = color_retmapper(config[CONF_DARK_COLOR])
|
||||||
|
light_color = color_retmapper(config[CONF_LIGHT_COLOR])
|
||||||
|
size = config[CONF_SIZE]
|
||||||
|
return lv_expr.call("qrcode_create", parent, size, dark_color, light_color)
|
||||||
|
|
||||||
|
async def to_code(self, w: Widget, config):
|
||||||
|
if (value := config.get(CONF_TEXT)) is not None:
|
||||||
|
value = await lv_text.process(value)
|
||||||
|
with LocalVariable(
|
||||||
|
"qr_text", cg.const_char_ptr, value, modifier=""
|
||||||
|
) as str_obj:
|
||||||
|
lv.qrcode_update(w.obj, str_obj, literal(f"strlen({str_obj})"))
|
||||||
|
|
||||||
|
|
||||||
|
qr_code_spec = QrCodeType()
|
|
@ -458,6 +458,18 @@ lvgl:
|
||||||
|
|
||||||
- id: page2
|
- id: page2
|
||||||
widgets:
|
widgets:
|
||||||
|
- qrcode:
|
||||||
|
id: lv_qr
|
||||||
|
align: left_mid
|
||||||
|
size: 100
|
||||||
|
light_color: whitesmoke
|
||||||
|
dark_color: steelblue
|
||||||
|
text: esphome.io
|
||||||
|
on_click:
|
||||||
|
lvgl.qrcode.update:
|
||||||
|
id: lv_qr
|
||||||
|
text: homeassistant.io
|
||||||
|
|
||||||
- slider:
|
- slider:
|
||||||
min_value: 0
|
min_value: 0
|
||||||
max_value: 255
|
max_value: 255
|
||||||
|
|
Loading…
Reference in a new issue