Merge pull request #282 from rschamp/feature/vm.clear

Add VM.clear method
This commit is contained in:
Ray Schamp 2016-10-17 13:56:37 -04:00 committed by GitHub
commit 2904152318
5 changed files with 31 additions and 14 deletions

1
.gitignore vendored
View file

@ -11,6 +11,7 @@ npm-*
/dist.js /dist.js
/vm.js /vm.js
/vm.min.js /vm.min.js
/playground/assets
/playground/media /playground/media
/playground/vendor.js /playground/vendor.js
/playground/vm.js /playground/vm.js

View file

@ -167,6 +167,7 @@ Scratch3ControlBlocks.prototype.createClone = function (args, util) {
}; };
Scratch3ControlBlocks.prototype.deleteClone = function (args, util) { Scratch3ControlBlocks.prototype.deleteClone = function (args, util) {
if (util.target.isOriginal) return;
this.runtime.disposeTarget(util.target); this.runtime.disposeTarget(util.target);
this.runtime.stopForTarget(util.target); this.runtime.stopForTarget(util.target);
}; };

View file

@ -369,17 +369,25 @@ Runtime.prototype.startHats = function (requestedHatOpcode,
}; };
/** /**
* Dispose of a target. * Dispose all targets. Return to clean state.
* @param {!Target} target Target to dispose of.
*/ */
Runtime.prototype.disposeTarget = function (target) { Runtime.prototype.dispose = function () {
this.stopAll();
this.targets.map(this.disposeTarget, this);
};
/**
* Dispose of a target.
* @param {!Target} disposingTarget Target to dispose of.
*/
Runtime.prototype.disposeTarget = function (disposingTarget) {
this.targets = this.targets.filter(function (target) {
if (disposingTarget !== target) return true;
// Allow target to do dispose actions. // Allow target to do dispose actions.
target.dispose(); target.dispose();
// Remove from list of targets. // Remove from list of targets.
var index = this.targets.indexOf(target); return false;
if (index > -1) { });
this.targets.splice(index, 1);
}
}; };
/** /**

View file

@ -73,6 +73,15 @@ VirtualMachine.prototype.stopAll = function () {
this.runtime.stopAll(); 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. * 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. * @param {?string} json JSON string representing the project.
*/ */
VirtualMachine.prototype.loadProject = function (json) { VirtualMachine.prototype.loadProject = function (json) {
this.clear();
// @todo: Handle other formats, e.g., Scratch 1.4, Scratch 3.0. // @todo: Handle other formats, e.g., Scratch 1.4, Scratch 3.0.
sb2import(json, this.runtime); sb2import(json, this.runtime);
// Select the first target for editing, e.g., the stage. // Select the first target for editing, e.g., the stage.
@ -237,7 +247,7 @@ VirtualMachine.prototype.emitTargetsUpdate = function () {
return [target.id, target.getName()]; return [target.id, target.getName()];
}), }),
// Currently editing target id. // 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. * Dispose of this clone, destroying any run-time properties.
*/ */
Clone.prototype.dispose = function () { Clone.prototype.dispose = function () {
if (this.isOriginal) { // Don't allow a non-clone to delete itself.
return;
}
this.runtime.changeCloneCounter(-1); this.runtime.changeCloneCounter(-1);
if (this.renderer && this.drawableID !== null) { if (this.renderer && this.drawableID !== null) {
this.renderer.destroyDrawable(this.drawableID); this.renderer.destroyDrawable(this.drawableID);