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:
Ray Schamp 2016-10-17 13:43:38 -04:00
parent 503de088fe
commit bd95c1461d
4 changed files with 28 additions and 12 deletions

View file

@ -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);
};

View file

@ -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;
});
};
/**

View file

@ -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
});
};

View file

@ -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);