mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 06:58:11 +01:00
[lvgl] Msgbox fixes and enhancements (#7380)
This commit is contained in:
parent
8bd46a43b9
commit
9722876ef6
5 changed files with 63 additions and 21 deletions
|
@ -229,19 +229,23 @@ async def obj_hide_to_code(config, action_id, template_arg, args):
|
||||||
async def do_hide(widget: Widget):
|
async def do_hide(widget: Widget):
|
||||||
widget.add_flag("LV_OBJ_FLAG_HIDDEN")
|
widget.add_flag("LV_OBJ_FLAG_HIDDEN")
|
||||||
|
|
||||||
return await action_to_code(
|
widgets = [
|
||||||
await get_widgets(config), do_hide, action_id, template_arg, args
|
widget.outer if widget.outer else widget for widget in await get_widgets(config)
|
||||||
)
|
]
|
||||||
|
return await action_to_code(widgets, do_hide, action_id, template_arg, args)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action("lvgl.widget.show", ObjUpdateAction, LIST_ACTION_SCHEMA)
|
@automation.register_action("lvgl.widget.show", ObjUpdateAction, LIST_ACTION_SCHEMA)
|
||||||
async def obj_show_to_code(config, action_id, template_arg, args):
|
async def obj_show_to_code(config, action_id, template_arg, args):
|
||||||
async def do_show(widget: Widget):
|
async def do_show(widget: Widget):
|
||||||
widget.clear_flag("LV_OBJ_FLAG_HIDDEN")
|
widget.clear_flag("LV_OBJ_FLAG_HIDDEN")
|
||||||
|
if widget.move_to_foreground:
|
||||||
|
lv_obj.move_foreground(widget.obj)
|
||||||
|
|
||||||
return await action_to_code(
|
widgets = [
|
||||||
await get_widgets(config), do_show, action_id, template_arg, args
|
widget.outer if widget.outer else widget for widget in await get_widgets(config)
|
||||||
)
|
]
|
||||||
|
return await action_to_code(widgets, do_show, action_id, template_arg, args)
|
||||||
|
|
||||||
|
|
||||||
def focused_id(value):
|
def focused_id(value):
|
||||||
|
|
|
@ -374,6 +374,7 @@ CONF_ANTIALIAS = "antialias"
|
||||||
CONF_ARC_LENGTH = "arc_length"
|
CONF_ARC_LENGTH = "arc_length"
|
||||||
CONF_AUTO_START = "auto_start"
|
CONF_AUTO_START = "auto_start"
|
||||||
CONF_BACKGROUND_STYLE = "background_style"
|
CONF_BACKGROUND_STYLE = "background_style"
|
||||||
|
CONF_BUTTON_STYLE = "button_style"
|
||||||
CONF_DECIMAL_PLACES = "decimal_places"
|
CONF_DECIMAL_PLACES = "decimal_places"
|
||||||
CONF_COLUMN = "column"
|
CONF_COLUMN = "column"
|
||||||
CONF_DIGITS = "digits"
|
CONF_DIGITS = "digits"
|
||||||
|
|
|
@ -89,6 +89,8 @@ class Widget:
|
||||||
self.obj = MockObj(f"{self.var}->obj")
|
self.obj = MockObj(f"{self.var}->obj")
|
||||||
else:
|
else:
|
||||||
self.obj = var
|
self.obj = var
|
||||||
|
self.outer = None
|
||||||
|
self.move_to_foreground = False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(name, var, wtype: WidgetType, config: dict = None):
|
def create(name, var, wtype: WidgetType, config: dict = None):
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
from esphome import config_validation as cv
|
from esphome import config_validation as cv
|
||||||
from esphome.const import CONF_BUTTON, CONF_ID, CONF_TEXT
|
from esphome.const import CONF_BUTTON, CONF_ID, CONF_ITEMS, CONF_TEXT
|
||||||
from esphome.core import ID
|
from esphome.core import ID
|
||||||
from esphome.cpp_generator import new_Pvariable, static_const_array
|
from esphome.cpp_generator import new_Pvariable, static_const_array
|
||||||
from esphome.cpp_types import nullptr
|
from esphome.cpp_types import nullptr
|
||||||
|
|
||||||
from ..defines import (
|
from ..defines import (
|
||||||
CONF_BODY,
|
CONF_BODY,
|
||||||
|
CONF_BUTTON_STYLE,
|
||||||
CONF_BUTTONS,
|
CONF_BUTTONS,
|
||||||
CONF_CLOSE_BUTTON,
|
CONF_CLOSE_BUTTON,
|
||||||
CONF_MSGBOXES,
|
CONF_MSGBOXES,
|
||||||
|
@ -25,7 +26,7 @@ from ..lvcode import (
|
||||||
lv_obj,
|
lv_obj,
|
||||||
lv_Pvariable,
|
lv_Pvariable,
|
||||||
)
|
)
|
||||||
from ..schemas import STYLE_SCHEMA, STYLED_TEXT_SCHEMA, container_schema
|
from ..schemas import STYLE_SCHEMA, STYLED_TEXT_SCHEMA, container_schema, part_schema
|
||||||
from ..styles import TOP_LAYER
|
from ..styles import TOP_LAYER
|
||||||
from ..types import LV_EVENT, char_ptr, lv_obj_t
|
from ..types import LV_EVENT, char_ptr, lv_obj_t
|
||||||
from . import Widget, set_obj_properties
|
from . import Widget, set_obj_properties
|
||||||
|
@ -48,9 +49,10 @@ MSGBOX_SCHEMA = container_schema(
|
||||||
{
|
{
|
||||||
cv.GenerateID(CONF_ID): cv.declare_id(lv_obj_t),
|
cv.GenerateID(CONF_ID): cv.declare_id(lv_obj_t),
|
||||||
cv.Required(CONF_TITLE): STYLED_TEXT_SCHEMA,
|
cv.Required(CONF_TITLE): STYLED_TEXT_SCHEMA,
|
||||||
cv.Optional(CONF_BODY): STYLED_TEXT_SCHEMA,
|
cv.Optional(CONF_BODY, default=""): STYLED_TEXT_SCHEMA,
|
||||||
cv.Optional(CONF_BUTTONS): cv.ensure_list(BUTTONMATRIX_BUTTON_SCHEMA),
|
cv.Optional(CONF_BUTTONS): cv.ensure_list(BUTTONMATRIX_BUTTON_SCHEMA),
|
||||||
cv.Optional(CONF_CLOSE_BUTTON): lv_bool,
|
cv.Optional(CONF_BUTTON_STYLE): part_schema(buttonmatrix_spec),
|
||||||
|
cv.Optional(CONF_CLOSE_BUTTON, default=True): lv_bool,
|
||||||
cv.GenerateID(CONF_BUTTON_TEXT_LIST_ID): cv.declare_id(char_ptr),
|
cv.GenerateID(CONF_BUTTON_TEXT_LIST_ID): cv.declare_id(char_ptr),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
@ -74,7 +76,8 @@ async def msgbox_to_code(conf):
|
||||||
)
|
)
|
||||||
lvgl_components_required.add("BUTTONMATRIX")
|
lvgl_components_required.add("BUTTONMATRIX")
|
||||||
messagebox_id = conf[CONF_ID]
|
messagebox_id = conf[CONF_ID]
|
||||||
outer = lv_Pvariable(lv_obj_t, messagebox_id.id)
|
outer_id = f"{messagebox_id.id}_outer"
|
||||||
|
outer = lv_Pvariable(lv_obj_t, messagebox_id.id + "_outer")
|
||||||
buttonmatrix = new_Pvariable(
|
buttonmatrix = new_Pvariable(
|
||||||
ID(
|
ID(
|
||||||
f"{messagebox_id.id}_buttonmatrix_",
|
f"{messagebox_id.id}_buttonmatrix_",
|
||||||
|
@ -82,8 +85,11 @@ async def msgbox_to_code(conf):
|
||||||
type=lv_buttonmatrix_t,
|
type=lv_buttonmatrix_t,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
msgbox = lv_Pvariable(lv_obj_t, f"{messagebox_id.id}_msgbox")
|
msgbox = lv_Pvariable(lv_obj_t, messagebox_id.id)
|
||||||
outer_widget = Widget.create(messagebox_id, outer, obj_spec, conf)
|
outer_widget = Widget.create(outer_id, outer, obj_spec, conf)
|
||||||
|
outer_widget.move_to_foreground = True
|
||||||
|
msgbox_widget = Widget.create(messagebox_id, msgbox, obj_spec, conf)
|
||||||
|
msgbox_widget.outer = outer_widget
|
||||||
buttonmatrix_widget = Widget.create(
|
buttonmatrix_widget = Widget.create(
|
||||||
str(buttonmatrix), buttonmatrix, buttonmatrix_spec, conf
|
str(buttonmatrix), buttonmatrix, buttonmatrix_spec, conf
|
||||||
)
|
)
|
||||||
|
@ -92,10 +98,8 @@ async def msgbox_to_code(conf):
|
||||||
)
|
)
|
||||||
text_id = conf[CONF_BUTTON_TEXT_LIST_ID]
|
text_id = conf[CONF_BUTTON_TEXT_LIST_ID]
|
||||||
text_list = static_const_array(text_id, text_list)
|
text_list = static_const_array(text_id, text_list)
|
||||||
if (text := conf.get(CONF_BODY)) is not None:
|
text = await lv_text.process(conf[CONF_BODY].get(CONF_TEXT, ""))
|
||||||
text = await lv_text.process(text.get(CONF_TEXT))
|
title = await lv_text.process(conf[CONF_TITLE].get(CONF_TEXT, ""))
|
||||||
if (title := conf.get(CONF_TITLE)) is not None:
|
|
||||||
title = await lv_text.process(title.get(CONF_TEXT))
|
|
||||||
close_button = conf[CONF_CLOSE_BUTTON]
|
close_button = conf[CONF_CLOSE_BUTTON]
|
||||||
lv_assign(outer, lv_expr.obj_create(TOP_LAYER))
|
lv_assign(outer, lv_expr.obj_create(TOP_LAYER))
|
||||||
lv_obj.set_width(outer, lv_pct(100))
|
lv_obj.set_width(outer, lv_pct(100))
|
||||||
|
@ -111,20 +115,27 @@ async def msgbox_to_code(conf):
|
||||||
)
|
)
|
||||||
lv_obj.set_style_align(msgbox, literal("LV_ALIGN_CENTER"), 0)
|
lv_obj.set_style_align(msgbox, literal("LV_ALIGN_CENTER"), 0)
|
||||||
lv_add(buttonmatrix.set_obj(lv_expr.msgbox_get_btns(msgbox)))
|
lv_add(buttonmatrix.set_obj(lv_expr.msgbox_get_btns(msgbox)))
|
||||||
await set_obj_properties(outer_widget, conf)
|
if button_style := conf.get(CONF_BUTTON_STYLE):
|
||||||
if close_button:
|
button_style = {CONF_ITEMS: button_style}
|
||||||
async with LambdaContext(EVENT_ARG, where=messagebox_id) as context:
|
await set_obj_properties(buttonmatrix_widget, button_style)
|
||||||
|
await set_obj_properties(msgbox_widget, conf)
|
||||||
|
async with LambdaContext(EVENT_ARG, where=messagebox_id) as close_action:
|
||||||
outer_widget.add_flag("LV_OBJ_FLAG_HIDDEN")
|
outer_widget.add_flag("LV_OBJ_FLAG_HIDDEN")
|
||||||
|
if close_button:
|
||||||
with LocalVariable(
|
with LocalVariable(
|
||||||
"close_btn_", lv_obj_t, lv_expr.msgbox_get_close_btn(msgbox)
|
"close_btn_", lv_obj_t, lv_expr.msgbox_get_close_btn(msgbox)
|
||||||
) as close_btn:
|
) as close_btn:
|
||||||
lv_obj.remove_event_cb(close_btn, nullptr)
|
lv_obj.remove_event_cb(close_btn, nullptr)
|
||||||
lv_obj.add_event_cb(
|
lv_obj.add_event_cb(
|
||||||
close_btn,
|
close_btn,
|
||||||
await context.get_lambda(),
|
await close_action.get_lambda(),
|
||||||
LV_EVENT.CLICKED,
|
LV_EVENT.CLICKED,
|
||||||
nullptr,
|
nullptr,
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
lv_obj.add_event_cb(
|
||||||
|
outer, await close_action.get_lambda(), LV_EVENT.CLICKED, nullptr
|
||||||
|
)
|
||||||
|
|
||||||
if len(ctrl_list) != 0 or len(width_list) != 0:
|
if len(ctrl_list) != 0 or len(width_list) != 0:
|
||||||
set_btn_data(buttonmatrix.obj, ctrl_list, width_list)
|
set_btn_data(buttonmatrix.obj, ctrl_list, width_list)
|
||||||
|
|
|
@ -52,6 +52,29 @@ lvgl:
|
||||||
- touchscreen_id: tft_touch
|
- touchscreen_id: tft_touch
|
||||||
long_press_repeat_time: 200ms
|
long_press_repeat_time: 200ms
|
||||||
long_press_time: 500ms
|
long_press_time: 500ms
|
||||||
|
|
||||||
|
msgboxes:
|
||||||
|
- id: message_box
|
||||||
|
close_button: true
|
||||||
|
title: Messagebox
|
||||||
|
bg_color: 0xffff
|
||||||
|
body:
|
||||||
|
text: This is a sample messagebox
|
||||||
|
bg_color: 0x808080
|
||||||
|
button_style:
|
||||||
|
bg_color: 0xff00
|
||||||
|
border_width: 4
|
||||||
|
buttons:
|
||||||
|
- id: msgbox_button
|
||||||
|
text: Button
|
||||||
|
- id: msgbox_apply
|
||||||
|
text: "Close"
|
||||||
|
on_click:
|
||||||
|
then:
|
||||||
|
- lvgl.widget.hide: message_box
|
||||||
|
- id: simple_msgbox
|
||||||
|
title: Simple
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
- id: page1
|
- id: page1
|
||||||
on_load:
|
on_load:
|
||||||
|
@ -98,6 +121,7 @@ lvgl:
|
||||||
- lvgl.update:
|
- lvgl.update:
|
||||||
disp_bg_color: 0xffff00
|
disp_bg_color: 0xffff00
|
||||||
disp_bg_image: cat_image
|
disp_bg_image: cat_image
|
||||||
|
- lvgl.widget.show: message_box
|
||||||
- label:
|
- label:
|
||||||
text: "Hello shiny day"
|
text: "Hello shiny day"
|
||||||
text_color: 0xFFFFFF
|
text_color: 0xFFFFFF
|
||||||
|
|
Loading…
Reference in a new issue