mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-23 14:32:59 -05:00
Add VM.clear method
Use it before loading projects so targets don't accumulate when multiple projects are loaded on the same instance. Move check to see if the clone is the original clone onto the block implementation so all clones can be removed. Fixes #274
This commit is contained in:
parent
503de088fe
commit
bd95c1461d
4 changed files with 28 additions and 12 deletions
|
@ -167,6 +167,7 @@ Scratch3ControlBlocks.prototype.createClone = function (args, util) {
|
|||
};
|
||||
|
||||
Scratch3ControlBlocks.prototype.deleteClone = function (args, util) {
|
||||
if (util.target.isOriginal) return;
|
||||
this.runtime.disposeTarget(util.target);
|
||||
this.runtime.stopForTarget(util.target);
|
||||
};
|
||||
|
|
|
@ -368,18 +368,26 @@ Runtime.prototype.startHats = function (requestedHatOpcode,
|
|||
return newThreads;
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispose all targets. Return to clean state.
|
||||
*/
|
||||
Runtime.prototype.dispose = function () {
|
||||
this.stopAll();
|
||||
this.targets.map(this.disposeTarget, this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispose of a target.
|
||||
* @param {!Target} target Target to dispose of.
|
||||
*/
|
||||
Runtime.prototype.disposeTarget = function (target) {
|
||||
Runtime.prototype.disposeTarget = function (disposingTarget) {
|
||||
this.targets = this.targets.filter(function (target) {
|
||||
if (disposingTarget !== target) return true;
|
||||
// Allow target to do dispose actions.
|
||||
target.dispose();
|
||||
// Remove from list of targets.
|
||||
var index = this.targets.indexOf(target);
|
||||
if (index > -1) {
|
||||
this.targets.splice(index, 1);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
12
src/index.js
12
src/index.js
|
@ -73,6 +73,15 @@ VirtualMachine.prototype.stopAll = function () {
|
|||
this.runtime.stopAll();
|
||||
};
|
||||
|
||||
/**
|
||||
* Clear out current running project data.
|
||||
*/
|
||||
VirtualMachine.prototype.clear = function () {
|
||||
this.runtime.dispose();
|
||||
this.editingTarget = null;
|
||||
this.emitTargetsUpdate();
|
||||
};
|
||||
|
||||
/**
|
||||
* Get data for playground. Data comes back in an emitted event.
|
||||
*/
|
||||
|
@ -116,6 +125,7 @@ VirtualMachine.prototype.postIOData = function (device, data) {
|
|||
* @param {?string} json JSON string representing the project.
|
||||
*/
|
||||
VirtualMachine.prototype.loadProject = function (json) {
|
||||
this.clear();
|
||||
// @todo: Handle other formats, e.g., Scratch 1.4, Scratch 3.0.
|
||||
sb2import(json, this.runtime);
|
||||
// Select the first target for editing, e.g., the stage.
|
||||
|
@ -237,7 +247,7 @@ VirtualMachine.prototype.emitTargetsUpdate = function () {
|
|||
return [target.id, target.getName()];
|
||||
}),
|
||||
// Currently editing target id.
|
||||
editingTarget: this.editingTarget.id
|
||||
editingTarget: this.editingTarget ? this.editingTarget.id : null
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -418,9 +418,6 @@ Clone.prototype.onGreenFlag = function () {
|
|||
* Dispose of this clone, destroying any run-time properties.
|
||||
*/
|
||||
Clone.prototype.dispose = function () {
|
||||
if (this.isOriginal) { // Don't allow a non-clone to delete itself.
|
||||
return;
|
||||
}
|
||||
this.runtime.changeCloneCounter(-1);
|
||||
if (this.renderer && this.drawableID !== null) {
|
||||
this.renderer.destroyDrawable(this.drawableID);
|
||||
|
|
Loading…
Reference in a new issue