mirror of https://github.com/esphome/esphome.git
Fixes for grid layout
This commit is contained in:
parent
531ddd35de
commit
2ebce83610
|
@ -802,8 +802,8 @@ LAYOUT_SCHEMA = {
|
|||
cv.Optional(df.CONF_LAYOUT): cv.typed_schema(
|
||||
{
|
||||
df.TYPE_GRID: {
|
||||
cv.Required(df.CONF_GRID_ROWS): grid_spec,
|
||||
cv.Required(df.CONF_GRID_COLUMNS): grid_spec,
|
||||
cv.Required(df.CONF_GRID_ROWS): [grid_spec],
|
||||
cv.Required(df.CONF_GRID_COLUMNS): [grid_spec],
|
||||
cv.Optional(df.CONF_GRID_COLUMN_ALIGN): grid_alignments,
|
||||
cv.Optional(df.CONF_GRID_ROW_ALIGN): grid_alignments,
|
||||
},
|
||||
|
@ -825,8 +825,8 @@ GRID_CELL_SCHEMA = {
|
|||
cv.Required(df.CONF_GRID_CELL_COLUMN_POS): cv.positive_int,
|
||||
cv.Optional(df.CONF_GRID_CELL_ROW_SPAN, default=1): cv.positive_int,
|
||||
cv.Optional(df.CONF_GRID_CELL_COLUMN_SPAN, default=1): cv.positive_int,
|
||||
cv.Optional(df.CONF_GRID_CELL_X_ALIGN, default="start"): cell_alignments,
|
||||
cv.Optional(df.CONF_GRID_CELL_Y_ALIGN, default="start"): cell_alignments,
|
||||
cv.Optional(df.CONF_GRID_CELL_X_ALIGN, default="start"): grid_alignments,
|
||||
cv.Optional(df.CONF_GRID_CELL_Y_ALIGN, default="start"): grid_alignments,
|
||||
}
|
||||
|
||||
FLEX_OBJ_SCHEMA = {
|
||||
|
@ -855,6 +855,22 @@ def obj_schema(wtype: str):
|
|||
WIDGET_SCHEMAS = {}
|
||||
|
||||
|
||||
def container_validator(schema):
|
||||
def validator(value):
|
||||
ltype = df.TYPE_NONE
|
||||
if value and (layout := value.get(df.CONF_LAYOUT)):
|
||||
if not isinstance(layout, dict):
|
||||
raise cv.Invalid("Layout value must be a dict")
|
||||
ltype = layout.get(CONF_TYPE)
|
||||
lv.lv_uses.add(ltype.upper())
|
||||
result = schema.extend(WIDGET_SCHEMAS[ltype.lower()])
|
||||
if value == SCHEMA_EXTRACT:
|
||||
return result
|
||||
return result(value)
|
||||
|
||||
return validator
|
||||
|
||||
|
||||
def container_schema(widget_type, extras=None):
|
||||
lv_type = ty.get_widget_type(widget_type)
|
||||
schema = obj_schema(widget_type).extend({cv.GenerateID(): cv.declare_id(lv_type)})
|
||||
|
@ -862,21 +878,8 @@ def container_schema(widget_type, extras=None):
|
|||
schema = schema.extend(globs)
|
||||
if extras:
|
||||
schema = schema.extend(extras)
|
||||
|
||||
# Delayed evaluation for recursion
|
||||
def validator(value):
|
||||
result = schema
|
||||
ltype = df.TYPE_NONE
|
||||
if value and (layout := value.get(df.CONF_LAYOUT)):
|
||||
if not isinstance(layout, dict):
|
||||
raise cv.Invalid("Layout value must be a dict")
|
||||
ltype = layout.get(CONF_TYPE)
|
||||
result = result.extend(WIDGET_SCHEMAS[ltype.lower()])
|
||||
if value == SCHEMA_EXTRACT:
|
||||
return result
|
||||
return result(value)
|
||||
|
||||
return validator
|
||||
return container_validator(schema)
|
||||
|
||||
|
||||
def widget_schema(name, extras=None):
|
||||
|
@ -892,13 +895,15 @@ def any_widget_schema(extras=None):
|
|||
|
||||
WIDGET_SCHEMA = any_widget_schema()
|
||||
|
||||
TILE_SCHEMA = {
|
||||
cv.Required(CONF_ROW): lv_int,
|
||||
cv.Required(df.CONF_COLUMN): lv_int,
|
||||
cv.GenerateID(): cv.declare_id(ty.lv_tile_t),
|
||||
cv.Optional(df.CONF_DIR, default="ALL"): df.TILE_DIRECTIONS.several_of,
|
||||
cv.Required(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA),
|
||||
}
|
||||
TILE_SCHEMA = container_schema(
|
||||
df.CONF_OBJ,
|
||||
{
|
||||
cv.Required(CONF_ROW): lv_int,
|
||||
cv.Required(df.CONF_COLUMN): lv_int,
|
||||
cv.GenerateID(): cv.declare_id(ty.lv_tile_t),
|
||||
cv.Optional(df.CONF_DIR, default="ALL"): df.TILE_DIRECTIONS.several_of,
|
||||
},
|
||||
)
|
||||
|
||||
TILEVIEW_SCHEMA = {
|
||||
cv.Required(df.CONF_TILES): cv.ensure_list(TILE_SCHEMA),
|
||||
|
@ -911,11 +916,13 @@ TILEVIEW_SCHEMA = {
|
|||
),
|
||||
}
|
||||
|
||||
TAB_SCHEMA = {
|
||||
cv.Required(CONF_NAME): cv.string,
|
||||
cv.GenerateID(): cv.declare_id(ty.lv_tab_t),
|
||||
cv.Required(df.CONF_WIDGETS): cv.ensure_list(WIDGET_SCHEMA),
|
||||
}
|
||||
TAB_SCHEMA = container_schema(
|
||||
df.CONF_OBJ,
|
||||
{
|
||||
cv.Required(CONF_NAME): cv.string,
|
||||
cv.GenerateID(): cv.declare_id(ty.lv_tab_t),
|
||||
},
|
||||
)
|
||||
|
||||
TABVIEW_SCHEMA = {
|
||||
cv.Required(df.CONF_TABS): cv.ensure_list(TAB_SCHEMA),
|
||||
|
@ -930,7 +937,6 @@ TABVIEW_SCHEMA = {
|
|||
),
|
||||
}
|
||||
|
||||
|
||||
MSGBOX_SCHEMA = STYLE_SCHEMA.extend(
|
||||
{
|
||||
cv.GenerateID(CONF_ID): cv.declare_id(ty.lv_obj_t),
|
||||
|
@ -1105,7 +1111,6 @@ async def set_obj_properties(widg: Widget, config):
|
|||
init = []
|
||||
if layout := config.get(df.CONF_LAYOUT):
|
||||
layout_type: str = layout[CONF_TYPE]
|
||||
lv.lv_uses.add(layout_type.upper())
|
||||
init.extend(
|
||||
widg.set_property(
|
||||
df.CONF_LAYOUT, f"LV_LAYOUT_{layout_type.upper()}", ltype="obj"
|
||||
|
@ -1128,7 +1133,6 @@ async def set_obj_properties(widg: Widget, config):
|
|||
column_array = cg.static_const_array(column_id, cg.RawExpression(columns))
|
||||
init.extend(widg.set_style("grid_column_dsc_array", column_array, 0))
|
||||
if layout_type == df.TYPE_FLEX:
|
||||
lv.lv_uses.add(df.TYPE_FLEX)
|
||||
init.extend(widg.set_property(df.CONF_FLEX_FLOW, layout, ltype="obj"))
|
||||
main = layout[df.CONF_FLEX_ALIGN_MAIN]
|
||||
cross = layout[df.CONF_FLEX_ALIGN_CROSS]
|
||||
|
@ -1257,31 +1261,36 @@ def tabview_obj_creator(parent: Widget, config: dict):
|
|||
|
||||
|
||||
async def tabview_to_code(tv: Widget, config: dict):
|
||||
lv.lv_uses.add("btnmatrix")
|
||||
init = []
|
||||
for widg in config[df.CONF_TABS]:
|
||||
w_id = widg[CONF_ID]
|
||||
for tab_conf in config[df.CONF_TABS]:
|
||||
w_id = tab_conf[CONF_ID]
|
||||
tab_obj = cg.Pvariable(w_id, cg.nullptr, type_=ty.lv_tab_t)
|
||||
tab = Widget(tab_obj, ty.lv_tab_t)
|
||||
widget_map[w_id] = tab
|
||||
init.append(f'{tab_obj} = lv_tabview_add_tab({tv.obj}, "{widg[CONF_NAME]}")')
|
||||
init.extend(await add_widgets(tab, widg))
|
||||
tab_widget = Widget(tab_obj, ty.lv_tab_t)
|
||||
widget_map[w_id] = tab_widget
|
||||
init.append(
|
||||
f'{tab_obj} = lv_tabview_add_tab({tv.obj}, "{tab_conf[CONF_NAME]}")'
|
||||
)
|
||||
init.extend(await set_obj_properties(tab_widget, tab_conf))
|
||||
init.extend(await add_widgets(tab_widget, tab_conf))
|
||||
return init
|
||||
|
||||
|
||||
async def tileview_to_code(var: Widget, config: dict):
|
||||
init = []
|
||||
for widg in config[df.CONF_TILES]:
|
||||
w_id = widg[CONF_ID]
|
||||
for tile_conf in config[df.CONF_TILES]:
|
||||
w_id = tile_conf[CONF_ID]
|
||||
tile_obj = cg.Pvariable(w_id, cg.nullptr, type_=ty.lv_obj_t)
|
||||
tile = Widget(tile_obj, ty.lv_tile_t)
|
||||
widget_map[w_id] = tile
|
||||
dirs = widg[df.CONF_DIR]
|
||||
dirs = tile_conf[df.CONF_DIR]
|
||||
if isinstance(dirs, list):
|
||||
dirs = "|".join(dirs)
|
||||
init.append(
|
||||
f"{tile.obj} = lv_tileview_add_tile({var.obj}, {widg[df.CONF_COLUMN]}, {widg[CONF_ROW]}, {dirs})"
|
||||
f"{tile.obj} = lv_tileview_add_tile({var.obj}, {tile_conf[df.CONF_COLUMN]}, {tile_conf[CONF_ROW]}, {dirs})"
|
||||
)
|
||||
init.extend(await add_widgets(tile, widg))
|
||||
init.extend(await set_obj_properties(tile, tile_conf))
|
||||
init.extend(await add_widgets(tile, tile_conf))
|
||||
return init
|
||||
|
||||
|
||||
|
|
|
@ -160,13 +160,15 @@ lvgl:
|
|||
- btn:
|
||||
layout:
|
||||
type: grid
|
||||
grid_rows: 2
|
||||
grid_columns: 2
|
||||
grid_rows: [fr(1), content]
|
||||
grid_columns: [100, fr(2)]
|
||||
grid_column_align: space_evenly
|
||||
grid_row_align: center
|
||||
checkable: true
|
||||
widgets:
|
||||
- label:
|
||||
grid_cell_x_align: stretch
|
||||
grid_cell_y_align: stretch
|
||||
grid_cell_row_span: 2
|
||||
grid_cell_column_span: 2
|
||||
grid_cell_row_pos: 0
|
||||
|
@ -408,8 +410,8 @@ lvgl:
|
|||
- btn:
|
||||
layout:
|
||||
type: grid
|
||||
grid_rows: 2
|
||||
grid_columns: 2
|
||||
grid_rows: [content, content]
|
||||
grid_columns: [100, fr(2)]
|
||||
id: spin_down
|
||||
on_click:
|
||||
- lvgl.spinbox.decrement: spinbox_id
|
||||
|
@ -540,6 +542,8 @@ lvgl:
|
|||
tabs:
|
||||
- name: Tab1
|
||||
id: tabview_tab_1
|
||||
layout:
|
||||
type: flex
|
||||
widgets:
|
||||
- img:
|
||||
src: dog_img
|
||||
|
|
Loading…
Reference in New Issue