Graph groups and comments: fit frames them, the band catches them (#95)

admin committed 2026-09-16 14:24:03 +02:00
1 parent 15f6f33b19
commit 426dbe7195
3 files changed
+14 -4

No files matched your search

+11 -1
@@ -227,6 +227,13 @@ shown on the node and editable in the inspector.
touches — nodes are large rectangles, so touching counts, unlike the scene view's test of an
object's position. Ctrl/Shift-click adds or removes single nodes, dragging any node of a
selection moves all of them, and `Delete` removes all of them — one undo step either way.
- **The band catches groups and comments too** (#95), and they end up in the *same* selection as
the nodes: one drag then moves all of it, one `Delete` removes all of it, one undo takes it back.
A box counts only when the band holds **all** of it, where a node counts on touching alone. That
difference is not a mood: a group wraps the nodes it holds, so it overlaps every band drawn over
any of them, and since a group drags its nodes along, catching it by accident would be felt at
once. A node inside a group that is selected too is still moved **once** — it belongs to both,
and the offset is applied to each thing once.
- **Dragging an edge tells you where it would land** before you let go: the port it would connect
to wears a white ring and the line snaps to it. Dropping on a node's *body* rather than a port
takes that node's first free compatible port — or, when none is free, the last compatible one,
@@ -291,7 +298,10 @@ shown on the node and editable in the inspector.
what it says. Every graph tab has them — behaviors, state machines, shaders, particles.
- **Header bar** (the same one the Texture and Container tabs have): the behavior picker,
**Fit** (which zooms out far enough to hold every node, measuring each by its own drawn
height — `editor/framing.ts`), and the size of the graph as "N nodes · M links".
height, **and every group and comment with them** — a fit that framed the nodes alone would cut
the box drawn around them, and a graph holding nothing but a comment would frame the empty
origin; `editor/framing.ts`), and the size of the graph as "N nodes · M links". It stops zooming
out at 0.25, so a box parked far enough away can still lie outside what a fit can show.
- **Snap** (header checkbox, off by default): a drag drops each node it carries on the nearest
24 px grid line — the same grid the background draws. It takes effect on the next drag only, so
switching it on never shuffles a graph that is already laid out, and a node nobody drags never
+2 -2
@@ -12,7 +12,7 @@ npm run check # typecheck + lint + format:check + tests, the gate CI runs
# code is lost (tail's is reported), so a red run reads as green
npm run build # writes dist/ and regenerates index.html
./build.sh # the same under `set -o pipefail`, for callers that pipe the output
node tools/seed-e2e.mjs && node tools/e2e.mjs # 955 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 958 editor checks, screenshots in /tmp/gm-e2e-*.png
GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step
./e2e.sh start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result
@@ -232,4 +232,4 @@ widths to find click points. The **render device is not in this repo** — `/dev
and a 1 GB `/dev/shm` come from `container.options` in the runner's own `config.yaml`, which
applies to every job on that runner. Without them chromium falls back to llvmpipe, which gets
WebGL 1.0 only. Measured in the job container: `ANGLE (Intel, Vulkan 1.3.230, HD Graphics 630)`,
WebGL 2.0, and the same 955 checks as here.
WebGL 2.0, and the same 958 checks as here.
+1 -1
@@ -1,5 +1,5 @@
`Ctrl+Z` / `Ctrl+Shift+Z` / `Ctrl+Y` undo/redo (`Cmd` works wherever `Ctrl` does) · `Delete` or
`Backspace` remove the selection (objects, nodes, frames, a tile of the Animation tab, a graph group or comment — the box only, its nodes stay; an asset asks first) · `Ctrl+G` create
`Backspace` remove the selection (objects, nodes, frames, a tile of the Animation tab, a graph group or comment — the box only, its nodes stay, and a band that caught boxes and nodes together removes both in one step; an asset asks first) · `Ctrl+G` create
container from the selection · `Ctrl+Enter` play, and pause/resume while playing · `Esc` stop ·
`Ctrl+V` import an image from
the clipboard as a texture (ignored while a text field has focus) · `Tab` / `Shift+Tab` cycle fields · lists: `↑`/`↓` move,