diff --git a/HISTORY.md b/HISTORY.md index 9d576bf5..1d61c2aa 100755 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,6 +2,9 @@ ## in development: +### 2021-03-11 +* gui, store: refactor loading a project into the IDE + ### 2021-03-09 * new dev version diff --git a/snap.html b/snap.html index cec5333b..c097b113 100755 --- a/snap.html +++ b/snap.html @@ -3,7 +3,7 @@ - Snap! 6.7.2 - dev - Build Your Own Blocks + Snap! 7 - dev - Build Your Own Blocks diff --git a/src/gui.js b/src/gui.js index 493906f5..1af304a3 100644 --- a/src/gui.js +++ b/src/gui.js @@ -78,7 +78,7 @@ Animation, BoxMorph, BlockEditorMorph, BlockDialogMorph, Note, ZERO, BLACK*/ // Global stuff //////////////////////////////////////////////////////// -modules.gui = '2021-March-09'; +modules.gui = '2021-March-11'; // Declarations @@ -4353,7 +4353,7 @@ IDE_Morph.prototype.aboutSnap = function () { module, btn1, btn2, btn3, btn4, licenseBtn, translatorsBtn, world = this.world(); - aboutTxt = 'Snap! 6.7.2 - dev -\nBuild Your Own Blocks\n\n' + aboutTxt = 'Snap! 7 - dev -\nBuild Your Own Blocks\n\n' + 'Copyright \u24B8 2008-2021 Jens M\u00F6nig and ' + 'Brian Harvey\n' + 'jens@moenig.org, bh@cs.berkeley.edu\n\n' @@ -5102,17 +5102,15 @@ IDE_Morph.prototype.rawOpenProjectString = function (str) { this.hasUnsavedEdits = false; if (Process.prototype.isCatchingErrors) { try { - this.serializer.openProject( - this.serializer.load(str, this), - this + this.switchToScene( + this.serializer.load(str, this) ); } catch (err) { this.showMessage('Load failed: ' + err); } } else { - this.serializer.openProject( - this.serializer.load(str, this), - this + this.switchToScene( + this.serializer.load(str, this) ); } this.stopFastTracking(); @@ -5146,13 +5144,12 @@ IDE_Morph.prototype.rawOpenCloudDataString = function (str) { try { model = this.serializer.parse(str); this.serializer.loadMediaModel(model.childNamed('media')); - this.serializer.openProject( + this.switchToScene( this.serializer.loadProjectModel( model.childNamed('project'), this, model.attributes.remixID - ), - this + ) ); } catch (err) { this.showMessage('Load failed: ' + err); @@ -5160,13 +5157,12 @@ IDE_Morph.prototype.rawOpenCloudDataString = function (str) { } else { model = this.serializer.parse(str); this.serializer.loadMediaModel(model.childNamed('media')); - this.serializer.openProject( + this.switchToScene( this.serializer.loadProjectModel( model.childNamed('project'), this, model.attributes.remixID - ), - this + ) ); } this.stopFastTracking(); @@ -5359,6 +5355,42 @@ IDE_Morph.prototype.openProject = function (name) { } }; +IDE_Morph.prototype.switchToScene = function (scene) { + var stage = this.stage, + sprites = [], + sprite; + if (!scene || !scene.stage) { + return; + } + this.siblings().forEach(morph => + morph.destroy() + ); + this.projectName = scene.name; + this.projectNotes = scene.notes || ''; + if (this.globalVariables) { + this.globalVariables = scene.globalVariables; + } + if (stage) { + stage.destroy(); + } + this.add(scene.stage); + this.stage = scene.stage; + sprites = this.stage.children.filter( + child => child instanceof SpriteMorph + ); + sprites.sort((x, y) => x.idx - y.idx); + + this.sprites = new List(sprites); + sprite = sprites[0] || scene.stage; + + this.stage.fixLayout(); + this.stage.pauseGenericHatBlocks(); + this.createCorral(); + this.selectSprite(sprite); + this.fixLayout(); + this.world().keyboardFocus = this.stage; +}; + IDE_Morph.prototype.setURL = function (str) { // Set the URL to a project's XML contents location.hash = this.projectsInURLs ? str : ''; diff --git a/src/store.js b/src/store.js index 46274bd2..ba5f84ce 100644 --- a/src/store.js +++ b/src/store.js @@ -49,19 +49,18 @@ */ -/*global modules, XML_Element, VariableFrame, StageMorph, SpriteMorph, -WatcherMorph, Point, CustomBlockDefinition, Context, ReporterBlockMorph, +/*global modules, XML_Element, VariableFrame, StageMorph, SpriteMorph, console, +WatcherMorph, Point, CustomBlockDefinition, Context, ReporterBlockMorph, Sound, CommandBlockMorph, detect, CustomCommandBlockMorph, CustomReporterBlockMorph, -Color, List, newCanvas, Costume, Sound, Audio, IDE_Morph, ScriptsMorph, +Color, List, newCanvas, Costume, Audio, IDE_Morph, ScriptsMorph, ArgLabelMorph, BlockMorph, ArgMorph, InputSlotMorph, TemplateSlotMorph, CommandSlotMorph, FunctionSlotMorph, MultiArgMorph, ColorSlotMorph, nop, CommentMorph, isNil, -localize, sizeOf, ArgLabelMorph, SVG_Costume, MorphicPreferences, Process, -SyntaxElementMorph, Variable, isSnapObject, console, BooleanSlotMorph, -normalizeCanvas, contains*/ +localize, SVG_Costume, MorphicPreferences, Process, isSnapObject, Variable, +SyntaxElementMorph, BooleanSlotMorph, normalizeCanvas, contains*/ // Global stuff //////////////////////////////////////////////////////// -modules.store = '2021-March-09'; +modules.store = '2021-March-11'; // XML_Serializer /////////////////////////////////////////////////////// @@ -1617,48 +1616,6 @@ SnapSerializer.prototype.loadColor = function (colorString) { ); }; -SnapSerializer.prototype.openProject = function (project, ide) { - var stage = ide.stage, - sprites = [], - sprite; - if (!project || !project.stage) { - return; - } - ide.siblings().forEach(morph => - morph.destroy() - ); - ide.projectName = project.name; - ide.projectNotes = project.notes || ''; - if (ide.globalVariables) { - ide.globalVariables = project.globalVariables; - } - if (stage) { - stage.destroy(); - } - ide.add(project.stage); - ide.stage = project.stage; - sprites = ide.stage.children.filter( - child => child instanceof SpriteMorph - ); - sprites.sort((x, y) => x.idx - y.idx); - - ide.sprites = new List(sprites); - sprite = sprites[0] || project.stage; - - if (sizeOf(this.mediaDict) > 0) { - ide.hasChangedMedia = false; - this.mediaDict = {}; - } else { - ide.hasChangedMedia = true; - } - project.stage.fixLayout(); - project.stage.pauseGenericHatBlocks(); - ide.createCorral(); - ide.selectSprite(sprite); - ide.fixLayout(); - ide.world().keyboardFocus = project.stage; -}; - // SnapSerializer XML-representation of objects: // Generics