Turn the lane sideways without changing what it means
The cel sheet is a second projection of the same lane rows: frames run down, lanes run across, and each occupied cell carries the timeline cel's exact selection address. The shared action strip proves the point in the browser test by selecting a cell and issuing the existing hold command. Before exposing that second entrance, fix the boundary mistakes it revealed. Nested commands now convert the open playhead through their enclosing instance path. Overwrite composes blanking with non-rippling placement as one transaction. Picture-rate and pose sampling select only the generated base frame while hand corrections retain the node's authored frame. Stack validation follows covering replacement layers so a document accepted by the validator cannot throw solely because a later offset sees a different shape. 429 tests, 5,767 assertions; both browser flows; 56 Django tests; optimized frontend build.
This commit is contained in:
parent
7a54bfca56
commit
2f1c9b9c02
15 changed files with 387 additions and 100 deletions
|
|
@ -197,8 +197,25 @@ try {
|
|||
'blanked: a gap where it was, and nothing closed it');
|
||||
assert.equal(s.clip.symbols.main.frames, 20, 'the shot is as long as it was authored');
|
||||
assert.equal(s.history.done.length, before.history.done.length + 8);
|
||||
|
||||
// The same cels with the axes turned. Selecting a sheet cell feeds the same
|
||||
// action strip and therefore the same domain command and undo transaction.
|
||||
await click('cel sheet');
|
||||
assert.equal(await evaluate('document.querySelectorAll(".cs-head:not(.cs-frame)").length'), 1,
|
||||
'one lane is one cel-sheet column');
|
||||
assert.equal(await evaluate('document.querySelectorAll(".cs-cell").length'), 20,
|
||||
'one cell per authored frame');
|
||||
await evaluate(`document.querySelector('.cs-cell').click()`);
|
||||
await sleep(180);
|
||||
await click('hold +');
|
||||
s = await shot();
|
||||
assert.deepEqual(placed(s), [[0, 3], [3, 4], [6, 7], [7, 8], [8, 9]],
|
||||
'a command selected in the sheet has the timeline command semantics');
|
||||
assert.equal(s.history.done.length, before.history.done.length + 9);
|
||||
await click('timeline');
|
||||
assert.equal(await evaluate('document.querySelectorAll(".tl-cel").length'), 5);
|
||||
assert.equal(errors.length, 0, JSON.stringify(errors));
|
||||
console.log('PASS: create lane/drawings, one-row cels, hold ripple, seek, explicit overflow, atomic undo, reuse/make unique/duplicate, split, insert, trim, move and blank; no server writes');
|
||||
console.log('PASS: lane commands agree from timeline and cel sheet; no server writes');
|
||||
} finally {
|
||||
if (ws?.readyState === WebSocket.OPEN) {
|
||||
ws.send(JSON.stringify({ id: 999999, method: 'Browser.close' }));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue