This commit is contained in:
Mario Pesch 2021-10-14 13:38:48 +02:00
parent 1b4a4225de
commit 69f2277c6c
2 changed files with 689 additions and 672 deletions

View File

@ -1,11 +1,9 @@
import Blockly from 'blockly/core'; import Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
import * as Types from '../helpers/types'; import * as Types from "../helpers/types";
import { getCompatibleTypes } from '../helpers/types'; import { getCompatibleTypes } from "../helpers/types";
Blockly.Blocks["controls_if"] = {
Blockly.Blocks['controls_if'] = {
/** /**
* Block for if/elseif/else condition. * Block for if/elseif/else condition.
* @this Blockly.Block * @this Blockly.Block
@ -13,29 +11,18 @@ Blockly.Blocks['controls_if'] = {
init: function () { init: function () {
this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL); this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL);
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendValueInput('IF0') this.appendValueInput("IF0")
.setCheck(Types.getCompatibleTypes('boolean')) .setCheck(Types.getCompatibleTypes("boolean"))
.appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);
this.appendStatementInput('DO0') this.appendStatementInput("DO0").appendField(
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); Blockly.Msg.CONTROLS_IF_MSG_THEN
);
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setNextStatement(true); this.setNextStatement(true);
this.setMutator(new Blockly.Mutator(['controls_if_elseif', this.setMutator(
'controls_if_else'])); new Blockly.Mutator(["controls_if_elseif", "controls_if_else"])
// Assign 'this' to a variable for use in the tooltip closure below. );
var thisBlock = this; this.setTooltip(Blockly.Msg.CONTROLS_IF_TOOLTIP_1);
this.setTooltip(function () {
if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;
} else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;
} else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;
} else if (thisBlock.elseifCount_ && thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_4;
}
return '';
});
this.elseifCount_ = 0; this.elseifCount_ = 0;
this.elseCount_ = 0; this.elseCount_ = 0;
}, },
@ -48,12 +35,12 @@ Blockly.Blocks['controls_if'] = {
if (!this.elseifCount_ && !this.elseCount_) { if (!this.elseifCount_ && !this.elseCount_) {
return null; return null;
} }
var container = document.createElement('mutation'); var container = document.createElement("mutation");
if (this.elseifCount_) { if (this.elseifCount_) {
container.setAttribute('elseif', this.elseifCount_); container.setAttribute("elseif", this.elseifCount_);
} }
if (this.elseCount_) { if (this.elseCount_) {
container.setAttribute('else', 1); container.setAttribute("else", 1);
} }
return container; return container;
}, },
@ -63,8 +50,8 @@ Blockly.Blocks['controls_if'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
domToMutation: function (xmlElement) { domToMutation: function (xmlElement) {
this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; this.elseifCount_ = parseInt(xmlElement.getAttribute("elseif"), 10) || 0;
this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; this.elseCount_ = parseInt(xmlElement.getAttribute("else"), 10) || 0;
this.updateShape_(); this.updateShape_();
}, },
/** /**
@ -74,17 +61,17 @@ Blockly.Blocks['controls_if'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
decompose: function (workspace) { decompose: function (workspace) {
var containerBlock = workspace.newBlock('controls_if_if'); var containerBlock = workspace.newBlock("controls_if_if");
containerBlock.initSvg(); containerBlock.initSvg();
var connection = containerBlock.nextConnection; var connection = containerBlock.nextConnection;
for (var i = 1; i <= this.elseifCount_; i++) { for (var i = 1; i <= this.elseifCount_; i++) {
var elseifBlock = workspace.newBlock('controls_if_elseif'); var elseifBlock = workspace.newBlock("controls_if_elseif");
elseifBlock.initSvg(); elseifBlock.initSvg();
connection.connect(elseifBlock.previousConnection); connection.connect(elseifBlock.previousConnection);
connection = elseifBlock.nextConnection; connection = elseifBlock.nextConnection;
} }
if (this.elseCount_) { if (this.elseCount_) {
var elseBlock = workspace.newBlock('controls_if_else'); var elseBlock = workspace.newBlock("controls_if_else");
elseBlock.initSvg(); elseBlock.initSvg();
connection.connect(elseBlock.previousConnection); connection.connect(elseBlock.previousConnection);
} }
@ -105,28 +92,28 @@ Blockly.Blocks['controls_if'] = {
var elseStatementConnection = null; var elseStatementConnection = null;
while (clauseBlock) { while (clauseBlock) {
switch (clauseBlock.type) { switch (clauseBlock.type) {
case 'controls_if_elseif': case "controls_if_elseif":
this.elseifCount_++; this.elseifCount_++;
valueConnections.push(clauseBlock.valueConnection_); valueConnections.push(clauseBlock.valueConnection_);
statementConnections.push(clauseBlock.statementConnection_); statementConnections.push(clauseBlock.statementConnection_);
break; break;
case 'controls_if_else': case "controls_if_else":
this.elseCount_++; this.elseCount_++;
elseStatementConnection = clauseBlock.statementConnection_; elseStatementConnection = clauseBlock.statementConnection_;
break; break;
default: default:
throw new Error('Unknown block type.'); throw new Error("Unknown block type.");
} }
clauseBlock = clauseBlock.nextConnection && clauseBlock =
clauseBlock.nextConnection.targetBlock(); clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock();
} }
this.updateShape_(); this.updateShape_();
// Reconnect any child blocks. // Reconnect any child blocks.
for (var i = 1; i <= this.elseifCount_; i++) { for (var i = 1; i <= this.elseifCount_; i++) {
Blockly.Mutator.reconnect(valueConnections[i], this, 'IF' + i); Blockly.Mutator.reconnect(valueConnections[i], this, "IF" + i);
Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i); Blockly.Mutator.reconnect(statementConnections[i], this, "DO" + i);
} }
Blockly.Mutator.reconnect(elseStatementConnection, this, 'ELSE'); Blockly.Mutator.reconnect(elseStatementConnection, this, "ELSE");
}, },
/** /**
* Store pointers to any connected child blocks. * Store pointers to any connected child blocks.
@ -139,25 +126,25 @@ Blockly.Blocks['controls_if'] = {
var inputDo; var inputDo;
while (clauseBlock) { while (clauseBlock) {
switch (clauseBlock.type) { switch (clauseBlock.type) {
case 'controls_if_elseif': case "controls_if_elseif":
var inputIf = this.getInput('IF' + i); var inputIf = this.getInput("IF" + i);
inputDo = this.getInput('DO' + i); inputDo = this.getInput("DO" + i);
clauseBlock.valueConnection_ = clauseBlock.valueConnection_ =
inputIf && inputIf.connection.targetConnection; inputIf && inputIf.connection.targetConnection;
clauseBlock.statementConnection_ = clauseBlock.statementConnection_ =
inputDo && inputDo.connection.targetConnection; inputDo && inputDo.connection.targetConnection;
i++; i++;
break; break;
case 'controls_if_else': case "controls_if_else":
inputDo = this.getInput('ELSE'); inputDo = this.getInput("ELSE");
clauseBlock.statementConnection_ = clauseBlock.statementConnection_ =
inputDo && inputDo.connection.targetConnection; inputDo && inputDo.connection.targetConnection;
break; break;
default: default:
throw new Error('Unknown block type.'); throw new Error("Unknown block type.");
} }
clauseBlock = clauseBlock.nextConnection && clauseBlock =
clauseBlock.nextConnection.targetBlock(); clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock();
} }
}, },
/** /**
@ -167,290 +154,296 @@ Blockly.Blocks['controls_if'] = {
*/ */
updateShape_: function () { updateShape_: function () {
// Delete everything. // Delete everything.
if (this.getInput('ELSE')) { if (this.getInput("ELSE")) {
this.removeInput('ELSE'); this.removeInput("ELSE");
} }
var j = 1; var j = 1;
while (this.getInput('IF' + j)) { while (this.getInput("IF" + j)) {
this.removeInput('IF' + j); this.removeInput("IF" + j);
this.removeInput('DO' + j); this.removeInput("DO" + j);
j++; j++;
} }
// Rebuild block. // Rebuild block.
for (var i = 1; i <= this.elseifCount_; i++) { for (var i = 1; i <= this.elseifCount_; i++) {
this.appendValueInput('IF' + i) this.appendValueInput("IF" + i)
.setCheck(Types.getCompatibleTypes('boolean')) .setCheck(Types.getCompatibleTypes("boolean"))
.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF);
this.appendStatementInput('DO' + i) this.appendStatementInput("DO" + i).appendField(
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); Blockly.Msg.CONTROLS_IF_MSG_THEN
);
} }
if (this.elseCount_) { if (this.elseCount_) {
this.appendStatementInput('ELSE') this.appendStatementInput("ELSE").appendField(
.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); Blockly.Msg.CONTROLS_IF_MSG_ELSE
} );
} }
},
}; };
Blockly.Blocks['controls_if_if'] = { Blockly.Blocks["controls_if_if"] = {
/** /**
* Mutator block for if container. * Mutator block for if container.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF);
.appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF);
this.setNextStatement(true); this.setNextStatement(true);
this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP); this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP);
this.contextMenu = false; this.contextMenu = false;
} },
}; };
Blockly.Blocks['controls_if_elseif'] = { Blockly.Blocks["controls_if_elseif"] = {
/** /**
* Mutator bolck for else-if condition. * Mutator bolck for else-if condition.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF); Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF
);
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setNextStatement(true); this.setNextStatement(true);
this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP); this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP);
this.contextMenu = false; this.contextMenu = false;
} },
}; };
Blockly.Blocks['controls_if_else'] = { Blockly.Blocks["controls_if_else"] = {
/** /**
* Mutator block for else condition. * Mutator block for else condition.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendDummyInput() this.appendDummyInput().appendField(
.appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE); Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE
);
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP); this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP);
this.contextMenu = false; this.contextMenu = false;
} },
}; };
Blockly.defineBlocksWithJsonArray([
Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT // BEGIN JSON EXTRACT
// Block for boolean data type: true and false. // Block for boolean data type: true and false.
{ {
"type": "logic_boolean", type: "logic_boolean",
"message0": "%1", message0: "%1",
"args0": [ args0: [
{ {
"type": "field_dropdown", type: "field_dropdown",
"name": "BOOL", name: "BOOL",
"options": [ options: [
["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], ["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"],
["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"] ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"],
]
}
], ],
"output": Types.BOOLEAN.typeName, },
"style": "logic_blocks", ],
"tooltip": "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", output: Types.BOOLEAN.typeName,
"helpUrl": "%{BKY_LOGIC_BOOLEAN_HELPURL}" style: "logic_blocks",
tooltip: "%{BKY_LOGIC_BOOLEAN_TOOLTIP}",
helpUrl: "%{BKY_LOGIC_BOOLEAN_HELPURL}",
}, },
{ {
"type": "controls_ifelse", type: "controls_ifelse",
"message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", message0: "%{BKY_CONTROLS_IF_MSG_IF} %1",
"args0": [ args0: [
{ {
"type": "input_value", type: "input_value",
"name": "IF0", name: "IF0",
"check": Types.getCompatibleTypes('boolean') check: Types.getCompatibleTypes("boolean"),
} },
], ],
"message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", message1: "%{BKY_CONTROLS_IF_MSG_THEN} %1",
"args1": [ args1: [
{ {
"type": "input_statement", type: "input_statement",
"name": "DO0" name: "DO0",
} },
], ],
"message2": "%{BKY_CONTROLS_IF_MSG_ELSE} %1", message2: "%{BKY_CONTROLS_IF_MSG_ELSE} %1",
"args2": [ args2: [
{ {
"type": "input_statement", type: "input_statement",
"name": "ELSE" name: "ELSE",
} },
], ],
"previousStatement": null, previousStatement: null,
"nextStatement": null, nextStatement: null,
"style": "logic_blocks", style: "logic_blocks",
"tooltip": "%{BKYCONTROLS_IF_TOOLTIP_2}", tooltip: "%{BKYCONTROLS_IF_TOOLTIP_2}",
"helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", helpUrl: "%{BKY_CONTROLS_IF_HELPURL}",
"extensions": ["controls_if_tooltip"] extensions: ["controls_if_tooltip"],
}, },
// Block for comparison operator. // Block for comparison operator.
{ {
"type": "logic_compare", type: "logic_compare",
"message0": "%1 %2 %3", message0: "%1 %2 %3",
"args0": [ args0: [
{ {
"type": "input_value", type: "input_value",
"name": "A" name: "A",
}, },
{ {
"type": "field_dropdown", type: "field_dropdown",
"name": "OP", name: "OP",
"options": [ options: [
["=", "EQ"], ["=", "EQ"],
["\u2260", "NEQ"], ["\u2260", "NEQ"],
["\u200F<", "LT"], ["\u200F<", "LT"],
["\u200F\u2264", "LTE"], ["\u200F\u2264", "LTE"],
["\u200F>", "GT"], ["\u200F>", "GT"],
["\u200F\u2265", "GTE"] ["\u200F\u2265", "GTE"],
] ],
}, },
{ {
"type": "input_value", type: "input_value",
"name": "B" name: "B",
} },
], ],
"inputsInline": true, inputsInline: true,
"output": Types.BOOLEAN.typeName, output: Types.BOOLEAN.typeName,
"style": "logic_blocks", style: "logic_blocks",
"helpUrl": "%{BKY_LOGIC_COMPARE_HELPURL}", helpUrl: "%{BKY_LOGIC_COMPARE_HELPURL}",
"extensions": ["logic_compare", "logic_op_tooltip"] extensions: ["logic_compare", "logic_op_tooltip"],
}, },
// Block for logical operations: 'and', 'or'. // Block for logical operations: 'and', 'or'.
{ {
"type": "logic_operation", type: "logic_operation",
"message0": "%1 %2 %3", message0: "%1 %2 %3",
"args0": [ args0: [
{ {
"type": "input_value", type: "input_value",
"name": "A", name: "A",
"check": Types.getCompatibleTypes('boolean') check: Types.getCompatibleTypes("boolean"),
}, },
{ {
"type": "field_dropdown", type: "field_dropdown",
"name": "OP", name: "OP",
"options": [ options: [
["%{BKY_LOGIC_OPERATION_AND}", "AND"], ["%{BKY_LOGIC_OPERATION_AND}", "AND"],
["%{BKY_LOGIC_OPERATION_OR}", "OR"] ["%{BKY_LOGIC_OPERATION_OR}", "OR"],
] ],
}, },
{ {
"type": "input_value", type: "input_value",
"name": "B", name: "B",
"check": Types.getCompatibleTypes('boolean') check: Types.getCompatibleTypes("boolean"),
} },
], ],
"inputsInline": true, inputsInline: true,
"output": Types.BOOLEAN.typeName, output: Types.BOOLEAN.typeName,
"style": "logic_blocks", style: "logic_blocks",
"helpUrl": "%{BKY_LOGIC_OPERATION_HELPURL}", helpUrl: "%{BKY_LOGIC_OPERATION_HELPURL}",
"extensions": ["logic_op_tooltip"] extensions: ["logic_op_tooltip"],
}, },
// Block for negation. // Block for negation.
{ {
"type": "logic_negate", type: "logic_negate",
"message0": "%{BKY_LOGIC_NEGATE_TITLE}", message0: "%{BKY_LOGIC_NEGATE_TITLE}",
"args0": [ args0: [
{ {
"type": "input_value", type: "input_value",
"name": "BOOL", name: "BOOL",
"check": Types.getCompatibleTypes('boolean'), check: Types.getCompatibleTypes("boolean"),
} },
], ],
"output": Types.BOOLEAN.typeName, output: Types.BOOLEAN.typeName,
"style": "logic_blocks", style: "logic_blocks",
"tooltip": "%{BKY_LOGIC_NEGATE_TOOLTIP}", tooltip: "%{BKY_LOGIC_NEGATE_TOOLTIP}",
"helpUrl": "%{BKY_LOGIC_NEGATE_HELPURL}" helpUrl: "%{BKY_LOGIC_NEGATE_HELPURL}",
}, },
// Block for null data type. // Block for null data type.
{ {
"type": "logic_null", type: "logic_null",
"message0": "%{BKY_LOGIC_NULL}", message0: "%{BKY_LOGIC_NULL}",
"output": null, output: null,
"style": "logic_blocks", style: "logic_blocks",
"tooltip": "%{BKY_LOGIC_NULL_TOOLTIP}", tooltip: "%{BKY_LOGIC_NULL_TOOLTIP}",
"helpUrl": "%{BKY_LOGIC_NULL_HELPURL}" helpUrl: "%{BKY_LOGIC_NULL_HELPURL}",
}, },
// Block for ternary operator. // Block for ternary operator.
{ {
"type": "logic_ternary", type: "logic_ternary",
"message0": "%{BKY_LOGIC_TERNARY_CONDITION} %1", message0: "%{BKY_LOGIC_TERNARY_CONDITION} %1",
"args0": [ args0: [
{ {
"type": "input_value", type: "input_value",
"name": "IF", name: "IF",
"check": Types.getCompatibleTypes('boolean'), check: Types.getCompatibleTypes("boolean"),
} },
], ],
"message1": "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", message1: "%{BKY_LOGIC_TERNARY_IF_TRUE} %1",
"args1": [ args1: [
{ {
"type": "input_value", type: "input_value",
"name": "THEN", name: "THEN",
"check": Types.getCompatibleTypes('boolean'), check: Types.getCompatibleTypes("boolean"),
} },
], ],
"message2": "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", message2: "%{BKY_LOGIC_TERNARY_IF_FALSE} %1",
"args2": [ args2: [
{ {
"type": "input_value", type: "input_value",
"name": "ELSE", name: "ELSE",
"check": Types.getCompatibleTypes('boolean'), check: Types.getCompatibleTypes("boolean"),
} },
], ],
"output": null, output: null,
"style": "logic_blocks", style: "logic_blocks",
"tooltip": "%{BKY_LOGIC_TERNARY_TOOLTIP}", tooltip: "%{BKY_LOGIC_TERNARY_TOOLTIP}",
"helpUrl": "%{BKY_LOGIC_TERNARY_HELPURL}", helpUrl: "%{BKY_LOGIC_TERNARY_HELPURL}",
"extensions": ["logic_ternary"] extensions: ["logic_ternary"],
} },
]); // END JSON EXTRACT (Do not delete this comment.) ]); // END JSON EXTRACT (Do not delete this comment.)
Blockly.Blocks["logic_compare"] = {
Blockly.Blocks['logic_compare'] = {
/** /**
* Block for comparison operator. * Block for comparison operator.
* @this Blockly.Block * @this Blockly.Block
*/ */
init: function () { init: function () {
var OPERATORS = this.RTL ? [ var OPERATORS = this.RTL
['=', 'EQ'], ? [
['\u2260', 'NEQ'], ["=", "EQ"],
['>', 'LT'], ["\u2260", "NEQ"],
['\u2265', 'LTE'], [">", "LT"],
['<', 'GT'], ["\u2265", "LTE"],
['\u2264', 'GTE'] ["<", "GT"],
] : [ ["\u2264", "GTE"],
['=', 'EQ'], ]
['\u2260', 'NEQ'], : [
['<', 'LT'], ["=", "EQ"],
['\u2264', 'LTE'], ["\u2260", "NEQ"],
['>', 'GT'], ["<", "LT"],
['\u2265', 'GTE'] ["\u2264", "LTE"],
[">", "GT"],
["\u2265", "GTE"],
]; ];
this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.setOutput(true, Types.BOOLEAN.typeName); this.setOutput(true, Types.BOOLEAN.typeName);
this.appendValueInput('A'); this.appendValueInput("A");
this.appendValueInput('B') this.appendValueInput("B").appendField(
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); new Blockly.FieldDropdown(OPERATORS),
"OP"
);
this.setInputsInline(true); this.setInputsInline(true);
// Assign 'this' to a variable for use in the tooltip closure below. // Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this; var thisBlock = this;
this.setTooltip(function () { this.setTooltip(function () {
var op = thisBlock.getFieldValue('OP'); var op = thisBlock.getFieldValue("OP");
var TOOLTIPS = { var TOOLTIPS = {
'EQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ, EQ: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,
'NEQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ, NEQ: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,
'LT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT, LT: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,
'LTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE, LTE: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,
'GT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT, GT: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,
'GTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE GTE: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE,
}; };
return TOOLTIPS[op]; return TOOLTIPS[op];
}); });
@ -462,37 +455,43 @@ Blockly.Blocks['logic_compare'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
onchange: function (e) { onchange: function (e) {
var blockA = this.getInputTargetBlock('A'); var blockA = this.getInputTargetBlock("A");
var blockB = this.getInputTargetBlock('B'); var blockB = this.getInputTargetBlock("B");
if (blockA === null && blockB === null) { if (blockA === null && blockB === null) {
this.getInput('A').setCheck(null); this.getInput("A").setCheck(null);
this.getInput('B').setCheck(null); this.getInput("B").setCheck(null);
} }
if (blockA !== null && blockB === null) { if (blockA !== null && blockB === null) {
this.getInput('A').setCheck(getCompatibleTypes(blockA.outputConnection.check_[0])); this.getInput("A").setCheck(
this.getInput('B').setCheck(getCompatibleTypes(blockA.outputConnection.check_[0])); getCompatibleTypes(blockA.outputConnection.check_[0])
);
this.getInput("B").setCheck(
getCompatibleTypes(blockA.outputConnection.check_[0])
);
} }
if (blockB !== null && blockA === null) { if (blockB !== null && blockA === null) {
this.getInput('B').setCheck(getCompatibleTypes(blockB.outputConnection.check_[0])); this.getInput("B").setCheck(
this.getInput('A').setCheck(getCompatibleTypes(blockB.outputConnection.check_[0])); getCompatibleTypes(blockB.outputConnection.check_[0])
} );
this.getInput("A").setCheck(
getCompatibleTypes(blockB.outputConnection.check_[0])
);
} }
},
}; };
Blockly.Blocks["switch_case"] = {
Blockly.Blocks['switch_case'] = {
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setTooltip(Blockly.Msg.cases_tooltip); this.setTooltip(Blockly.Msg.cases_tooltip);
this.setNextStatement(true); this.setNextStatement(true);
this.appendValueInput('CONDITION') this.appendValueInput("CONDITION").appendField(Blockly.Msg.cases_switch);
.appendField(Blockly.Msg.cases_switch); this.appendValueInput("CASECONDITION0").appendField(
this.appendValueInput('CASECONDITION0') Blockly.Msg.cases_condition
.appendField(Blockly.Msg.cases_condition); );
this.appendStatementInput('CASE0') this.appendStatementInput("CASE0").appendField(Blockly.Msg.cases_do);
.appendField(Blockly.Msg.cases_do); this.setMutator(new Blockly.Mutator(["case_incaseof", "case_default"]));
this.setMutator(new Blockly.Mutator(['case_incaseof', 'case_default']));
this.caseCount_ = 0; this.caseCount_ = 0;
this.defaultCount_ = 0; this.defaultCount_ = 0;
}, },
@ -501,43 +500,42 @@ Blockly.Blocks['switch_case'] = {
if (!this.caseCount_ && !this.defaultCount_) { if (!this.caseCount_ && !this.defaultCount_) {
return null; return null;
} }
var container = document.createElement('mutation'); var container = document.createElement("mutation");
if (this.caseCount_) { if (this.caseCount_) {
container.setAttribute('case', this.caseCount_); container.setAttribute("case", this.caseCount_);
} }
if (this.defaultCount_) { if (this.defaultCount_) {
container.setAttribute('default', 1); container.setAttribute("default", 1);
} }
return container; return container;
}, },
domToMutation: function (xmlElement) { domToMutation: function (xmlElement) {
this.caseCount_ = parseInt(xmlElement.getAttribute('case'), 10); this.caseCount_ = parseInt(xmlElement.getAttribute("case"), 10);
this.defaultCount_ = parseInt(xmlElement.getAttribute('default'), 10); this.defaultCount_ = parseInt(xmlElement.getAttribute("default"), 10);
for (var x = 0; x <= this.caseCount_; x++) { for (var x = 0; x <= this.caseCount_; x++) {
this.appendValueInput('CASECONDITION' + x) this.appendValueInput("CASECONDITION" + x).appendField(
.appendField(Blockly.Msg.cases_condition); Blockly.Msg.cases_condition
this.appendStatementInput('CASE' + x) );
.appendField(Blockly.Msg.cases_do); this.appendStatementInput("CASE" + x).appendField(Blockly.Msg.cases_do);
} }
if (this.defaultCount_) { if (this.defaultCount_) {
this.appendStatementInput('ONDEFAULT') this.appendStatementInput("ONDEFAULT").appendField("default");
.appendField('default');
} }
}, },
decompose: function (workspace) { decompose: function (workspace) {
var containerBlock = workspace.newBlock('control_case'); var containerBlock = workspace.newBlock("control_case");
containerBlock.initSvg(); containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection; var connection = containerBlock.getInput("STACK").connection;
for (var x = 1; x <= this.caseCount_; x++) { for (var x = 1; x <= this.caseCount_; x++) {
var caseBlock = workspace.newBlock('case_incaseof'); var caseBlock = workspace.newBlock("case_incaseof");
caseBlock.initSvg(); caseBlock.initSvg();
connection.connect(caseBlock.previousConnection); connection.connect(caseBlock.previousConnection);
connection = caseBlock.nextConnection; connection = caseBlock.nextConnection;
} }
if (this.defaultCount_) { if (this.defaultCount_) {
var defaultBlock = Blockly.Block.obtain(workspace, 'case_default'); var defaultBlock = Blockly.Block.obtain(workspace, "case_default");
defaultBlock.initSvg(); defaultBlock.initSvg();
connection.connect(defaultBlock.previousConnection); connection.connect(defaultBlock.previousConnection);
} }
@ -547,23 +545,25 @@ Blockly.Blocks['switch_case'] = {
compose: function (containerBlock) { compose: function (containerBlock) {
//Disconnect all input blocks and remove all inputs. //Disconnect all input blocks and remove all inputs.
if (this.defaultCount_) { if (this.defaultCount_) {
this.removeInput('ONDEFAULT'); this.removeInput("ONDEFAULT");
} }
this.defaultCount_ = 0; this.defaultCount_ = 0;
for (var x = this.caseCount_; x > 0; x--) { for (var x = this.caseCount_; x > 0; x--) {
this.removeInput('CASECONDITION' + x); this.removeInput("CASECONDITION" + x);
this.removeInput('CASE' + x); this.removeInput("CASE" + x);
} }
this.caseCount_ = 0; this.caseCount_ = 0;
var caseBlock = containerBlock.getInputTargetBlock('STACK'); var caseBlock = containerBlock.getInputTargetBlock("STACK");
while (caseBlock) { while (caseBlock) {
switch (caseBlock.type) { switch (caseBlock.type) {
case 'case_incaseof': case "case_incaseof":
this.caseCount_++; this.caseCount_++;
var caseconditionInput = this.appendValueInput('CASECONDITION' + this.caseCount_) var caseconditionInput = this.appendValueInput(
.appendField(Blockly.Msg.cases_condition); "CASECONDITION" + this.caseCount_
var caseInput = this.appendStatementInput('CASE' + this.caseCount_) ).appendField(Blockly.Msg.cases_condition);
.appendField(Blockly.Msg.cases_do); var caseInput = this.appendStatementInput(
"CASE" + this.caseCount_
).appendField(Blockly.Msg.cases_do);
if (caseBlock.valueConnection_) { if (caseBlock.valueConnection_) {
caseconditionInput.connection.connect(caseBlock.valueConnection_); caseconditionInput.connection.connect(caseBlock.valueConnection_);
} }
@ -571,78 +571,81 @@ Blockly.Blocks['switch_case'] = {
caseInput.connection.connect(caseBlock.statementConnection_); caseInput.connection.connect(caseBlock.statementConnection_);
} }
break; break;
case 'case_default': case "case_default":
this.defaultCount_++; this.defaultCount_++;
var defaultInput = this.appendStatementInput('ONDEFAULT') var defaultInput =
.appendField('default'); this.appendStatementInput("ONDEFAULT").appendField("default");
if (caseBlock.statementConnection_) { if (caseBlock.statementConnection_) {
defaultInput.connection.connect(caseBlock.statementConnection_); defaultInput.connection.connect(caseBlock.statementConnection_);
} }
break; break;
default: default:
throw new Error('Unknown block type.'); throw new Error("Unknown block type.");
} }
caseBlock = caseBlock.nextConnection && caseBlock =
caseBlock.nextConnection.targetBlock(); caseBlock.nextConnection && caseBlock.nextConnection.targetBlock();
} }
}, },
saveConnections: function (containerBlock) { saveConnections: function (containerBlock) {
var caseBlock = containerBlock.getInputTargetBlock('STACK'); var caseBlock = containerBlock.getInputTargetBlock("STACK");
var x = 1; var x = 1;
while (caseBlock) { while (caseBlock) {
switch (caseBlock.type) { switch (caseBlock.type) {
case 'case_incaseof': case "case_incaseof":
var caseconditionInput = this.getInput('CASECONDITION' + x); var caseconditionInput = this.getInput("CASECONDITION" + x);
var caseInput = this.getInput('CASE' + x); var caseInput = this.getInput("CASE" + x);
caseBlock.valueConnection_ = caseconditionInput && caseconditionInput.connection.targetConnection; caseBlock.valueConnection_ =
caseBlock.statementConnection_ = caseInput && caseInput.connection.targetConnection; caseconditionInput &&
caseconditionInput.connection.targetConnection;
caseBlock.statementConnection_ =
caseInput && caseInput.connection.targetConnection;
x++; x++;
break; break;
case 'case_default': case "case_default":
var defaultInput = this.getInput('ONDEFAULT'); var defaultInput = this.getInput("ONDEFAULT");
caseBlock.satementConnection_ = defaultInput && defaultInput.connection.targetConnection; caseBlock.satementConnection_ =
defaultInput && defaultInput.connection.targetConnection;
break; break;
default: default:
throw new Error('Unknown block type'); throw new Error("Unknown block type");
}
caseBlock = caseBlock.nextConnection &&
caseBlock.nextConnection.targetBlock();
} }
caseBlock =
caseBlock.nextConnection && caseBlock.nextConnection.targetBlock();
} }
},
}; };
Blockly.Blocks['control_case'] = { Blockly.Blocks["control_case"] = {
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.cases_switch);
.appendField(Blockly.Msg.cases_switch); this.appendStatementInput("STACK");
this.appendStatementInput('STACK'); this.setTooltip("--Placeholder--");
this.setTooltip('--Placeholder--');
this.contextMenu = false; this.contextMenu = false;
} },
}; };
Blockly.Blocks['case_incaseof'] = { Blockly.Blocks["case_incaseof"] = {
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.cases_add);
.appendField(Blockly.Msg.cases_add);
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setNextStatement(true); this.setNextStatement(true);
this.setTooltip('--Placeholder--'); this.setTooltip("--Placeholder--");
this.contextMenu = false; this.contextMenu = false;
} },
}; };
Blockly.Blocks['case_default'] = { Blockly.Blocks["case_default"] = {
init: function () { init: function () {
this.setColour(getColour().logic); this.setColour(getColour().logic);
this.appendValueInput('default') this.appendValueInput("default").appendField("default");
.appendField('default');
this.setPreviousStatement(true); this.setPreviousStatement(true);
this.setNextStatement(false); this.setNextStatement(false);
this.setTooltip('This function will run if there aren\'t any matching cases.'); this.setTooltip(
"This function will run if there aren't any matching cases."
);
this.contextMenu = false; this.contextMenu = false;
} },
}; };

