From 24d398526eab4bc5c178b7e1dac9ad85135eba6f Mon Sep 17 00:00:00 2001 From: Evgeny Demchenko Date: Thu, 4 Jun 2026 09:44:00 +0100 Subject: [PATCH] =?UTF-8?q?Phase=2011b:=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=20asymmetric=20layouts=20=D1=81=20widget=20cells?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User: "где сетки main+preview, сетки с виджетами?". Восстановили из прежней истории: - tpl_3 (1+2+widget+widget): main 1440×810 + 2 преview 480×270 + widget temp_chart справа + widget ha_chat снизу - tpl_5 (1+4+widget): main + 4 preview right column + ha_chat снизу - tpl_6 (1+3+2+widget): main + 3 правых + 2 нижних + widget info - tpl_7 (1+3+3+widget): main + 3 правых + 3 нижних + widget ha_chat - tpl_8 (1+3+4): main + 3 правых + 4 в нижней строке (полное покрытие) - tpl_9 — 3×3 + widget полосы справа/снизу Widget cells — placeholder (тёмно-серый Y=40 + LabelDecoration с именем widget'а). Реальные виджеты (HA chat, температурный график) — Phase 12+. Chёрные ячейки больше не будут — composer.maybe_relayout заполняет свободные camera-cells остальными drawable из pool. Co-Authored-By: Claude Opus 4.7 --- docker/templates.json | 78 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/docker/templates.json b/docker/templates.json index 32eeb57..e643eed 100644 --- a/docker/templates.json +++ b/docker/templates.json @@ -2,19 +2,30 @@ "version": 1, "grid_cols": 8, "grid_rows": 8, - "_doc": "Phase 11b — только пропорциональные 16:9 layouts (cs == rs микроячеек). Полностью заполняют output 1920×1080 без widget-областей. При недостатке active-камер по motion свободные camera-cells заполняются остальными drawable-камерами из pool (по priority). См. cfc::Composer::maybe_relayout().", + "_doc": "Phase 11b — набор layouts на 8×8 микро-сетке. Свободные camera-cells при нехватке motion-камер заполняются остальными drawable из pool (cfc::Composer::maybe_relayout). Widget cells показывают placeholder (тёмно-серый + название); реальные виджеты — Phase 12+.", "templates": [ { "name": "tpl_1", - "_desc": "1 камера во весь экран.", + "_desc": "Одна камера во весь экран.", "cells": [ {"col": 0, "row": 0, "cs": 8, "rs": 8, "role": "camera", "order": 0} ] }, + { + "name": "tpl_3", + "_desc": "Главная 1440×810 + 2 превью 480×270 + widget справа-низ + widget снизу.", + "cells": [ + {"col": 0, "row": 0, "cs": 6, "rs": 6, "role": "camera", "order": 0}, + {"col": 6, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, + {"col": 6, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 2}, + {"col": 6, "row": 4, "cs": 2, "rs": 4, "role": "widget", "widget": "temp_chart"}, + {"col": 0, "row": 6, "cs": 6, "rs": 2, "role": "widget", "widget": "ha_chat"} + ] + }, { "name": "tpl_4", - "_desc": "Quad 2×2 — 4 камеры 960×540 (16:9). order=0 — top-left (главная).", + "_desc": "Quad 2×2 — 4 камеры 960×540 (16:9). order=0 — top-left.", "cells": [ {"col": 0, "row": 0, "cs": 4, "rs": 4, "role": "camera", "order": 0}, {"col": 4, "row": 0, "cs": 4, "rs": 4, "role": "camera", "order": 1}, @@ -22,9 +33,62 @@ {"col": 4, "row": 4, "cs": 4, "rs": 4, "role": "camera", "order": 3} ] }, + { + "name": "tpl_5", + "_desc": "Главная + 4 превью справа стопкой, снизу — widget.", + "cells": [ + {"col": 0, "row": 0, "cs": 6, "rs": 6, "role": "camera", "order": 0}, + {"col": 6, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, + {"col": 6, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 2}, + {"col": 6, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 3}, + {"col": 6, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 4}, + {"col": 0, "row": 6, "cs": 6, "rs": 2, "role": "widget", "widget": "ha_chat"} + ] + }, + { + "name": "tpl_6", + "_desc": "Главная + 3 правых + 2 нижних, остаток нижней строки — widget.", + "cells": [ + {"col": 0, "row": 0, "cs": 6, "rs": 6, "role": "camera", "order": 0}, + {"col": 6, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, + {"col": 6, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 2}, + {"col": 6, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 3}, + {"col": 0, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 4}, + {"col": 2, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 5}, + {"col": 4, "row": 6, "cs": 4, "rs": 2, "role": "widget", "widget": "info"} + ] + }, + { + "name": "tpl_7", + "_desc": "Главная + 3 правых + 3 нижних, угол — widget.", + "cells": [ + {"col": 0, "row": 0, "cs": 6, "rs": 6, "role": "camera", "order": 0}, + {"col": 6, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, + {"col": 6, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 2}, + {"col": 6, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 3}, + {"col": 0, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 4}, + {"col": 2, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 5}, + {"col": 4, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 6}, + {"col": 6, "row": 6, "cs": 2, "rs": 2, "role": "widget", "widget": "ha_chat"} + ] + }, + { + "name": "tpl_8", + "_desc": "1+3+4 — главная + 3 правых + 4 в нижней строке (без widget).", + "cells": [ + {"col": 0, "row": 0, "cs": 6, "rs": 6, "role": "camera", "order": 0}, + {"col": 6, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, + {"col": 6, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 2}, + {"col": 6, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 3}, + {"col": 0, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 4}, + {"col": 2, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 5}, + {"col": 4, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 6}, + {"col": 6, "row": 6, "cs": 2, "rs": 2, "role": "camera", "order": 7} + ] + }, { "name": "tpl_9", - "_desc": "3×3 grid — 9 камер... только cells 2×2 микроячейки по 6×6 области. ВНИМАНИЕ: 8×8 не делится на 3 без остатка; используем 6×6 камер + bottom/right остаток как background. Если потом будут asymmetric с widget'ами — выделим Phase 12.", + "_desc": "3×3 (cells по 2×2 микроячейки в области 6×6, остаток — widget).", "cells": [ {"col": 0, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 0}, {"col": 2, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1}, @@ -34,12 +98,14 @@ {"col": 4, "row": 2, "cs": 2, "rs": 2, "role": "camera", "order": 5}, {"col": 0, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 6}, {"col": 2, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 7}, - {"col": 4, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 8} + {"col": 4, "row": 4, "cs": 2, "rs": 2, "role": "camera", "order": 8}, + {"col": 6, "row": 0, "cs": 2, "rs": 6, "role": "widget", "widget": "temp_chart"}, + {"col": 0, "row": 6, "cs": 8, "rs": 2, "role": "widget", "widget": "ha_chat"} ] }, { "name": "tpl_16", - "_desc": "4×4 grid — 16 камер по 480×270 (16:9). Полностью покрывает 8×8 без остатка.", + "_desc": "4×4 — 16 камер 480×270 (16:9), полностью покрывает 8×8.", "cells": [ {"col": 0, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 0}, {"col": 2, "row": 0, "cs": 2, "rs": 2, "role": "camera", "order": 1},