Fix #4573 by using an existing utitlity that re-ids blocks when we duplicate a sprite.

This commit is contained in:
picklesrus 2019-03-25 10:18:00 -04:00
parent f33b15affa
commit 2cf1d21b09
2 changed files with 25 additions and 1 deletions

View file

@ -2,6 +2,7 @@ const RenderedTarget = require('./rendered-target');
const Blocks = require('../engine/blocks');
const {loadSoundFromAsset} = require('../import/load-sound');
const {loadCostumeFromAsset} = require('../import/load-costume');
const newBlockIds = require('../util/new-block-ids');
const StringUtil = require('../util/string-util');
const StageLayering = require('../engine/stage-layering');
@ -136,8 +137,12 @@ class Sprite {
duplicate () {
const newSprite = new Sprite(null, this.runtime);
const copiedBlocks = JSON.parse(JSON.stringify(Object.values(this.blocks._blocks)));
newBlockIds(copiedBlocks);
copiedBlocks.forEach(block => {
newSprite.blocks.createBlock(block);
});
newSprite.blocks = this.blocks.duplicate();
const allNames = this.runtime.targets.map(t => t.sprite.name);
newSprite.name = StringUtil.unusedName(this.name, allNames);

View file

@ -1,4 +1,5 @@
const test = require('tap').test;
const Blocks = require('../../src/engine/blocks');
const RenderedTarget = require('../../src/sprites/rendered-target');
const Sprite = require('../../src/sprites/sprite');
const Runtime = require('../../src/engine/runtime');
@ -27,6 +28,24 @@ test('setxy', t => {
t.end();
});
test('blocks get new id on duplicate', t => {
const r = new Runtime();
const s = new Sprite(null, r);
const rt = new RenderedTarget(s, r);
const block = {
id: 'id1',
topLevel: true,
fields: {}
};
rt.blocks.createBlock(block);
return rt.duplicate().then(duplicate => {
t.notOk(duplicate.blocks._blocks.hasOwnProperty(block.id));
t.end();
});
});
test('direction', t => {
const r = new Runtime();
const s = new Sprite(null, r);