UNPKG

cloud-blocks

Version:

Cloud Blocks is a library for building scratch computing interfaces with Luxrobo MODI.

543 lines (521 loc) 13.8 kB
/** * @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: Blockly.Msg.CONTROL_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: Blockly.Msg.CONTROL_REPEAT, 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: Blockly.Msg.CONTROL_IF, 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: Blockly.Msg.CONTROL_IF, message1: '%1', message2: Blockly.Msg.CONTROL_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 [[Blockly.Msg.CONTROL_STOP_OTHER, OTHER_SCRIPTS]]; } return [ [Blockly.Msg.CONTROL_STOP_ALL, ALL_SCRIPTS], [Blockly.Msg.CONTROL_STOP_THIS, THIS_SCRIPT], [Blockly.Msg.CONTROL_STOP_OTHER, 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(Blockly.Msg.CONTROL_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: Blockly.Msg.CONTROL_WAIT, 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: Blockly.Msg.CONTROL_WAITUNTIL, args0: [ { type: 'input_value', name: 'CONDITION', check: 'Boolean' } ], category: Blockly.Categories.control, extensions: ['colours_control', 'shape_statement'] }); } }; Blockly.Blocks['control_repeat_until'] = { /** * Block to repeat until a condition becomes true. * @this Blockly.Block */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_REPEATUNTIL, 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_while'] = { /** * Block to repeat until a condition becomes false. * (This is an obsolete "hacked" block, for compatibility with 2.0.) */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_WHILE, 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: Blockly.Msg.CONTROL_FOREACH, 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: Blockly.Msg.CONTROL_STARTASCLONE, 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: [[Blockly.Msg.CONTROL_CREATECLONEOF_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: Blockly.Msg.CONTROL_CREATECLONEOF, 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: Blockly.Msg.CONTROL_DELETETHISCLONE, args0: [], category: Blockly.Categories.control, extensions: ['colours_control', 'shape_end'] }); } }; Blockly.Blocks['control_get_counter'] = { /** * Block to get the counter value. This is an obsolete block that is * implemented for compatibility with Scratch 2.0 projects. * @this Blockly.Block */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_COUNTER, category: Blockly.Categories.control, extensions: ['colours_control', 'output_number'] }); } }; Blockly.Blocks['control_incr_counter'] = { /** * Block to add one to the counter value. This is an obsolete block that is * implemented for compatibility with Scratch 2.0 projects. * @this Blockly.Block */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_INCRCOUNTER, category: Blockly.Categories.control, extensions: ['colours_control', 'shape_statement'] }); } }; Blockly.Blocks['control_clear_counter'] = { /** * Block to clear the counter value. This is an obsolete block that is * implemented for compatibility with Scratch 2.0 projects. * @this Blockly.Block */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_CLEARCOUNTER, category: Blockly.Categories.control, extensions: ['colours_control', 'shape_statement'] }); } }; Blockly.Blocks['control_all_at_once'] = { /** * Block to run the contained script. This is an obsolete block that is * implemented for compatibility with Scratch 2.0 projects. Note that * this was originally designed to run all of the contained blocks * (sequentially, like normal) within a single frame, but this feature * was removed in place of custom blocks marked "run without screen * refresh". The "all at once" block was changed to run the contained * blocks ordinarily, functioning the same way as an "if" block with a * reporter that is always true (e.g. "if 1 = 1"). Also note that the * Scratch 2.0 spec for this block is "warpSpeed", but the label shows * "all at once". * @this Blockly.Block */ init: function () { this.jsonInit({ message0: Blockly.Msg.CONTROL_ALLATONCE, message1: '%1', // Statement args1: [ { type: 'input_statement', name: 'SUBSTACK' } ], category: Blockly.Categories.control, extensions: ['colours_control', 'shape_statement'] }); } };