View File

@ -1,43 +1,56 @@
export const LOGIC = { export const LOGIC = {
CONTROLS_IF_ELSEIF_TOOLTIP: "Eine weitere Bedingung hinzufügen.", CONTROLS_IF_ELSEIF_TOOLTIP: "Eine weitere Bedingung hinzufügen.",
CONTROLS_IF_ELSE_TOOLTIP: "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.", CONTROLS_IF_ELSE_TOOLTIP:
"Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft.",
CONTROLS_IF_HELPURL: "https://github.com/google/blockly/wiki/IfElse", // untranslated CONTROLS_IF_HELPURL: "https://github.com/google/blockly/wiki/IfElse", // untranslated
CONTROLS_IF_IF_TOOLTIP: "Hinzufügen, entfernen oder sortieren von Sektionen", CONTROLS_IF_IF_TOOLTIP: "Hinzufügen, entfernen oder sortieren von Sektionen",
CONTROLS_IF_MSG_ELSE: "sonst", CONTROLS_IF_MSG_ELSE: "sonst",
CONTROLS_IF_MSG_ELSEIF: "sonst wenn", CONTROLS_IF_MSG_ELSEIF: "sonst wenn",
CONTROLS_IF_MSG_IF: "wenn", CONTROLS_IF_MSG_IF: "wenn",
CONTROLS_IF_TOOLTIP_1: "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.", CONTROLS_IF_TOOLTIP_1:
CONTROLS_IF_TOOLTIP_2: "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.", "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.",
CONTROLS_IF_TOOLTIP_3: "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.", CONTROLS_IF_TOOLTIP_2:
CONTROLS_IF_TOOLTIP_4: "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.", "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.",
CONTROLS_IF_TOOLTIP_3:
"Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.",
CONTROLS_IF_TOOLTIP_4:
"Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.",
LOGIC_BOOLEAN_HELPURL: "https://github.com/google/blockly/wiki/Logic#values", // untranslated LOGIC_BOOLEAN_HELPURL: "https://github.com/google/blockly/wiki/Logic#values", // untranslated
LOGIC_BOOLEAN_TOOLTIP: "Ist entweder wahr (true) oder falsch (false)", LOGIC_BOOLEAN_TOOLTIP: "Ist entweder wahr (true) oder falsch (false)",
LOGIC_BOOLEAN_TRUE: "wahr", LOGIC_BOOLEAN_TRUE: "wahr",
LOGIC_COMPARE_HELPURL: "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29", LOGIC_COMPARE_HELPURL: "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29",
LOGIC_COMPARE_TOOLTIP_EQ: "Ist wahr (true), wenn beide Werte gleich sind.", LOGIC_COMPARE_TOOLTIP_EQ: "Ist wahr (true), wenn beide Werte gleich sind.",
LOGIC_COMPARE_TOOLTIP_GT: "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.", LOGIC_COMPARE_TOOLTIP_GT:
LOGIC_COMPARE_TOOLTIP_GTE: "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.", "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LT: "Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.", LOGIC_COMPARE_TOOLTIP_GTE:
LOGIC_COMPARE_TOOLTIP_LTE: "Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.", "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_NEQ: "Ist wahr (true), wenn beide Werte unterschiedlich sind.", LOGIC_COMPARE_TOOLTIP_LT:
"Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_LTE:
"Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.",
LOGIC_COMPARE_TOOLTIP_NEQ:
"Ist wahr (true), wenn beide Werte unterschiedlich sind.",
LOGIC_NEGATE_HELPURL: "https://github.com/google/blockly/wiki/Logic#not", // untranslated LOGIC_NEGATE_HELPURL: "https://github.com/google/blockly/wiki/Logic#not", // untranslated
LOGIC_NEGATE_TITLE: "nicht %1", LOGIC_NEGATE_TITLE: "nicht %1",
LOGIC_NEGATE_TOOLTIP: "Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.", LOGIC_NEGATE_TOOLTIP:
"Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist.",
LOGIC_NULL: "null", LOGIC_NULL: "null",
LOGIC_NULL_HELPURL: "https://de.wikipedia.org/wiki/Nullwert", LOGIC_NULL_HELPURL: "https://de.wikipedia.org/wiki/Nullwert",
LOGIC_NULL_TOOLTIP: "Ist NULL.", LOGIC_NULL_TOOLTIP: "Ist NULL.",
LOGIC_OPERATION_AND: "und", LOGIC_OPERATION_AND: "und",
LOGIC_OPERATION_HELPURL: "https://github.com/google/blockly/wiki/Logic#logical-operations", // untranslated LOGIC_OPERATION_HELPURL:
"https://github.com/google/blockly/wiki/Logic#logical-operations", // untranslated
LOGIC_OPERATION_OR: "oder", LOGIC_OPERATION_OR: "oder",
LOGIC_OPERATION_TOOLTIP_AND: "Ist wahr (true), wenn beide Werte wahr (true) sind.", LOGIC_OPERATION_TOOLTIP_AND:
LOGIC_OPERATION_TOOLTIP_OR: "Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.", "Ist wahr (true), wenn beide Werte wahr (true) sind.",
LOGIC_OPERATION_TOOLTIP_OR:
"Ist wahr (true), wenn einer der beiden Werte wahr (true) ist.",
LOGIC_TERNARY_CONDITION: "teste", LOGIC_TERNARY_CONDITION: "teste",
LOGIC_TERNARY_HELPURL: "https://de.wikipedia.org/wiki/%3F:#Auswahloperator", LOGIC_TERNARY_HELPURL: "https://de.wikipedia.org/wiki/%3F:#Auswahloperator",
LOGIC_TERNARY_IF_FALSE: "wenn falsch", LOGIC_TERNARY_IF_FALSE: "wenn falsch",
LOGIC_TERNARY_IF_TRUE: "wenn wahr", LOGIC_TERNARY_IF_TRUE: "wenn wahr",
LOGIC_TERNARY_TOOLTIP: "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist, wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert", LOGIC_TERNARY_TOOLTIP:
'Überprüft eine Bedingung "teste". Wenn die Bedingung wahr ist, wird der "wenn wahr" Wert zurückgegeben, andernfalls der "wenn falsch" Wert',
/** /**
* Cases * Cases
@ -46,5 +59,6 @@ export const LOGIC = {
cases_condition: "Fall (Variable): ", cases_condition: "Fall (Variable): ",
cases_switch: "Variable", cases_switch: "Variable",
cases_add: "Fall", cases_add: "Fall",
cases_tooltip: "Führt den entsprechenden Fall aus, wenn die Überprüfung der Variable TRUE ergibt. Über das Zahnrad kannst du weitere Fälle hinzufügen. Über den 'Default' fall kannst du bestimmen, was passieren soll wenn keiner der vorher definierten Fälle eingetreten ist.", cases_tooltip:
} "Führt den entsprechenden Fall aus, wenn die Überprüfung der Variable TRUE ergibt. Über das Zahnrad kannst du weitere Fälle hinzufügen. Über den 'Default' fall kannst du bestimmen, was passieren soll wenn keiner der vorher definierten Fälle eingetreten ist.",
};