kopia lustrzana https://github.com/backface/turtlestitch
enable relabelling blocks with shifting inputs
rodzic
4efbc8264c
commit
cbbe6983d1
|
@ -7,7 +7,7 @@
|
||||||
<script src="src/morphic.js?version=2020-06-13"></script>
|
<script src="src/morphic.js?version=2020-06-13"></script>
|
||||||
<script src="src/symbols.js?version=2020-06-17"></script>
|
<script src="src/symbols.js?version=2020-06-17"></script>
|
||||||
<script src="src/widgets.js?version=2020-05-06"></script>
|
<script src="src/widgets.js?version=2020-05-06"></script>
|
||||||
<script src="src/blocks.js?version=2020-06-15"></script>
|
<script src="src/blocks.js?version=2020-06-19"></script>
|
||||||
<script src="src/threads.js?version=2020-06-15"></script>
|
<script src="src/threads.js?version=2020-06-15"></script>
|
||||||
<script src="src/objects.js?version=2020-06-14"></script>
|
<script src="src/objects.js?version=2020-06-14"></script>
|
||||||
<script src="src/gui.js?version=2020-06-08"></script>
|
<script src="src/gui.js?version=2020-06-08"></script>
|
||||||
|
|
|
@ -148,7 +148,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/
|
||||||
|
|
||||||
// Global stuff ////////////////////////////////////////////////////////
|
// Global stuff ////////////////////////////////////////////////////////
|
||||||
|
|
||||||
modules.blocks = '2020-June-15';
|
modules.blocks = '2020-June-19';
|
||||||
|
|
||||||
var SyntaxElementMorph;
|
var SyntaxElementMorph;
|
||||||
var BlockMorph;
|
var BlockMorph;
|
||||||
|
@ -3173,6 +3173,10 @@ BlockMorph.prototype.unringify = function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockMorph.prototype.relabel = function (alternativeSelectors) {
|
BlockMorph.prototype.relabel = function (alternativeSelectors) {
|
||||||
|
// morph one block into another trying to keep the inputs in place
|
||||||
|
// alternative Selector can either be a string representing
|
||||||
|
// a block selector or a 2-item array containing a string and
|
||||||
|
// an integer offset for restoring inputs
|
||||||
var menu, oldInputs,
|
var menu, oldInputs,
|
||||||
target = this.selectForEdit(); // copy-on-edit
|
target = this.selectForEdit(); // copy-on-edit
|
||||||
if (target !== this) {
|
if (target !== this) {
|
||||||
|
@ -3180,14 +3184,22 @@ BlockMorph.prototype.relabel = function (alternativeSelectors) {
|
||||||
}
|
}
|
||||||
menu = new MenuMorph(this);
|
menu = new MenuMorph(this);
|
||||||
oldInputs = this.inputs();
|
oldInputs = this.inputs();
|
||||||
alternativeSelectors.forEach(sel => {
|
alternativeSelectors.forEach(alternative => {
|
||||||
var block = SpriteMorph.prototype.blockForSelector(sel);
|
var block, selector, offset;
|
||||||
block.restoreInputs(oldInputs);
|
if (alternative instanceof Array) {
|
||||||
|
selector = alternative[0];
|
||||||
|
offset = -alternative[1];
|
||||||
|
} else {
|
||||||
|
selector = alternative;
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
block = SpriteMorph.prototype.blockForSelector(selector);
|
||||||
|
block.restoreInputs(oldInputs, offset);
|
||||||
block.fixBlockColor(null, true);
|
block.fixBlockColor(null, true);
|
||||||
block.addShadow(new Point(3, 3));
|
block.addShadow(new Point(3, 3));
|
||||||
menu.addItem(
|
menu.addItem(
|
||||||
block.fullImage(),
|
block.fullImage(),
|
||||||
() => this.setSelector(sel)
|
() => this.setSelector(selector, -offset)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
menu.popup(this.world(), this.bottomLeft().subtract(new Point(
|
menu.popup(this.world(), this.bottomLeft().subtract(new Point(
|
||||||
|
@ -3196,8 +3208,11 @@ BlockMorph.prototype.relabel = function (alternativeSelectors) {
|
||||||
)));
|
)));
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockMorph.prototype.setSelector = function (aSelector) {
|
|
||||||
|
BlockMorph.prototype.setSelector = function (aSelector, inputOffset = 0) {
|
||||||
// private - used only for relabel()
|
// private - used only for relabel()
|
||||||
|
// input offset is optional and can be used to shift the inputs
|
||||||
|
// to be restored
|
||||||
var oldInputs = this.inputs(),
|
var oldInputs = this.inputs(),
|
||||||
scripts = this.parentThatIsA(ScriptsMorph),
|
scripts = this.parentThatIsA(ScriptsMorph),
|
||||||
surplus,
|
surplus,
|
||||||
|
@ -3206,7 +3221,7 @@ BlockMorph.prototype.setSelector = function (aSelector) {
|
||||||
this.setCategory(info.category);
|
this.setCategory(info.category);
|
||||||
this.selector = aSelector;
|
this.selector = aSelector;
|
||||||
this.setSpec(localize(info.spec));
|
this.setSpec(localize(info.spec));
|
||||||
surplus = this.restoreInputs(oldInputs);
|
surplus = this.restoreInputs(oldInputs, -inputOffset);
|
||||||
this.fixLabelColor();
|
this.fixLabelColor();
|
||||||
|
|
||||||
// place surplus blocks on scipts
|
// place surplus blocks on scipts
|
||||||
|
@ -3218,17 +3233,31 @@ BlockMorph.prototype.setSelector = function (aSelector) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockMorph.prototype.restoreInputs = function (oldInputs) {
|
BlockMorph.prototype.restoreInputs = function (oldInputs, offset = 0) {
|
||||||
// private - used only for relabel()
|
// private - used only for relabel()
|
||||||
// try to restore my previous inputs when my spec has been changed
|
// try to restore my previous inputs when my spec has been changed
|
||||||
// return an Array of left-over blocks, if any
|
// return an Array of left-over blocks, if any
|
||||||
var i = 0,
|
// optional offset parameter allows for shifting the range
|
||||||
old,
|
// of inputs to be restored
|
||||||
nb,
|
var old, nb, i,
|
||||||
leftOver = [];
|
leftOver = [];
|
||||||
|
|
||||||
this.inputs().forEach(inp => {
|
// gather leading surplus blocks
|
||||||
|
for (i = 0; i < offset; i += 1) {
|
||||||
old = oldInputs[i];
|
old = oldInputs[i];
|
||||||
|
if (old instanceof ReporterBlockMorph) {
|
||||||
|
leftOver.push(old);
|
||||||
|
} else if (old instanceof CommandSlotMorph) {
|
||||||
|
nb = old.nestedBlock();
|
||||||
|
if (nb) {
|
||||||
|
leftOver.push(nb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore matching inputs in their original order
|
||||||
|
this.inputs().forEach(inp => {
|
||||||
|
old = oldInputs[offset];
|
||||||
if (old instanceof ReporterBlockMorph) {
|
if (old instanceof ReporterBlockMorph) {
|
||||||
this.replaceInput(inp, old.fullCopy());
|
this.replaceInput(inp, old.fullCopy());
|
||||||
} else if (old && inp instanceof InputSlotMorph) {
|
} else if (old && inp instanceof InputSlotMorph) {
|
||||||
|
@ -3247,12 +3276,12 @@ BlockMorph.prototype.restoreInputs = function (oldInputs) {
|
||||||
inp.nestedBlock(nb.fullCopy());
|
inp.nestedBlock(nb.fullCopy());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i += 1;
|
offset += 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
// gather surplus blocks
|
// gather trailing surplus blocks
|
||||||
for (i; i < oldInputs.length; i += 1) {
|
for (offset; offset < oldInputs.length; offset += 1) {
|
||||||
old = oldInputs[i];
|
old = oldInputs[offset];
|
||||||
if (old instanceof ReporterBlockMorph) {
|
if (old instanceof ReporterBlockMorph) {
|
||||||
leftOver.push(old);
|
leftOver.push(old);
|
||||||
} else if (old instanceof CommandSlotMorph) {
|
} else if (old instanceof CommandSlotMorph) {
|
||||||
|
|
Ładowanie…
Reference in New Issue