kopia lustrzana https://github.com/backface/turtlestitch
block-assembly support for multi-args, experimental
rodzic
78b6df548d
commit
604eb74352
|
@ -68,6 +68,9 @@
|
|||
* Chinese, thanks, Simon!
|
||||
* Brazilian Portuguese, thank you, Cassiano D'Andrea!
|
||||
|
||||
### 2021-12-03
|
||||
* blocks, threads: block-assembly support for multi-args, experimental
|
||||
|
||||
### 2021-12-02
|
||||
* blocks, threads: block-assembly support refactorings, experimental
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<script src="src/morphic.js?version=2021-07-09"></script>
|
||||
<script src="src/symbols.js?version=2021-03-03"></script>
|
||||
<script src="src/widgets.js?version=2021-17-09"></script>
|
||||
<script src="src/blocks.js?version=2021-12-02"></script>
|
||||
<script src="src/blocks.js?version=2021-12-03"></script>
|
||||
<script src="src/threads.js?version=2021-12-02"></script>
|
||||
<script src="src/objects.js?version=2021-11-26"></script>
|
||||
<script src="src/scenes.js?version=2021-11-24"></script>
|
||||
|
|
147
src/blocks.js
147
src/blocks.js
|
@ -160,7 +160,7 @@ CustomCommandBlockMorph, ToggleButtonMorph, DialMorph, SnapExtensions*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.blocks = '2021-December-02';
|
||||
modules.blocks = '2021-December-03';
|
||||
|
||||
var SyntaxElementMorph;
|
||||
var BlockMorph;
|
||||
|
@ -1323,6 +1323,7 @@ SyntaxElementMorph.prototype.revertToDefaultInput = function (arg, noValues) {
|
|||
deflt.fixBlockColor();
|
||||
}
|
||||
this.cachedInputs = null;
|
||||
return deflt;
|
||||
};
|
||||
|
||||
SyntaxElementMorph.prototype.isLocked = function () {
|
||||
|
@ -3725,31 +3726,93 @@ BlockMorph.prototype.copyWithInputs = function (inputs) {
|
|||
slots = cpy.inputs(),
|
||||
dta = inputs.itemsArray().map(inp =>
|
||||
inp instanceof Context ? inp.expression : inp
|
||||
);
|
||||
),
|
||||
count = 0,
|
||||
dflt;
|
||||
|
||||
// restore input slots
|
||||
slots.forEach(slt => {
|
||||
if (slt instanceof BlockMorph) {
|
||||
cpy.revertToDefaultInput(slt);
|
||||
dflt = cpy.revertToDefaultInput(slt);
|
||||
if (dflt instanceof MultiArgMorph) {
|
||||
dflt.collapseAll();
|
||||
}
|
||||
} else if (slt instanceof MultiArgMorph) {
|
||||
slt.inputs().forEach(entry => {
|
||||
if (entry instanceof BlockMorph) {
|
||||
slt.revertToDefaultInput(entry); // does this work?
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
dta.forEach((inp, i) => {
|
||||
if (inp instanceof BlockMorph) {
|
||||
if (inp instanceof CommandBlockMorph && slots[i].nestedBlock) {
|
||||
slots[i].nestedBlock(inp);
|
||||
} else if (inp instanceof ReporterBlockMorph &&
|
||||
!slots[i].isStatic) {
|
||||
cpy.replaceInput(slots[i], inp);
|
||||
}
|
||||
|
||||
// distribute inputs among the slots
|
||||
slots = cpy.inputs();
|
||||
slots.forEach((slot) => {
|
||||
var inp;
|
||||
if (slot instanceof MultiArgMorph && !slot.isEmptySlot()) {
|
||||
slot.inputs().forEach(entry => {
|
||||
inp = dta[count];
|
||||
if (inp instanceof BlockMorph) {
|
||||
if (inp instanceof CommandBlockMorph && entry.nestedBlock) {
|
||||
entry.nestedBlock(inp);
|
||||
} else if (inp instanceof ReporterBlockMorph &&
|
||||
!entry.isStatic) {
|
||||
slot.replaceInput(entry, inp);
|
||||
}
|
||||
} else {
|
||||
if (inp instanceof List && inp.length() === 0) {
|
||||
nop(); // ignore, i.e. leave slot as is
|
||||
} else {
|
||||
entry.setContents(inp);
|
||||
}
|
||||
}
|
||||
count += 1;
|
||||
});
|
||||
} else {
|
||||
if (inp instanceof List && inp.length() === 0) {
|
||||
nop(); // ignore, i.e. leave slot as is
|
||||
inp = dta[count];
|
||||
if (inp instanceof BlockMorph) {
|
||||
if (inp instanceof CommandBlockMorph && slot.nestedBlock) {
|
||||
slot.nestedBlock(inp);
|
||||
} else if (inp instanceof ReporterBlockMorph &&
|
||||
!slot.isStatic) {
|
||||
cpy.replaceInput(slot, inp);
|
||||
}
|
||||
} else {
|
||||
slots[i].setContents(inp);
|
||||
if (inp instanceof List && inp.length() === 0) {
|
||||
nop(); // ignore, i.e. leave slot as is
|
||||
} else {
|
||||
slot.setContents(inp);
|
||||
}
|
||||
}
|
||||
}
|
||||
count += 1;
|
||||
});
|
||||
|
||||
// create a function to return
|
||||
return cpy.reify();
|
||||
};
|
||||
|
||||
/*
|
||||
} else if (inp instanceof MultiArgMorph) {
|
||||
inp.inputs().forEach((slot, i) => {
|
||||
var entry;
|
||||
if (slot instanceof BlockMorph) {
|
||||
parts.add(slot.components());
|
||||
} else if (slot.isEmptySlot()) {
|
||||
parts.add();
|
||||
} else {
|
||||
entry = slot.evaluate();
|
||||
parts.add(entry instanceof BlockMorph ?
|
||||
entry.components() : entry);
|
||||
}
|
||||
inp.revertToDefaultInput(slot, true);
|
||||
});
|
||||
} else if (inp instanceof ArgLabelMorph) {
|
||||
parts.add(inp.argMorph().components());
|
||||
expr.revertToDefaultInput(inp, true).collapseAll();
|
||||
*/
|
||||
|
||||
BlockMorph.prototype.reify = function () {
|
||||
// private - assumes that I've already been deep copied
|
||||
var context = new Context();
|
||||
|
@ -5509,14 +5572,32 @@ CommandBlockMorph.prototype.components = function () {
|
|||
var val;
|
||||
if (inp instanceof BlockMorph) {
|
||||
parts.add(inp.components());
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
} else if (inp.isEmptySlot()) {
|
||||
parts.add(); // empty
|
||||
parts.add();
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
} else if (inp instanceof MultiArgMorph) {
|
||||
inp.inputs().forEach((slot, i) => {
|
||||
var entry;
|
||||
if (slot instanceof BlockMorph) {
|
||||
parts.add(slot.components());
|
||||
} else if (slot.isEmptySlot()) {
|
||||
parts.add();
|
||||
} else {
|
||||
entry = slot.evaluate();
|
||||
parts.add(entry instanceof BlockMorph ?
|
||||
entry.components() : entry);
|
||||
}
|
||||
inp.revertToDefaultInput(slot, true);
|
||||
});
|
||||
} else if (inp instanceof ArgLabelMorph) {
|
||||
parts.add(inp.argMorph().components());
|
||||
expr.revertToDefaultInput(inp, true).collapseAll();
|
||||
} else {
|
||||
val = inp.evaluate();
|
||||
parts.add(val instanceof BlockMorph ? val.components() : val);
|
||||
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
}
|
||||
expr.revertToDefaultInput(inp, true); // empty
|
||||
});
|
||||
parts.at(1).updateEmptySlots();
|
||||
return parts;
|
||||
|
@ -6310,14 +6391,32 @@ ReporterBlockMorph.prototype.components = function () {
|
|||
var val;
|
||||
if (inp instanceof BlockMorph) {
|
||||
parts.add(inp.components());
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
} else if (inp.isEmptySlot()) {
|
||||
parts.add(); // empty
|
||||
parts.add();
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
} else if (inp instanceof MultiArgMorph) {
|
||||
inp.inputs().forEach((slot, i) => {
|
||||
var entry;
|
||||
if (slot instanceof BlockMorph) {
|
||||
parts.add(slot.components());
|
||||
} else if (slot.isEmptySlot()) {
|
||||
parts.add();
|
||||
} else {
|
||||
entry = slot.evaluate();
|
||||
parts.add(entry instanceof BlockMorph ?
|
||||
entry.components() : entry);
|
||||
}
|
||||
inp.revertToDefaultInput(slot, true);
|
||||
});
|
||||
} else if (inp instanceof ArgLabelMorph) {
|
||||
parts.add(inp.argMorph().components());
|
||||
expr.revertToDefaultInput(inp, true).collapseAll();
|
||||
} else {
|
||||
val = inp.evaluate();
|
||||
parts.add(val instanceof BlockMorph ? val.components() : val);
|
||||
|
||||
expr.revertToDefaultInput(inp, true);
|
||||
}
|
||||
expr.revertToDefaultInput(inp, true); // empty
|
||||
});
|
||||
parts.at(1).updateEmptySlots();
|
||||
return parts;
|
||||
|
@ -12191,6 +12290,14 @@ MultiArgMorph.prototype.removeInput = function () {
|
|||
this.fixLayout();
|
||||
};
|
||||
|
||||
MultiArgMorph.prototype.collapseAll = function () {
|
||||
var len = this.inputs().length,
|
||||
i;
|
||||
for (i = 0; i < len; i+= 1) {
|
||||
this.removeInput();
|
||||
}
|
||||
};
|
||||
|
||||
MultiArgMorph.prototype.isVertical = function () {
|
||||
return contains(['%repRing', '%predRing', '%cmdRing'], this.slotSpec);
|
||||
};
|
||||
|
|
Ładowanie…
Reference in New Issue