[lvgl] Allow multiple widgets per grid cell (#12091)

This commit is contained in:
Clyde Stubbs
2025-11-26 05:06:42 +10:00
committed by GitHub
parent dec323e786
commit b6be5e3eda
2 changed files with 13 additions and 1 deletions
+8 -1
View File
@@ -36,6 +36,8 @@ from .defines import (
) )
from .lv_validation import padding, size from .lv_validation import padding, size
CONF_MULTIPLE_WIDGETS_PER_CELL = "multiple_widgets_per_cell"
cell_alignments = LV_CELL_ALIGNMENTS.one_of cell_alignments = LV_CELL_ALIGNMENTS.one_of
grid_alignments = LV_GRID_ALIGNMENTS.one_of grid_alignments = LV_GRID_ALIGNMENTS.one_of
flex_alignments = LV_FLEX_ALIGNMENTS.one_of flex_alignments = LV_FLEX_ALIGNMENTS.one_of
@@ -220,6 +222,7 @@ class GridLayout(Layout):
cv.Optional(CONF_GRID_ROW_ALIGN): grid_alignments, cv.Optional(CONF_GRID_ROW_ALIGN): grid_alignments,
cv.Optional(CONF_PAD_ROW): padding, cv.Optional(CONF_PAD_ROW): padding,
cv.Optional(CONF_PAD_COLUMN): padding, cv.Optional(CONF_PAD_COLUMN): padding,
cv.Optional(CONF_MULTIPLE_WIDGETS_PER_CELL, default=False): cv.boolean,
}, },
{ {
cv.Optional(CONF_GRID_CELL_ROW_POS): cv.positive_int, cv.Optional(CONF_GRID_CELL_ROW_POS): cv.positive_int,
@@ -263,6 +266,7 @@ class GridLayout(Layout):
# should be guaranteed to be a dict at this point # should be guaranteed to be a dict at this point
assert isinstance(layout, dict) assert isinstance(layout, dict)
assert layout.get(CONF_TYPE).lower() == TYPE_GRID assert layout.get(CONF_TYPE).lower() == TYPE_GRID
allow_multiple = layout.get(CONF_MULTIPLE_WIDGETS_PER_CELL, False)
rows = len(layout[CONF_GRID_ROWS]) rows = len(layout[CONF_GRID_ROWS])
columns = len(layout[CONF_GRID_COLUMNS]) columns = len(layout[CONF_GRID_COLUMNS])
used_cells = [[None] * columns for _ in range(rows)] used_cells = [[None] * columns for _ in range(rows)]
@@ -299,7 +303,10 @@ class GridLayout(Layout):
f"exceeds grid size {rows}x{columns}", f"exceeds grid size {rows}x{columns}",
[CONF_WIDGETS, index], [CONF_WIDGETS, index],
) )
if used_cells[row + i][column + j] is not None: if (
not allow_multiple
and used_cells[row + i][column + j] is not None
):
raise cv.Invalid( raise cv.Invalid(
f"Cell span {row + i}/{column + j} already occupied by widget at index {used_cells[row + i][column + j]}", f"Cell span {row + i}/{column + j} already occupied by widget at index {used_cells[row + i][column + j]}",
[CONF_WIDGETS, index], [CONF_WIDGETS, index],
+5
View File
@@ -893,6 +893,7 @@ lvgl:
grid_columns: [40, fr(1), fr(1)] grid_columns: [40, fr(1), fr(1)]
pad_row: 6px pad_row: 6px
pad_column: 0 pad_column: 0
multiple_widgets_per_cell: true
widgets: widgets:
- image: - image:
grid_cell_row_pos: 0 grid_cell_row_pos: 0
@@ -917,6 +918,10 @@ lvgl:
grid_cell_row_pos: 1 grid_cell_row_pos: 1
grid_cell_column_pos: 0 grid_cell_column_pos: 0
text: "Grid cell 1/0" text: "Grid cell 1/0"
- label:
grid_cell_row_pos: 1
grid_cell_column_pos: 0
text: "Duplicate for 1/0"
- label: - label:
styles: bdr_style styles: bdr_style
grid_cell_row_pos: 1 grid_cell_row_pos: 1