mirror of
https://github.com/esphome/esphome.git
synced 2026-05-31 07:57:40 +08:00
[lvgl] Allow multiple widgets per grid cell (#12091)
This commit is contained in:
@@ -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],
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user