• v0.2.2 5ebacc7a44

    v0.2.2 Stable

    calum released this 2026-07-01 03:16:47 +01:00 | 90 commits to main since this release

    v0.2.2 — Phase 2 MVP complete. Step 4 (placement + link/unlink + primary + drag-to-move + layer toggles) + Step 5 (three deferred floorplan-dependent validation rules activated). Sits on the v0.6 contract (no bump — v0.5 already froze the placement surface, this is the deferred build).

    What's new to eyeball

    Toolbar → Place buttons. Three place-modes: Speaker, Source, Listener ref. Each disabled until the plan is imported + calibrated. Click the button, then click on the plan to drop a marker at that point (converted to metres via the calibrated scale). Click the same button again — or press Esc — to exit place-mode.

    Marker visual conventions:

    • Speaker (blue circle, "S"), Source (green, "▲"), Listener ref (yellow, "L").
    • Linked + primary (delay engine will use this one): solid white outline.
    • Linked + non-primary: thin dashed white outline.
    • Unlinked ("unassigned" — placed but no DB entity attached): amber dashed outline, warning colour.
    • Selected: cyan halo ring around the marker.

    Click a marker → inspector drawer opens on the right of the canvas:

    • Label, coordinate boxes (in your project's geometry unit — mm for CAD-first users, converted to metres before write).
    • Link / Unlink dropdown (for speaker + source placements). Server does same-project FK validation.
    • Primary placement checkbox — turning this on demotes any other primary placement of the same entity in a single server-side transaction, so the delay engine always sees exactly one primary per entity.
    • Delete placement (leaves the linked entity intact).

    Drag any marker to reposition. 3-pixel threshold so a normal click still selects. Coordinates round-trip in metres.

    Unplaced sidebar (bottom of the left sidebar, once the plan is calibrated): lists speakers + source_locations that don't have a placement on the current floorplan. Click Place to drop-at-origin-and-link — then drag it into position, or edit coordinates in the inspector.

    Layer toggles above the canvas: show/hide Speakers / Sources / Listener refs independently. Delay / Dante / Q-SYS status layers deliberately absent — those come with their data in Phase 3+.

    Three new validation rules (Warning severity)

    Now visible on the Validation screen, joining the existing 8:

    1. speaker.no_floorplan_placement — speaker exists but no floorplan placement links to it.
    2. source_location.no_floorplan_placement — same shape for sources.
    3. floorplan.not_scaled — floorplan exists but never had Calibrate scale run.

    The Jump to entity click-through from Phase 2 Step 1 works for #1 and #2 (Speakers/Sources screens). #3 currently just names the floorplan in the message — the jump-to-floorplan target would be a small follow-up.

    Placement precision — the deliberate ceiling

    12 mm placement error = ~0.035 ms delay error, a third of the delay rounding step. No snapping, no coarse-grid — the drag threshold is 3 display px, that's it. Precise placement isn't Phase 2's job; it will land in Phase 7 with vector CAD import + soft-snap-to-line-geometry (logged in CONTINUATION.md).

    Test coverage

    74 backend tests across 18 integration files, all green (up from 60). Notable pins:

    • All five polymorphic JOIN branches resolve linked_entity_code correctly.
    • Linking-second-placement-demotes-first-in-one-transaction (idx_floorplan_objects_primary never sees two primaries).
    • Same-project FK guard rejects cross-project ids on link.
    • Each activated validation rule fires before-condition-met and clears after.

    Test plan

    1. Open a project → create a floorplan → import a PDF you know → calibrate it (v0.6 mm-vs-m dropdown, defaults to mm).
    2. Create a couple of speakers + a source_location (CSV import or the entity screens).
    3. Return to the floorplan → the Unplaced sidebar shows them.
    4. Click Place on one → it lands at (0, 0), drag it to a location on the plan.
    5. Click Place Speaker in the toolbar → click a few spots to drop unlinked markers → they show as amber dashed (unassigned).
    6. Click an amber marker → open the inspector → pick a speaker from the dropdown → outline turns solid white + code appears below the marker.
    7. Toggle a layer off/on → markers of that type disappear/reappear.
    8. Multi-place the same speaker (Place from toolbar → click; then Place from Unplaced sidebar for that same speaker) → both show, but only one has the solid "primary" outline; toggle primary in the inspector → the other one's outline goes to dashed non-primary.
    9. Open Validation screen → confirm the three new rules fire for un-placed entities and clear once you place them.

    Version check: Settings screen reads 0.2.2; installer filename is LOUD-Patch-Authority-0.2.2-windows-x86_64-setup.exe. Anything else is a stale build. SmartScreen will warn (unsigned): More info → Run anyway.

    Build: 5ebacc7.

    Downloads