TASK 59: the properties panel is a hierarchy, and the shape is a choice

The creator's ruling on the webcam's properties: a "Shape" title above the
Mirror/Rect row; the drag hint indented under that row "to show parentage";
the same for Geometry, Border Color, Border Thickness; Remove and Blur indented
under Background; Strength indented under Blur.

One rule covers it: a title owns its content and the content is indented one
level (10px) under it - two levels where a title is itself nested (Strength
under Blur under Background). The titles are SemiBold 11px #a0a0b0 like the
ones already there.

The shape also stops being a toggle button that shows the NEXT action ("Round"
when the camera was a rectangle) and becomes a CHOICE: two segment options,
Rect | Circle, with Rect selected by default - which is what the creator asked
for ("Rect should be selected as a default if none exists"). The old
ShapeButtonText is gone.

The mutual exclusion lives in the MODEL: IsRectShape/IsRoundShape on
SceneElement, each setter flipping the shape through ToggleClipShape() (so the
pre-round rect is still stored/restored) and always re-raising, so a refused
write - the vertical Chat layout is rect-only (TASK 57) - makes the UI snap
back instead of sticking. Deliberately NOT a WPF RadioButton group: a group
unchecks its siblings by setting IsChecked in code, which makes WPF drop the
binding (stackoverflow 7376373; the same trap measured in 50980687/57275046).

The Circle option stays hidden where CanToggleClipShape is false, so the circle
is still not offered in the vertical Chat layout.

Guard: ytLive.Tests/PropertiesHierarchyTests.cs - the model half (Rect by
default, pick circle, pick rect, the locked Chat layout refuses the circle) and
the panel half (the Shape title owns both options, the circle is the gated one,
the hint is indented and follows the row, every titled block's content is at
10px, Strength at 20px). 432/432 green, 0 warnings.
This commit is contained in:
2026-10-21 19:58:28 -07:00
parent 2273d20160
commit 89f6aa3a67
11 changed files with 336 additions and 36 deletions
+19 -4
View File
@@ -25,6 +25,15 @@
panel. Now: `ComboBox` → `YtComboBox`, `CheckBox` → `YtCheckBox` (new), properties fields →
`YtTextBoxCompact` (new, BasedOn `YtTextBox`). Guard:
`ytLive.Tests/PropertiesStyleTests.cs`.
- **TASK 59 — the properties panel is a hierarchy** (shipped 2026-10-21). A title owns its
content and the content is indented one level (10px): `Shape` (new title) over the
Mirror switch and the shape choice, the drag hint indented under that row, Geometry /
Border Color / Border Thickness as titles with their fields indented, Background's
Remove + Blur indented, and Strength one level deeper under Blur. **The shape became a
CHOICE**: `Rect` | `Circle` as two segment options with **Rect selected by default**
(the old single button showed the *next* action, "Round"). The mutual exclusion lives
in the model (`IsRectShape`/`IsRoundShape` on `SceneElement`) — a WPF `RadioButton`
group would kill the bindings. Guard: `ytLive.Tests/PropertiesHierarchyTests.cs`.
- **The previous session (HA lights) produced NO ytLive code** — it was spent on the creator's Home
Assistant light alert system (off-repo, `192.168.50.145`). See `MyMistakes.md` → 2026-10-21: the plan
was one tweak to a verified-working script; the script was rewritten twice, the alert path broke, and
@@ -160,10 +169,15 @@ Zombie entities deleted from the registry: `script.leak_strobe`, `script.doorbel
the full top area and the circle option is not offered. **PASSES.**
## Next step
- **The creator's remaining ask (not started):** the webcam **Border Color** drop-down should show the
**colour NAME next to the hex** (e.g. `#e94560 Crimson`) — the hex stays, the name is the addition.
Plan: a testable hex→name catalogue (Models/Helpers) consumed by the code-behind
`WebcamBorderColorPicker_Click` in `Controls/LeftPanel.xaml.cs`; the tooltip becomes "Name (#hex)".
- **Creator check (needs the creator's hands)** — the last piece of the vv feature: switch the
resolution dropdown to "Vertical 1080p60", confirm the Live camera tile lands inside the band and
the Shape button toggles circle/rect there, open the **Chat** scene and confirm the Shape button is
**gone** (rect only) and that dragging the tile up and enlarging it fills a whole 607×540 area, then
the **Circle** option (TASK 59 turned the Shape button into a Rect | Circle choice) turns the tile
into a circle there, open the **Chat** scene and confirm the **Circle** option is **gone** (rect only)
and that dragging the tile up and enlarging it fills a whole 607×540 area, then
switch back and confirm the desktop layout is untouched. The unit tests cover the geometry, not the
eyeball.
- Nothing else is queued for llamacasty — the creator queues work.
@@ -193,8 +207,9 @@ Zombie entities deleted from the registry: `script.leak_strobe`, `script.doorbel
- TASK 55 disk hygiene (`startup.log` uncapped — 23MB and growing every 5s).
## Tests
- Last full run: **431/431 passed, 0 warnings** (2026-10-21, this session — after TASK 58's
`PropertiesStyleTests`). The previous run was 429/430: the one failure was
- Last full run: **432/432 passed, 0 warnings** (2026-10-21, this session — after TASK 59's
`PropertiesHierarchyTests`; the run before it was 431/431 after TASK 58's
`PropertiesStyleTests`). The one failure seen earlier in the session was
`LayerReorderPersistenceTests.RealMouseDrag_OnTheLayerList_PersistsTheReorder`,
which **passes in isolation** (re-run: 3/3) — the known real-mouse flake, not a regression.
- Known flaky-by-environment (all pass in isolation): `AudioPipelineTests.Mix_HonorsProviderGains…`,