f8e27b9e85
Объединённое состояние работ:
- Phase 10: source pool, motion-driven layout, Frigate motion_pulse,
zone-filter в pool, --source / --motion-mode CLI
- Phase 11 Steps 1-3c: 8×8 микро-сетка, JSON templates с asymmetric
layouts (tpl_1/3/4/5/6/7/8), reload через ZMQ, auto-labels per camera
В прод отдеплоено и откачено: используем gx/cuframes-composer:0.10 как
baseline. Phase 11 продолжится в branch phase11b-cpp как C++ refactor
с ООП-моделью Cell/Layout/Decoration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
91 lines
4.6 KiB
JSON
91 lines
4.6 KiB
JSON
{
|
||
"version": 1,
|
||
"grid_cols": 8,
|
||
"grid_rows": 8,
|
||
"_doc": "Layout-templates для cfc-grid auto-layout. Координаты в микроячейках 8×8 (output 1920×1080 → каждая микроячейка 240×135 px, 16:9). Квадраты N×N микроячеек тоже 16:9. role=camera — заполняется из активных камер по priority. role=widget — placeholder.",
|
||
|
||
"templates": [
|
||
{
|
||
"name": "tpl_1",
|
||
"_desc": "1 камера во весь экран.",
|
||
"cells": [
|
||
{"col": 0, "row": 0, "cs": 8, "rs": 8, "role": "camera", "order": 0}
|
||
]
|
||
},
|
||
{
|
||
"name": "tpl_3",
|
||
"_desc": "Главная 1440×810 слева + 2 превью 480×270 справа стопкой, остаток — виджеты.",
|
||
"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. 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},
|
||
{"col": 0, "row": 4, "cs": 4, "rs": 4, "role": "camera", "order": 2},
|
||
{"col": 4, "row": 4, "cs": 4, "rs": 4, "role": "camera", "order": 3}
|
||
]
|
||
},
|
||
{
|
||
"name": "tpl_5",
|
||
"_desc": "1 главная + 4 превью справа стопкой, нижняя полоса — виджет.",
|
||
"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": "1 главная + 3 правые + 2 нижние, остаток — виджет.",
|
||
"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": "1 главная + 3 правые + 3 нижние, угол — виджет.",
|
||
"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 правые + полная нижняя строка.",
|
||
"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}
|
||
]
|
||
}
|
||
]
|
||
}
|