Topbar rework (#183): the bar is five icon buttons - menu, undo, redo, play, pause - the Scene picker is gone and the active scene is switched by double clicking it in the Assets panel, New project / Open project... / Project settings... sit in the menu, and the collision layers moved from their own entry into the settings dialog next to the name and the Play starts switch; check count 1147

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
adminandClaude Opus 5 committed 2026-09-20 16:34:18 +02:00
1 parent 0b7f0c2ff5
commit c0b74fde91
6 files changed
+31 -20

No files matched your search

+2 -1
@@ -13,7 +13,8 @@ sent, *Wrong user name or password* when the server refuses the pair.
The **Account** menu sits at the far right of the toolbar and holds everything about the account:
who is signed in (as an entry that cannot be picked), *Change password* and *Logout*. Logout ends
the session and brings the sign-in screen back. The name stands in the window title as well
(`Game Maker — user`), because the toolbar itself has no room to spare for a label.
(`Game Maker — user`) rather than as a second label in the bar, which since #183 carries icons
and no words at all.
Signing in and out never reloads the page and never builds a second canvas: the picture changes,
nothing else. What is unsaved is written before the session ends, the editor then lets go of
+7 -2
@@ -104,7 +104,11 @@ src/viewport/ view (transforms), items (what to draw), symbols (how to
particles (one ParticleContainer per source), tilemap (one container per layer),
drawOrder (objects and tilemap layers by z, #174), activeCamera — no editor concepts,
so tests reach it freely
src/editor/ App → Editor (layout + ticker), PlaySession (the run), ProjectSession (load/create),
src/editor/ App → Editor (layout + ticker), PlaySession (the run),
ProjectSession (load/create/delete plus the top bar's one menu, #183),
OpenProjectDialog (the project picker behind "Open project…"),
ProjectSettingsDialog + settingsChanges (name, the start-scene switch and the collision
layers in one dialog; the pure rule of what Apply has to carry out),
EditorRun (run in editor), state, actions, shortcuts, debugHook,
textProbe (finding widgets by their text — the ground floor of the test hook, shared with the sign-in screen),
auth/LoginScreen + auth/PasswordDialog + auth/loginRules (the sign-in screen and the change-password dialog in the canvas, and what either may complain about, #177/#182), autosave,
@@ -131,7 +135,8 @@ src/editor/inspector/ Inspector panel, host (what a section builds into), field
src/editor/panels/ AssetPanel, assetGroups (groups by type and their order, #176), assetIcons (one SVG per
asset type in icons/, shared by the panel, the + menu, the tabs and Scene objects,
plus the List, Game and Plugins tabs' own three, which stand for no asset),
assetMenu (the two groups of the + menu), HierarchyPanel, Toolbar,
assetMenu (the two groups of the + menu), HierarchyPanel,
Toolbar + toolbarIcons (five icon buttons, no captions: menu, undo, redo, play, pause, #183),
TilemapPanel (tools, tiles and layers of the one selected tilemap, beside the scene view, #142;
painting itself is SceneViewport)
src/editor/graph/ GraphEditor (header, breadcrumb), GraphCanvas, graphView (zoom limits, grid, panAndZoom — shared with NodeBoard and the Tile tab's TileCanvas), EdgeLayer (curves and fold marks), graphMenus,
+3 -3
@@ -106,9 +106,9 @@ Tiles can be one-way as well (see [Tilemaps](Tilemaps#one-way-tiles)).
## Collision layers
A project has up to 16 named **collision layers** (#152), edited under **Project → Collision
layers…**; a new project has one, *Default*. Every collider and every tilemap names the layer it
sits on (**Layer**) and the layers it collides with (**Collides with**, a tick per layer).
A project has up to 16 named **collision layers** (#152), edited in the top bar's **menu →
Project settings…**; a new project has one, *Default*. Every collider and every tilemap names the
layer it sits on (**Layer**) and the layers it collides with (**Collides with**, a tick per layer).
**Two things meet only when each one names the layer of the other.** The rule is symmetric, as in
the physics engine itself, so there is no pair that collides only one way: giving the player's
+10 -7
@@ -17,7 +17,7 @@
| **Variables asset** | Declarations and nothing else — no graph, no position, never placed. A `Variables` node naming it reads and writes **one value per key for the whole run**, however many graphs point at it. The values start at the declared ones on every Play and are never written back, so playing cannot change the project; while a run is on the asset's inspector shows them live and an edit there reaches the run at once. Two such assets may declare the same name without meeting. See [Behaviors](Behaviors). |
| **Run in editor** | A switch only behaviors have (default off). With it on the behavior keeps running while the project is **not** playing — and unlike Play it then edits the *saved* model: what it moves or writes is a real change, autosaved and not on the undo stack. See *Running without Play*. |
| **Collider** | A shape (box or circle) for collision detection, placed as a **child** of the object it belongs to (its *body*). Drawn as a green outline in edit mode only. |
| **Collision layer** | One of up to 16 named layers of the project (**Project → Collision layers…**). A collider or tilemap names the layer it is on and the layers it **collides with**; two of them meet only when each one names the layer of the other. A new project has one layer, *Default*, which every collider is on and meets — so nothing collides differently until a layer is named. See [Colliders](Colliders#collision-layers). |
| **Collision layer** | One of up to 16 named layers of the project (**menu → Project settings…**). A collider or tilemap names the layer it is on and the layers it **collides with**; two of them meet only when each one names the layer of the other. A new project has one layer, *Default*, which every collider is on and meets — so nothing collides differently until a layer is named. See [Colliders](Colliders#collision-layers). |
| **Rigidbody** | Placed as a **child** of an object, it hands that object to the physics engine while playing: it falls with the scene's gravity, bounces and rests on colliders, pushed by what it meets. At most one per object. See [Physics](Physics). |
| **Override** | A per-object value that replaces the asset's value for one property. Only changed keys are stored; the inspector paints their label gold and offers a reset (↺) and an **apply** (↑) that writes the value into the asset instead. Both appear only where the value really differs from its base — an override carrying the asset's own value is none. |
| **Default** | Every property has a schema default. Asset values that differ from it are marked gold in the inspector and can be reset (↺) the same way an override can. The asset's name in the **Assets** panel carries the same gold while any of them does (`assetDeviates`, `src/core/properties/deviation.ts` — the inspector marks the rows of that same schema, so the list cannot claim a deviation the inspector then fails to show). A behavior's variables are not in it: their default is declared on the variable itself, so the asset value cannot differ from it. |
@@ -38,12 +38,15 @@ one, so switching it off hands the view to the next; with none on the tab stays
shows what Play would show, minus the editor symbols. Play has no built-in behaviour (no input,
no movement): everything that happens is defined by behavior graphs.
**Toolbar and panels.** The toolbar holds the **Project** menu (new project, switch project,
*Delete this project…*), the project name (type to rename), the **Scene** picker for the active
scene — usable while a run is on, because it only moves the editor's view and never the running
world — Undo/Redo, the **start-scene switch** (*Start scene* / *Active scene*, see **Start
scene**), Play/Pause, and on the right the notice line, the save status and the frame
rate. The **Assets** panel's `+` creates an asset and opens its tab; its menu lists the types in
**Toolbar and panels.** The toolbar carries five **icon buttons** and no captions (#183): the
**menu** (three bars) on the left with *New project*, *Open project…* and *Project settings…*,
**undo** and **redo** beside it, and **play** and **pause** in the middle — play turns into a stop
square while a run is on, pause into a second play sign while it is held. On the right stand the
notice line, the save status, the frame rate and the **Account** menu. What the bar used to spell
out lives in the menu now: the project list in *Open project…*, the project name, the
**start-scene switch** (*Start scene* / *Active scene*, see **Start scene**) and the collision
layers in *Project settings…*. The active scene is picked where the scenes are — by double-clicking
one in the **Assets** panel. The **Assets** panel's `+` creates an asset and opens its tab; its menu lists the types in
two alphabetical groups, first what can be placed into a scene, then what only lives in the library
(#43) — the line between them answers the question that follows right after "which type?".
Every type has an **icon** of its own, the same wherever the type shows: in the `+` menu, on the
+1 -1
@@ -13,7 +13,7 @@ npm run check # typecheck + lint + format:check + tests, the gate CI runs
npm run build # writes dist/ and regenerates index.html
./build.sh # the same under `set -o pipefail`, for callers that pipe the output
php tools/make-user.php <name> <password> # an account; every tool signs in (see Accounts)
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1138 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1147 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
+8 -6
@@ -5,9 +5,10 @@ Those are three different questions, and this page is about keeping them apart.
## Active scene, start scene
The **active scene** is what the editor shows: the Scene tab draws it, the hierarchy lists it, a
dropped asset lands in it. It is set by the toolbar's **Scene** picker, by double-clicking a scene
in the Assets panel, or through *Set as active scene* in its context menu. `●` marks it in the
list.
dropped asset lands in it. It is set by double-clicking a scene in the Assets panel, or through
*Set as active scene* in its context menu — the toolbar has no scene picker since #183. `●` marks
it in the list. Both ways stay open while a run is on: they only move the editor's view and never
touch the running world.
The **start scene** is where a run begins — the title screen, the first level, whatever a player
would see first. It is named on the **project**, not on the scene asset: right-click a scene in
@@ -15,7 +16,7 @@ the Assets panel → **Set as start scene**. `▶` marks it, and the same place
scene** to take the name back. A project that never names one has none, and then the two questions
have the same answer.
Which of the two Play uses is the **switch next to the Play button**:
Which of the two Play uses is the **Play starts** switch in **menu → Project settings…**:
| Switch | What Play builds its world from |
| --- | --- |
@@ -24,10 +25,11 @@ Which of the two Play uses is the **switch next to the Play button**:
The switch is remembered in the **browser**, not in the project: it says how *you* are working
this afternoon, not what the game does, and it must never turn up in a diff of the project file.
It stands in the settings dialog beside the project name and the collision layers, which *do*
belong to the project — the dialog is the one place these are edited, not the split it says.
It is captioned with the mode it stands in — *Start scene* or *Active scene*, worded exactly like
the entries of its own menu, so that what you picked and what you read back are the same words.
Which scene that currently is stands in the **scene selector** on the left, and the start scene is
marked `▶` in the Assets panel.
The start scene is marked `▶` in the Assets panel, the active one `●`.
The point of the two modes is that a game with a title screen is otherwise tedious to work on:
every run would begin at the title, three clicks away from the level you are editing. *Active