Loom (Alpha) #4 of 4: composer panel — completes the alpha#295
Loom (Alpha) #4 of 4: composer panel — completes the alpha#295CoreyRDean wants to merge 1 commit into
Conversation
Adds the right-side property panel that the Loom design centers on.
When the user picks a marker in the zone map, the composer paints the
focused entity's fields off the Area type's per-entity arrays. Read-
only in the alpha -- the design intent is "let me read my world
through Loom's lens"; editing comes in beta.
Layout:
- 340 px wide column pinned to the right of the screen
- Brass left rule + brass border so the panel reads as the primary
surface in this view
- Title block: kind eyebrow ("WAYPOINT" / "SPAWN POINT" / etc.) in
brass, entity display name in parchment, brass divider underneath
- Body: label/value rows (label brass, value parchment), 24 px row
height -- 8-9 rows fit without scrolling, which is enough for
every kind here
- Footer note: "Read-only in alpha" so users aren't confused about
why fields don't take typing
Per-kind body content:
waypoint -- index, position (X,Y,Z), pause ms, Next A/B + Previous
waypoint refs
spawn -- index, resolved actor name (via ActorList lookup),
waypoint ref, size, frequency, max, range, three
optional script bindings
trigger -- index, position, size, script, method
portal -- index, name, target area, target portal, position, yaw,
size
Composer_Width() returns 0 when nothing is selected and COMPOSER_W
otherwise; ZoneMap reads it to shrink its view area by that many
pixels on the right so markers along the right edge of a zone don't
get hidden behind the panel.
State plumbing:
Composer reads ZoneMap_SelectedKind$ / ZoneMap_SelectedIndex from
PR #3 directly -- no new state to wire. Painted in Loom.bb's main
loop immediately after ZoneMap_RenderAndUpdate so the panel layers
on top.
All five engine targets compile clean. Loom.exe grew from 2.35 MB
(map) to 2.37 MB (map + composer).
This PR completes the four-PR Loom alpha:
#292 skeleton + theme + Project Manager launcher
#293 data loading + atlas boot surface
#294 top-down zone map surface
#295 composer panel (this)
End-to-end alpha flow: Project Manager -> Loom (Alpha) ->
project data loads -> atlas of zones -> pick a zone -> zone map ->
pick a marker -> composer shows its full data. Esc returns step by
step. Read-only throughout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f54ac6a61
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Format a waypoint reference index for display. Some Area fields use -1 | ||
| // or 0 to mean "no link", depending on the field; we render both as "(none)". | ||
| Function Composer_WaypointRef$(idx) | ||
| If idx <= 0 Then Return "(none)" |
There was a problem hiding this comment.
Handle waypoint sentinel values correctly
Composer_WaypointRef$ currently treats idx <= 0 as (none), but area data uses the opposite conventions: waypoint index 0 is valid (spawns can point to waypoint 0), while unlinked waypoint references are commonly stored as 2000/2005 (see ServerCreateArea initialization in ServerAreas.bb). With the current check, the composer will hide valid links to waypoint 0 and display missing links as #2000/#2005, so the new read-only panel routinely reports incorrect data.
Useful? React with 👍 / 👎.
Summary
Fourth and final PR of the Loom alpha. Stacked on top of #294 (zone map), which is on #293 (atlas), which is on #292 (skeleton).
Adds the right-side property panel that the Loom design centers on. When the user picks a marker in the zone map, the composer paints the focused entity's fields off the
Areatype's per-entity arrays.Read-only in the alpha — the design intent is ""let me read my world through Loom's lens""; editing comes in beta.
Layout
WAYPOINT/SPAWN POINT/ etc.) in brass, entity display name in parchment, brass divider underneathPer-kind body content
ActorListlookup), waypoint ref, size, frequency, max, range, three optional script bindingsComposer + ZoneMap integration
Composer_Width()returns0when nothing is selected andCOMPOSER_Wotherwise. ZoneMap reads it to shrink its view area by that many pixels on the right so markers along the right edge of a zone don't get hidden behind the panel.Composer reads
ZoneMap_SelectedKind$/ZoneMap_SelectedIndexfrom PR #3 directly — no new state to wire. Painted in Loom.bb's main loop immediately afterZoneMap_RenderAndUpdateso the panel layers on top.Blast radius
src/Loom.bb: include + one Composer_RenderIfVisible call in the map modesrc/Modules/Loom/ZoneMap.bb: 3 lines — view-area shrink for composer widthsrc/Modules/Loom/Composer.bb: new fileEnd-to-end alpha flow
Project Manager →
Loom (Alpha)→ project data loads → atlas of zones → pick a zone → zone map → pick a marker → composer shows its full data. Esc returns step by step. Read-only throughout.Four-PR series wrap-up
Test plan
compile.batbuilds cleanLoom (Alpha)→ atlas → click a zone → zone map opensRead-only in alphafooter line is presentWhat's NOT in (deferred to beta)
LoadArea's data path is decoupled from its UI substrate🤖 Generated with Claude Code