new "delete block" primitive in sensing, experimental

snap8
Jens Mönig 2022-06-28 19:43:12 +02:00
rodzic 710a4dcb93
commit 9332a1328f
5 zmienionych plików z 56 dodań i 2 usunięć

Wyświetl plik

@ -19,6 +19,7 @@
* new "label", "type", "scope", "slots", "defaults", "menus" and "editables" choices in the OF BLOCK block-attribute reporter's dropdown
* new "set attribute of block" primitive, experimental
* new "define block" primitive, experimental
* new "delete block" primitive, experimental
* new "this script" primitive, experimental
* new localization extension primitives in the "ide" category, hyperized
* new extension primitive for importing a costume from a url
@ -59,6 +60,7 @@
* blocks, threads: new "editables" selector for block attributes (indicates read-only input slots)
* German translation update for "editables"
* blocks, threads: new "defaults" selector for block attributes
* blocks, objects, threads: new "delete block" primitive in sensing
### 2022-06-27
* threads: trim block label before identifying existing definition in DEFINE

Wyświetl plik

@ -18,7 +18,7 @@
<script src="src/widgets.js?version=2021-17-09"></script>
<script src="src/blocks.js?version=2022-06-28"></script>
<script src="src/threads.js?version=2022-06-28"></script>
<script src="src/objects.js?version=2022-06-23"></script>
<script src="src/objects.js?version=2022-06-28"></script>
<script src="src/scenes.js?version=2022-03-03"></script>
<script src="src/gui.js?version=2022-05-19"></script>
<script src="src/paint.js?version=2021-07-05"></script>

Wyświetl plik

@ -13685,6 +13685,10 @@ ReporterSlotMorph.prototype.isEmptySlot = function () {
ReporterSlotMorph.prototype.fixLayout = function () {
var contents = this.contents();
if (!contents) {
contents = this.emptySlot();
this.add(contents);
}
this.bounds.setExtent(contents.extent().add(
this.edge * 2 + this.rfBorder * 2
));

Wyświetl plik

@ -94,7 +94,7 @@ embedMetadataPNG*/
/*jshint esversion: 6*/
modules.objects = '2022-June-23';
modules.objects = '2022-June-28';
var SpriteMorph;
var StageMorph;
@ -927,6 +927,11 @@ SpriteMorph.prototype.initBlocks = function () {
spec: 'set %byob of block %repRing to %s',
defaults: [['label']]
},
doDeleteBlock: {
type: 'command',
category: 'control',
spec: 'delete block %repRing'
},
reportBlockAttribute: {
type: 'reporter',
category: 'control',
@ -2658,6 +2663,7 @@ SpriteMorph.prototype.blockTemplates = function (
blocks.push(block('doSwitchToScene'));
blocks.push('-');
blocks.push(block('doDefineBlock'));
blocks.push(block('doDeleteBlock'));
blocks.push(block('doSetBlockAttribute'));
blocks.push(block('reportBlockAttribute'));
blocks.push(block('reportThisContext'));
@ -9138,6 +9144,7 @@ StageMorph.prototype.blockTemplates = function (
blocks.push(block('doSwitchToScene'));
blocks.push('-');
blocks.push(block('doDefineBlock'));
blocks.push(block('doDeleteBlock'));
blocks.push(block('doSetBlockAttribute'));
blocks.push(block('reportBlockAttribute'));
blocks.push(block('reportThisContext'));

Wyświetl plik

@ -6175,6 +6175,47 @@ Process.prototype.compileBlockReferences = function (context, varName) {
}
};
Process.prototype.doDeleteBlock = function (context) {
// highly experimental & under construction
var rcvr = this.blockReceiver(),
ide = rcvr.parentThatIsA(IDE_Morph),
stage = ide.stage,
expr, def, method, idx;
this.assertType(context, ['command', 'reporter', 'predicate']);
expr = context.expression;
if (!expr.isCustomBlock) {
throw new Error('expecting a custom block\nbut getting a primitive');
}
def = expr.isGlobal ? expr.definition : rcvr.getMethod(expr.semanticSpec);
rcvr.deleteAllBlockInstances(def);
if (def.isGlobal) {
idx = stage.globalBlocks.indexOf(def);
if (idx !== -1) {
stage.globalBlocks.splice(idx, 1);
}
} else {
// delete local definition
idx = rcvr.customBlocks.indexOf(def);
if (idx !== -1) {
rcvr.customBlocks.splice(idx, 1);
}
// refresh instances of inherited method, if any
method = rcvr.getMethod(def.blockSpec);
if (method) {
rcvr.allDependentInvocationsOf(method.blockSpec).forEach(
block => block.refresh(method)
);
}
}
// update the IDE
ide.flushPaletteCache();
ide.categories.refreshEmpty();
ide.refreshPalette();
ide.recordUnsavedChanges();
};
Process.prototype.reportAttributeOf = function (attribute, name) {
// hyper-dyadic
// note: specifying strings in the left input only accesses