Free drag & drop with fixed positions, empty cells and kept pages (0.2.31)
Tiles get an absolute grid slot instead of a packed order: a tile lands exactly where it is dropped, dropping on another tile swaps the two, everything else stays put, and empty cells and empty pages persist. The mockup previews the result while dragging, a new page waits below the last one, "Pagina toevoegen" keeps an empty page, empty cells accept the next tile from the picker, and the mouse no longer selects text while dragging. Storage and protocol stay version 1: `tiles[].slot` (0-47) and `pages` (1-8) are additive, the layout message carries `slots` and `pages`. Firmware 0.2.26 places tiles on those slots (`place()` next to `pack()`); older firmware packs in order as before and the editor says so. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
# Testresultaten app 0.2.31 / firmware 0.2.26 (2026-09-14)
|
||||
|
||||
Vrij slepen in de editor met vaste plekken, lege plekken en lege pagina's;
|
||||
firmware 0.2.26 tekent de tegels op die plekken.
|
||||
|
||||
## Wat veranderde
|
||||
|
||||
- `core.py`: `SLOTS_PER_PAGE`/`MAX_PAGES`/`MAX_SLOTS`, `pack_slots`, `has_gaps`;
|
||||
`validate_layout` geeft elke tegel een `slot` (oude volgorde-packing zonder plekken,
|
||||
anders validatie op bereik, even plek voor dubbelbreed en overlap, gesorteerd) en
|
||||
accepteert `pages` (1–8). `server.py`: `slots` en `pages` in het layoutbericht;
|
||||
`save()` pakt opnieuw na het terugzetten van opgeslagen opties en valideert nogmaals.
|
||||
- `runtime_model.h`: `Model.slots`/`explicit_slots`/`pages`, `set_layout(..., positions,
|
||||
moved)`, `place()`; `runtime_tiles.h`: parser leest `slots`/`pages`, `page_count()` en
|
||||
`place_page()` gebruiken `place()`. Versie 0.2.26 in beide profielen en pakketten.
|
||||
- `app.js`: grid-model (`arrange`/`commit`/`placeTile`, `nearestFree`, `firstFree`),
|
||||
hover-preview tijdens slepen (`setTarget` rendert het resultaat, `slotAt` kiest de
|
||||
cel op afstand), pointer capture vanaf pointerdown en op `documentElement` tijdens de
|
||||
sleep (de mockup wordt herrenderd), lege cellen als knoppen (`insertAt`), pagina's
|
||||
toevoegen/weghalen, pijltjestoetsen, hint voor firmware < 0.2.26. `style.css`:
|
||||
`user-select: none` op editor en kiezer, `.preview-cell`, `.placeholder`, `.new-page`.
|
||||
|
||||
## Geautomatiseerd
|
||||
|
||||
- Python: 91 tests OK (nieuw `tests/test_positions.py`: packing zonder plekken, expliciete
|
||||
plekken met gaten en sortering, geweigerde overlap/oneven/bereik/gemengd, `pages`,
|
||||
`slots`/`pages` op de draad, oude opslag en oude editor). `generate_packages.py --check` groen.
|
||||
- C++ (clang++ -std=c++17 -Wall -Wextra -Werror -I.): alle `tests/*.cpp` PASS;
|
||||
`test_runtime_model` dekt validatie van posities, `moved` zonder statusverlies,
|
||||
even plek voor dubbelbreed, lege tussenpagina, `pages`, terugval zonder plekken.
|
||||
- ESPHome compile (bench-pakketten met lokale componenten): `easy-guition-device.yaml`
|
||||
SUCCESS (RAM 31,9%, flash 18,3%), `easy-cyd-device.yaml` SUCCESS (RAM 30,9%, flash 76,1%).
|
||||
- Lokale add-on (devserver met nep-HA, echte pointer-events in de browser): twee enkele
|
||||
tegels, tweede dubbelbreed → blijft op rij twee, gat op plek 2; entiteit uit de kiezer
|
||||
in het gat gesleept → plek 2, geen tekstselectie; hover-preview toont de nieuwe pagina
|
||||
met placeholder; enkele tegel op dubbelbrede gedropt → wissel; pagina toevoegen/weghalen;
|
||||
pijltjestoetsen 6 → 5 → 6 met focus; lege plek klikken + kiezer → tegel op die plek;
|
||||
opslaan verstuurt `slots [0,2,3,6]` en state-indexen in plekvolgorde.
|
||||
|
||||
## Nog niet geverifieerd
|
||||
|
||||
- Op echte hardware: de indeling met gaten en een lege pagina op CYD en Guition na de
|
||||
firmware-update (Max test via GitHub-release → add-on → firmware bouwen in ESP Screens).
|
||||
- Touch-slepen (hold 260 ms) op een telefoon in de HA-app.
|
||||
Reference in New Issue
Block a user