/** * @license * Visual Blocks Editor * * Copyright 2016 Massachusetts Institute of Technology * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; goog.provide('Blockly.Blocks.control'); goog.require('Blockly.Blocks'); goog.require('Blockly.Colours'); goog.require('Blockly.ScratchBlocks.VerticalExtensions'); Blockly.Blocks['control_forever'] = { /** * Block for repeat n times (external number). * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39 * @this Blockly.Block */ init: function() { this.jsonInit({ "id": "control_forever", "message0": "forever", "message1": "%1", // Statement "message2": "%1", // Icon "lastDummyAlign2": "RIGHT", "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "args2": [ { "type": "field_image", "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", "width": 24, "height": 24, "alt": "*", "flip_rtl": true } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_end"] }); } }; Blockly.Blocks['control_repeat'] = { /** * Block for repeat n times (external number). * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 * @this Blockly.Block */ init: function() { this.jsonInit({ "id": "control_repeat", "message0": "repeat %1", "message1": "%1", // Statement "message2": "%1", // Icon "lastDummyAlign2": "RIGHT", "args0": [ { "type": "input_value", "name": "TIMES" } ], "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "args2": [ { "type": "field_image", "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", "width": 24, "height": 24, "alt": "*", "flip_rtl": true } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_if'] = { /** * Block for if-then. * @this Blockly.Block */ init: function() { this.jsonInit({ "type": "control_if", "message0": "if %1 then", "message1": "%1", // Statement "args0": [ { "type": "input_value", "name": "CONDITION", "check": "Boolean" } ], "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_if_else'] = { /** * Block for if-else. * @this Blockly.Block */ init: function() { this.jsonInit({ "type": "control_if_else", "message0": "if %1 then", "message1": "%1", "message2": "else", "message3": "%1", "args0": [ { "type": "input_value", "name": "CONDITION", "check": "Boolean" } ], "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "args3": [ { "type": "input_statement", "name": "SUBSTACK2" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_stop'] = { /** * Block for stop all scripts. * @this Blockly.Block */ init: function() { var ALL_SCRIPTS = 'all'; var THIS_SCRIPT = 'this script'; var OTHER_SCRIPTS = 'other scripts in sprite'; var stopDropdown = new Blockly.FieldDropdown(function() { if (this.sourceBlock_ && this.sourceBlock_.nextConnection && this.sourceBlock_.nextConnection.isConnected()) { return [ ['other scripts in sprite', OTHER_SCRIPTS] ]; } return [['all', ALL_SCRIPTS], ['this script', THIS_SCRIPT], ['other scripts in sprite', OTHER_SCRIPTS] ]; }, function(option) { // Create an event group to keep field value and mutator in sync // Return null at the end because setValue is called here already. Blockly.Events.setGroup(true); var oldMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom()); this.sourceBlock_.setNextStatement(option == OTHER_SCRIPTS); var newMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom()); Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_, 'mutation', null, oldMutation, newMutation)); this.setValue(option); Blockly.Events.setGroup(false); return null; }); this.appendDummyInput() .appendField('stop') .appendField(stopDropdown, 'STOP_OPTION'); this.setCategory(Blockly.Categories.control); this.setColour(Blockly.Colours.control.primary, Blockly.Colours.control.secondary, Blockly.Colours.control.tertiary ); this.setPreviousStatement(true); }, mutationToDom: function() { var container = document.createElement('mutation'); container.setAttribute('hasnext', this.nextConnection != null); return container; }, domToMutation: function(xmlElement) { var hasNext = (xmlElement.getAttribute('hasnext') == 'true'); this.setNextStatement(hasNext); } }; Blockly.Blocks['control_wait'] = { /** * Block to wait (pause) stack. * @this Blockly.Block */ init: function() { this.jsonInit({ "id": "control_wait", "message0": "wait %1 seconds", "args0": [ { "type": "input_value", "name": "DURATION" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_wait_until'] = { /** * Block to wait until a condition becomes true. * @this Blockly.Block */ init: function() { this.jsonInit({ "message0": "wait until %1", "args0": [ { "type": "input_value", "name": "CONDITION", "check": "Boolean" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_repeat_until'] = { /** * Block for repeat until a condition becomes true. */ init: function() { this.jsonInit({ "message0": "repeat until %1", "message1": "%1", "message2": "%1", "lastDummyAlign2": "RIGHT", "args0": [ { "type": "input_value", "name": "CONDITION", "check": "Boolean" } ], "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "args2": [ { "type": "field_image", "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", "width": 24, "height": 24, "alt": "*", "flip_rtl": true } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_for_each'] = { /** * Block for for-each. This is an obsolete block that is implemented for * compatibility with Scratch 2.0 projects. * @this Blockly.Block */ init: function() { this.jsonInit({ "type": "control_for_each", "message0": "for each %1 in %2", "message1": "%1", "args0": [ { "type": "field_variable", "name": "VARIABLE" }, { "type": "input_value", "name": "VALUE" } ], "args1": [ { "type": "input_statement", "name": "SUBSTACK" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }) } }; Blockly.Blocks['control_start_as_clone'] = { /** * Block for "when I start as a clone" hat. * @this Blockly.Block */ init: function() { this.jsonInit({ "id": "control_start_as_clone", "message0": "when I start as a clone", "args0": [ ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_hat"] }); } }; Blockly.Blocks['control_create_clone_of_menu'] = { /** * Create-clone drop-down menu. * @this Blockly.Block */ init: function() { this.jsonInit( { "message0": "%1", "args0": [ { "type": "field_dropdown", "name": "CLONE_OPTION", "options": [ ['myself', '_myself_'] ] } ], "extensions": ["colours_control", "output_string"] }); } }; Blockly.Blocks['control_create_clone_of'] = { /** * Block for "create clone of..." * @this Blockly.Block */ init: function() { this.jsonInit({ "id": "control_start_as_clone", "message0": "create clone of %1", "args0": [ { "type": "input_value", "name": "CLONE_OPTION" } ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_statement"] }); } }; Blockly.Blocks['control_delete_this_clone'] = { /** * Block for "delete this clone." * @this Blockly.Block */ init: function() { this.jsonInit({ "message0": "delete this clone", "args0": [ ], "category": Blockly.Categories.control, "extensions": ["colours_control", "shape_end"] }); } };