Animations: copy/paste keys, Ctrl+drag duplicates, insert and remove frames (#102)

admin committed 2026-09-17 12:53:57 +02:00
1 parent 94e46524f4
commit f0554dd293
3 files changed
+14 -4

No files matched your search

+9 -1
@@ -61,7 +61,15 @@ would. Under the preview lies the **timeline**: a row per target and property, a
top. **Double-click** a cell to set a key with the value that holds there (then edit the value in
the inspector while the key is selected); click a key to pick it, drag a band to pick several,
drag keys to move them (one landing on another replaces it), `Delete` removes the picked keys —
or the whole row when its header is picked. Click or drag the ruler to scrub. The wheel zooms the
or the whole row when its header is picked. `Ctrl`+drag duplicates keys: the originals stay, the
copies land where the pointer lets go. `Ctrl+C` copies the picked keys and `Ctrl+V` pastes them
with the earliest one on the playhead's frame, keeping their distances: into the rows they came
from, or — for keys of a single row — into the row picked now, if it is of the same kind. In
another animation each row finds the row animating the same property; rows without one are left
out. A pasted key replaces one on its frame. **Right-click** the timeline for *Copy*, *Paste*,
*Insert frames…* and *Remove frames…*: both ask for a count and work at the playhead over every
row — inserting moves every key from the playhead's frame on later, removing drops the keys in
the removed frames and pulls the rest earlier. Each is one undo step. Click or drag the ruler to scrub. The wheel zooms the
frames about the pointer, `Shift`+wheel scrolls, the middle button (or `Shift`+drag) pans. Rows are not collapsed or reordered.
**Play, stop, pause.** `Play animation` starts an animation on an object (both are ports: the
+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 # 943 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 948 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 943 checks as here.
WebGL 2.0, and the same 948 checks as here.
+3 -1
@@ -2,7 +2,9 @@
`Backspace` remove the selection (objects, nodes, frames, keys or a row 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,
the clipboard as a texture (ignored while a text field has focus) · Animation tab: `Ctrl+C` copy
the picked keys, `Ctrl+V` paste them at the playhead (while keys are copied this takes `Ctrl+V`
there, so an image is pasted from another tab), `Ctrl`+drag duplicate keys · `Tab` / `Shift+Tab` cycle fields · lists: `↑`/`↓` move,
`←`/`→` fold, `Enter` activates · number
fields: drag to scrub (`Shift` x10, `Alt` x0.1, snapping to the grid of that increment, so a
step-1 field lands on whole numbers), `↑`/`↓` step, shown with three decimals (`ui/math.ts`,