diff --git a/blocks.js b/blocks.js index 3d2c15ab..01dd854b 100644 --- a/blocks.js +++ b/blocks.js @@ -145,11 +145,12 @@ radians, useBlurredShadows, SpeechBubbleMorph, modules, StageMorph, fontHeight, TableFrameMorph, SpriteMorph, Context, ListWatcherMorph, CellMorph, DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph, Costume, IDE_Morph, BlockDialogMorph, BlockEditorMorph, localize, isNil, -isSnapObject, copy, PushButtonMorph, SpriteIconMorph, Process, AlignmentMorph*/ +isSnapObject, copy, PushButtonMorph, SpriteIconMorph, Process, AlignmentMorph, +CustomCommandBlockMorph*/ // Global stuff //////////////////////////////////////////////////////// -modules.blocks = '2017-January-03'; +modules.blocks = '2017-January-04'; var SyntaxElementMorph; var BlockMorph; @@ -710,7 +711,7 @@ SyntaxElementMorph.prototype.definesScriptVariable = function (name) { || (this.blockSpec && this.blockSpec.match('%upvar'))) && (detect(this.inputs()[0].allInputs(), function (input) { return (input.selector === 'reportGetVar' - && input.blockSpec === name) + && input.blockSpec === name); }))); }; @@ -2387,11 +2388,12 @@ BlockMorph.prototype.userMenu = function () { ); } } - if (this.selector === 'reportGetVar') { + if (this.selector === 'reportGetVar' && !this.isInheritedVariable()) { menu.addLine(); menu.addItem( - 'rename all in this scope...', - 'refactorThisVar' + 'rename all...', + 'refactorThisVar', + 'rename all blocks that\naccess this variable' ); } } else { @@ -2399,28 +2401,33 @@ BlockMorph.prototype.userMenu = function () { } if (this.selector === 'reportGetVar') { - blck = this.fullCopy(); - blck.addShadow(); - menu.addItem( - 'rename just here...', - function () { - if (this.isTemplate) { - myself.refactorThisVar(true); // just the template - } else { - new DialogBoxMorph( - myself, - myself.userSetSpec, - myself - ).prompt( - "Variable name", - myself.blockSpec, - world, - blck.fullImage(), // pic - InputSlotMorph.prototype.getVarNamesDict.call(myself) - ); - } - } - ); + if (!(this.isInheritedVariable())) { + blck = this.fullCopy(); + blck.addShadow(); + menu.addItem( + 'rename...', + function () { + if (this.isTemplate) { + myself.refactorThisVar(true); // just the template + } else { + new DialogBoxMorph( + myself, + myself.userSetSpec, + myself + ).prompt( + "Variable name", + myself.blockSpec, + world, + blck.fullImage(), // pic + InputSlotMorph.prototype.getVarNamesDict.call( + myself + ) + ); + } + }, + 'rename only\nthis reporter' + ); + } if (this.isTemplate) { return menu; } @@ -2589,6 +2596,19 @@ BlockMorph.prototype.hidePrimitive = function () { ide.refreshPalette(); }; +BlockMorph.prototype.isInheritedVariable = function () { + // private - only for variable getter template inside the palette + if (this.isTemplate && + (this.selector === 'reportGetVar') && + (this.parent instanceof FrameMorph)) { + return contains( + this.receiver().inheritedVariableNames(), + this.blockSpec + ); + } + return false; +}; + BlockMorph.prototype.isTransientVariable = function () { // private - only for variable getter template inside the palette var varFrame = this.receiver().variables.silentFind(this.blockSpec); @@ -3080,8 +3100,10 @@ BlockMorph.prototype.refactorThisVar = function (justTheTemplate) { ide = this.parentThatIsA(IDE_Morph), stage = ide.stage, oldWatcher = receiver.findVariableWatcher(oldName), + cpy = this.fullCopy(), oldValue, newWatcher; + cpy.addShadow(); new DialogBoxMorph( this, function (newName) { @@ -3178,7 +3200,7 @@ BlockMorph.prototype.refactorThisVar = function (justTheTemplate) { 'Variable name', oldName, this.world(), - this.fullImage(), // pic + cpy.fullImage(), // pic InputSlotMorph.prototype.getVarNamesDict.call(this) ); @@ -3188,7 +3210,7 @@ BlockMorph.prototype.refactorThisVar = function (justTheTemplate) { 'A variable with this name already exists ' + (where || 'in this context') + '.' ); - }; + } }; // BlockMorph drawing diff --git a/history.txt b/history.txt index e34d5dca..a121c0b4 100755 --- a/history.txt +++ b/history.txt @@ -3242,6 +3242,10 @@ http://snap.berkeley.edu/run#cloud:Username=jens&ProjectName=rotation * Hierarchical menus, thanks, Brian! * Tweaks to hierarchical menus +170104 +------ +* Variable refactoring, yay! Thanks, Bernat!! + == v4.10 === (in development) @@ -3250,13 +3254,14 @@ Features: * undo / redo for blocks, unlimited, but has some issues * search field for projects, thanks, Bernat!! * basic typography support for custom block labels, thanks, Bernat!! -* Treat JS-function reporters the same as variable getters wrt rings +* treat JS-function reporters the same as variable getters wrt rings * new url switch #dl: for downloading raw shared projects * new url option switch: &noExitWarning * svg support for images from the web (svg files have been supported for a long time) * use media dialog for browsing and importing sounds * highly experimental infix-expression-to-reporter parser. Thanks, Bernat, for the brilliant idea to add it to the search-blocks field! * hierarchical menus, also for custom blocks, thanks, Brian! +* variable refactoring, thanks, Bernat! Fixes: * Music (play note) to work again in new and recent browser versions (Chrome 55) diff --git a/objects.js b/objects.js index 24858a66..fda2106d 100644 --- a/objects.js +++ b/objects.js @@ -82,7 +82,7 @@ SpeechBubbleMorph, RingMorph, isNil, FileReader, TableDialogMorph, BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, localize, TableMorph, TableFrameMorph, normalizeCanvas, BooleanSlotMorph*/ -modules.objects = '2017-January-03'; +modules.objects = '2017-January-04'; var SpriteMorph; var StageMorph;