Show where an inspector row can be dragged

- Behaviors: under Reordering, the dots on a mark that drags, the
  lit dots and washed block under the pointer, and the other marks
  passing the pointer while a block is carried.
- Architecture: blockDrag names the Grip widget.
- Development: the e2e sum is 1740.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-04 00:11:53 +02:00
1 parent b4b9464bdd
commit 32160e95ba
3 files changed
+9 -4

No files matched your search

+1 -1
@@ -169,7 +169,7 @@ src/runtime/physics/ engine (loads Rapier once, reports its state, converts be
src/ui/ widget toolkit (generic, knows nothing about assets); fonts (the faces the editor ships: src/ui/ widget toolkit (generic, knows nothing about assets); fonts (the faces the editor ships:
Source Sans 3 in 400, 500 and 600, Source Code Pro 400, Latin only, #202/#214/#273), icons + Source Sans 3 in 400, 500 and 600, Source Code Pro 400, Latin only, #202/#214/#273), icons +
Icon (the menu's tick boxes and current-entry dot as SVG files, and a widget that shows one file Icon (the menu's tick boxes and current-entry dot as SVG files, and a widget that shows one file
on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a grip, a block being every row it covers, #310) on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a `Grip` (the row's mark, wrapped: dots once it drags, lit under the pointer while the block is washed), a block being every row it covers, #310)
src/viewport/ WorldViewport (the drawing of a world or a holder, the base of every view; it draws from src/viewport/ WorldViewport (the drawing of a world or a holder, the base of every view; it draws from
a `ViewSource` — the project and word of a change — so a released game draws without the a `ViewSource` — the project and word of a change — so a released game draws without the
editor, #266; a view through a camera keeps only what that camera `Sees` and lays one editor, #266; a view through a camera keeps only what that camera `Sees` and lays one
+7 -2
@@ -183,10 +183,15 @@ the inspector).
its indent takes, and names are cut with `…` rather than pushing their value out of line. its indent takes, and names are cut with `…` rather than pushing their value out of line.
- **Reordering** (#310): variables, the fields of a struct at any depth, the items of a list and the - **Reordering** (#310): variables, the fields of a struct at any depth, the items of a list and the
declared ports of a Start, End, `Pack`/`Expand` or shader function are **dragged by the mark in declared ports of a Start, End, `Pack`/`Expand` or shader function are **dragged by the mark in
front of their row** — the kind mark, for a list item its number. A press that moves less than front of their row** — the kind mark, for a list item its number. Such a mark carries six faint
dots at its left edge, so a row that cannot be dragged (a placed object's variable, the fields of
a typed struct) is told apart at a glance. With the pointer on the mark the dots light up and the
block that would go with it is washed in the accent colour. A press that moves less than
4 px stays a click, so the kind picker of a list item still opens. A block moves with all of its 4 px stays a click, so the kind picker of a list item still opens. A block moves with all of its
rows (a struct with its fields, an item with its nested list) and is dimmed while it is carried; rows (a struct with its fields, an item with its nested list) and is dimmed while it is carried;
an accent line shows where it lands, and at the top or bottom edge the panel scrolls along. It an accent line shows where it lands, and at the top or bottom edge the panel scrolls along. The
other marks do not answer the pointer while a block is carried, and every mark shows the
grabbing hand until it is dropped. It
moves among its siblings only: a field stays in its struct, an item in its list. Every move is moves among its siblings only: a field stays in its struct, an item in its list. Every move is
one undo step. Values and edges hang on names, so only the order changes: of the rows, of the one undo step. Values and edges hang on names, so only the order changes: of the rows, of the
fields of `Pack`/`Expand`, of the ports on every node running the behavior. A list's order is its fields of `Pack`/`Expand`, of the ports on every node running the behavior. A list's order is its
+1 -1
@@ -18,7 +18,7 @@ php tests/php/accounts.test.php # the API's accoun
# has and the web server's container has not (SKIP there) # has and the web server's container has not (SKIP there)
php tests/php/snapshots.test.php # the snapshot store (#231), the same way php tests/php/snapshots.test.php # the snapshot store (#231), the same way
php tests/php/releases.test.php # the release store (#266), the same way php tests/php/releases.test.php # the release store (#266), the same way
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1739 editor checks, screenshots in /tmp/gm-e2e-*.png node tools/seed-e2e.mjs && node tools/e2e.mjs # 1740 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 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 start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result ./e2e.sh status # live progress, or the last run's result