mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Adding controls_ifelse block (#722)
Adding controls_ifelse, an if/else block that is loaded from JSON and does not use mutators. This gives "else" capability to Android & iOS implementations, which don't support JavaScript mutators. Added this block to the playground simple toolbox and all generators.
This commit is contained in:
parent
0156f2e103
commit
72ff6d9ead
8 changed files with 115 additions and 63 deletions
|
@ -265,6 +265,42 @@ Blockly.Blocks['controls_if_else'] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.Blocks['controls_ifelse'] = {
|
||||||
|
/**
|
||||||
|
* If/else block that does not use a mutator.
|
||||||
|
*/
|
||||||
|
init: function() {
|
||||||
|
this.jsonInit({
|
||||||
|
"message0": Blockly.Msg.CONTROLS_IFELSE_TITLE,
|
||||||
|
"args0": [
|
||||||
|
{
|
||||||
|
"type": "input_value",
|
||||||
|
"name": "IF0",
|
||||||
|
"check": "Boolean",
|
||||||
|
"align": "RIGHT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input_statement",
|
||||||
|
"name": "DO0",
|
||||||
|
"check": "Boolean",
|
||||||
|
"align": "RIGHT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input_statement",
|
||||||
|
"name": "ELSE",
|
||||||
|
"check": "Boolean",
|
||||||
|
"align": "RIGHT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"previousStatement": null,
|
||||||
|
"nextStatement": null,
|
||||||
|
"colour": Blockly.Blocks.logic.HUE,
|
||||||
|
"tooltip": Blockly.Msg.CONTROLS_IF_TOOLTIP_2,
|
||||||
|
"helpUrl": Blockly.Msg.CONTROLS_IF_HELPURL
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Blockly.Blocks['logic_compare'] = {
|
Blockly.Blocks['logic_compare'] = {
|
||||||
/**
|
/**
|
||||||
* Block for comparison operator.
|
* Block for comparison operator.
|
||||||
|
|
|
@ -32,23 +32,26 @@ goog.require('Blockly.Dart');
|
||||||
Blockly.Dart['controls_if'] = function(block) {
|
Blockly.Dart['controls_if'] = function(block) {
|
||||||
// If/elseif/else condition.
|
// If/elseif/else condition.
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.Dart.valueToCode(block, 'IF' + n,
|
var code = '', branchCode, conditionCode;
|
||||||
|
do {
|
||||||
|
conditionCode = Blockly.Dart.valueToCode(block, 'IF' + n,
|
||||||
Blockly.Dart.ORDER_NONE) || 'false';
|
Blockly.Dart.ORDER_NONE) || 'false';
|
||||||
var branch = Blockly.Dart.statementToCode(block, 'DO' + n);
|
branchCode = Blockly.Dart.statementToCode(block, 'DO' + n);
|
||||||
var code = 'if (' + argument + ') {\n' + branch + '}';
|
code += (n > 0 ? 'else ' : '') +
|
||||||
for (n = 1; n <= block.elseifCount_; n++) {
|
'if (' + conditionCode + ') {\n' + branchCode + '}';
|
||||||
argument = Blockly.Dart.valueToCode(block, 'IF' + n,
|
|
||||||
Blockly.Dart.ORDER_NONE) || 'false';
|
++n;
|
||||||
branch = Blockly.Dart.statementToCode(block, 'DO' + n);
|
} while (block.getInput('IF' + n));
|
||||||
code += ' else if (' + argument + ') {\n' + branch + '}';
|
|
||||||
}
|
if (block.getInput('ELSE')) {
|
||||||
if (block.elseCount_) {
|
branchCode = Blockly.Dart.statementToCode(block, 'ELSE');
|
||||||
branch = Blockly.Dart.statementToCode(block, 'ELSE');
|
code += ' else {\n' + branchCode + '}';
|
||||||
code += ' else {\n' + branch + '}';
|
|
||||||
}
|
}
|
||||||
return code + '\n';
|
return code + '\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.Dart['controls_ifelse'] = Blockly.Dart['controls_if'];
|
||||||
|
|
||||||
Blockly.Dart['logic_compare'] = function(block) {
|
Blockly.Dart['logic_compare'] = function(block) {
|
||||||
// Comparison operator.
|
// Comparison operator.
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
|
|
|
@ -32,23 +32,26 @@ goog.require('Blockly.JavaScript');
|
||||||
Blockly.JavaScript['controls_if'] = function(block) {
|
Blockly.JavaScript['controls_if'] = function(block) {
|
||||||
// If/elseif/else condition.
|
// If/elseif/else condition.
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.JavaScript.valueToCode(block, 'IF' + n,
|
var code = '', branchCode, conditionCode;
|
||||||
|
do {
|
||||||
|
conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n,
|
||||||
Blockly.JavaScript.ORDER_NONE) || 'false';
|
Blockly.JavaScript.ORDER_NONE) || 'false';
|
||||||
var branch = Blockly.JavaScript.statementToCode(block, 'DO' + n);
|
branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
|
||||||
var code = 'if (' + argument + ') {\n' + branch + '}';
|
code += (n > 0 ? ' else ' : '') +
|
||||||
for (n = 1; n <= block.elseifCount_; n++) {
|
'if (' + conditionCode + ') {\n' + branchCode + '}';
|
||||||
argument = Blockly.JavaScript.valueToCode(block, 'IF' + n,
|
|
||||||
Blockly.JavaScript.ORDER_NONE) || 'false';
|
++n;
|
||||||
branch = Blockly.JavaScript.statementToCode(block, 'DO' + n);
|
} while (block.getInput('IF' + n));
|
||||||
code += ' else if (' + argument + ') {\n' + branch + '}';
|
|
||||||
}
|
if (block.getInput('ELSE')) {
|
||||||
if (block.elseCount_) {
|
branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE');
|
||||||
branch = Blockly.JavaScript.statementToCode(block, 'ELSE');
|
code += ' else {\n' + branchCode + '}';
|
||||||
code += ' else {\n' + branch + '}';
|
|
||||||
}
|
}
|
||||||
return code + '\n';
|
return code + '\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.JavaScript['controls_ifelse'] = Blockly.JavaScript['controls_if'];
|
||||||
|
|
||||||
Blockly.JavaScript['logic_compare'] = function(block) {
|
Blockly.JavaScript['logic_compare'] = function(block) {
|
||||||
// Comparison operator.
|
// Comparison operator.
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
|
|
|
@ -32,23 +32,26 @@ goog.require('Blockly.Lua');
|
||||||
Blockly.Lua['controls_if'] = function(block) {
|
Blockly.Lua['controls_if'] = function(block) {
|
||||||
// If/elseif/else condition.
|
// If/elseif/else condition.
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.Lua.valueToCode(block, 'IF' + n,
|
var code = '', branchCode, conditionCode;
|
||||||
|
do {
|
||||||
|
conditionCode = Blockly.Lua.valueToCode(block, 'IF' + n,
|
||||||
Blockly.Lua.ORDER_NONE) || 'false';
|
Blockly.Lua.ORDER_NONE) || 'false';
|
||||||
var branch = Blockly.Lua.statementToCode(block, 'DO' + n);
|
branchCode = Blockly.Lua.statementToCode(block, 'DO' + n);
|
||||||
var code = 'if ' + argument + ' then\n' + branch;
|
code += (n > 0 ? 'else' : '') +
|
||||||
for (n = 1; n <= block.elseifCount_; n++) {
|
'if ' + conditionCode + ' then\n' + branchCode;
|
||||||
argument = Blockly.Lua.valueToCode(block, 'IF' + n,
|
|
||||||
Blockly.Lua.ORDER_NONE) || 'false';
|
++n;
|
||||||
branch = Blockly.Lua.statementToCode(block, 'DO' + n);
|
} while (block.getInput('IF' + n));
|
||||||
code += ' elseif ' + argument + ' then\n' + branch;
|
|
||||||
}
|
if (block.getInput('ELSE')) {
|
||||||
if (block.elseCount_) {
|
branchCode = Blockly.Lua.statementToCode(block, 'ELSE');
|
||||||
branch = Blockly.Lua.statementToCode(block, 'ELSE');
|
code += 'else\n' + branchCode;
|
||||||
code += ' else\n' + branch;
|
|
||||||
}
|
}
|
||||||
return code + 'end\n';
|
return code + 'end\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.Lua['controls_ifelse'] = Blockly.Lua['controls_if'];
|
||||||
|
|
||||||
Blockly.Lua['logic_compare'] = function(block) {
|
Blockly.Lua['logic_compare'] = function(block) {
|
||||||
// Comparison operator.
|
// Comparison operator.
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
|
|
|
@ -32,23 +32,26 @@ goog.require('Blockly.PHP');
|
||||||
Blockly.PHP['controls_if'] = function(block) {
|
Blockly.PHP['controls_if'] = function(block) {
|
||||||
// If/elseif/else condition.
|
// If/elseif/else condition.
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.PHP.valueToCode(block, 'IF' + n,
|
var code = '', branchCode, conditionCode;
|
||||||
|
do {
|
||||||
|
conditionCode = Blockly.PHP.valueToCode(block, 'IF' + n,
|
||||||
Blockly.PHP.ORDER_NONE) || 'false';
|
Blockly.PHP.ORDER_NONE) || 'false';
|
||||||
var branch = Blockly.PHP.statementToCode(block, 'DO' + n);
|
branchCode = Blockly.PHP.statementToCode(block, 'DO' + n);
|
||||||
var code = 'if (' + argument + ') {\n' + branch + '}';
|
code += (n > 0 ? ' else ' : '') +
|
||||||
for (n = 1; n <= block.elseifCount_; n++) {
|
'if (' + conditionCode + ') {\n' + branchCode + '}';
|
||||||
argument = Blockly.PHP.valueToCode(block, 'IF' + n,
|
|
||||||
Blockly.PHP.ORDER_NONE) || 'false';
|
++n;
|
||||||
branch = Blockly.PHP.statementToCode(block, 'DO' + n);
|
} while (block.getInput('IF' + n));
|
||||||
code += ' else if (' + argument + ') {\n' + branch + '}';
|
|
||||||
}
|
if (block.getInput('ELSE')) {
|
||||||
if (block.elseCount_) {
|
branchCode = Blockly.PHP.statementToCode(block, 'ELSE');
|
||||||
branch = Blockly.PHP.statementToCode(block, 'ELSE');
|
code += ' else {\n' + branchCode + '}';
|
||||||
code += ' else {\n' + branch + '}';
|
|
||||||
}
|
}
|
||||||
return code + '\n';
|
return code + '\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.PHP['controls_ifelse'] = Blockly.PHP['controls_if'];
|
||||||
|
|
||||||
Blockly.PHP['logic_compare'] = function(block) {
|
Blockly.PHP['logic_compare'] = function(block) {
|
||||||
// Comparison operator.
|
// Comparison operator.
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
|
|
|
@ -32,26 +32,27 @@ goog.require('Blockly.Python');
|
||||||
Blockly.Python['controls_if'] = function(block) {
|
Blockly.Python['controls_if'] = function(block) {
|
||||||
// If/elseif/else condition.
|
// If/elseif/else condition.
|
||||||
var n = 0;
|
var n = 0;
|
||||||
var argument = Blockly.Python.valueToCode(block, 'IF' + n,
|
var code = '', branchCode, conditionCode;
|
||||||
Blockly.Python.ORDER_NONE) || 'False';
|
do {
|
||||||
var branch = Blockly.Python.statementToCode(block, 'DO' + n) ||
|
conditionCode = Blockly.Python.valueToCode(block, 'IF' + n,
|
||||||
Blockly.Python.PASS;
|
Blockly.Python.ORDER_NONE) || 'false';
|
||||||
var code = 'if ' + argument + ':\n' + branch;
|
branchCode = Blockly.Python.statementToCode(block, 'DO' + n) ||
|
||||||
for (n = 1; n <= block.elseifCount_; n++) {
|
|
||||||
argument = Blockly.Python.valueToCode(block, 'IF' + n,
|
|
||||||
Blockly.Python.ORDER_NONE) || 'False';
|
|
||||||
branch = Blockly.Python.statementToCode(block, 'DO' + n) ||
|
|
||||||
Blockly.Python.PASS;
|
Blockly.Python.PASS;
|
||||||
code += 'elif ' + argument + ':\n' + branch;
|
code += (n == 0 ? 'if ' : 'elif ' ) + conditionCode + ':\n' + branchCode;
|
||||||
}
|
|
||||||
if (block.elseCount_) {
|
++n;
|
||||||
branch = Blockly.Python.statementToCode(block, 'ELSE') ||
|
} while (block.getInput('IF' + n));
|
||||||
|
|
||||||
|
if (block.getInput('ELSE')) {
|
||||||
|
branchCode = Blockly.Python.statementToCode(block, 'ELSE') ||
|
||||||
Blockly.Python.PASS;
|
Blockly.Python.PASS;
|
||||||
code += 'else:\n' + branch;
|
code += 'else:\n' + branchCode;
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.Python['controls_ifelse'] = Blockly.Python['controls_if'];
|
||||||
|
|
||||||
Blockly.Python['logic_compare'] = function(block) {
|
Blockly.Python['logic_compare'] = function(block) {
|
||||||
// Comparison operator.
|
// Comparison operator.
|
||||||
var OPERATORS = {
|
var OPERATORS = {
|
||||||
|
|
|
@ -239,6 +239,9 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
||||||
/// tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].
|
/// tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].
|
||||||
Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = 'Add a final, catch-all condition to the if block.';
|
Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = 'Add a final, catch-all condition to the if block.';
|
||||||
|
|
||||||
|
/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word "otherwise" would probably be superior to "else", but the latter is used because it is traditional and shorter.
|
||||||
|
Blockly.Msg.CONTROLS_IFELSE_TITLE = 'if %1 do %2 else %3';
|
||||||
|
|
||||||
/// url - Information about comparisons.
|
/// url - Information about comparisons.
|
||||||
Blockly.Msg.LOGIC_COMPARE_HELPURL = 'https://en.wikipedia.org/wiki/Inequality_(mathematics)';
|
Blockly.Msg.LOGIC_COMPARE_HELPURL = 'https://en.wikipedia.org/wiki/Inequality_(mathematics)';
|
||||||
/// tooltip - Describes the equals (=) block.
|
/// tooltip - Describes the equals (=) block.
|
||||||
|
|
|
@ -379,7 +379,7 @@ h1 {
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<xml id="toolbox-simple" style="display: none">
|
<xml id="toolbox-simple" style="display: none">
|
||||||
<block type="controls_if"></block>
|
<block type="controls_ifelse"></block>
|
||||||
<block type="logic_compare"></block>
|
<block type="logic_compare"></block>
|
||||||
<!-- <block type="control_repeat"></block> -->
|
<!-- <block type="control_repeat"></block> -->
|
||||||
<block type="logic_operation"></block>
|
<block type="logic_operation"></block>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue