From 74ff24e32337153f5c8530fbc10583460cdb1e7f Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 10 Feb 2017 17:05:02 -0800 Subject: [PATCH] JSONify variable blocks --- blocks/variables.js | 125 +++++++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/blocks/variables.js b/blocks/variables.js index 3b7d99f92..d82a98bed 100644 --- a/blocks/variables.js +++ b/blocks/variables.js @@ -20,81 +20,108 @@ /** * @fileoverview Variable blocks for Blockly. + + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. * @author fraser@google.com (Neil Fraser) */ 'use strict'; -goog.provide('Blockly.Blocks.variables'); +goog.provide('Blockly.Blocks.variables'); // Deprecated. +goog.provide('Blockly.Constants.Variables'); goog.require('Blockly.Blocks'); /** * Common HSV hue for all blocks in this category. + * Should be the same as Blockly.Msg.VARIABLES_HUE. + * @readonly */ -Blockly.Blocks.variables.HUE = 330; +Blockly.Constants.Variables.HUE = 330; +/** @deprecated Use Blockly.Constants.Variables.HUE */ +Blockly.Blocks.variables.HUE = Blockly.Constants.Variables.HUE; -Blockly.Blocks['variables_get'] = { - /** - * Block for variable getter. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(Blockly.Blocks.variables.HUE); - this.appendDummyInput() - .appendField(new Blockly.FieldVariable( - Blockly.Msg.VARIABLES_DEFAULT_NAME), 'VAR'); - this.setOutput(true); - this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP); - this.contextMenuMsg_ = Blockly.Msg.VARIABLES_GET_CREATE_SET; +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for variable getter. + { + "type": "variables_get", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + } + ], + "output": null, + "colour": "%{BKY_VARIABLES_HUE}", + "helpUrl": "%{BKY_VARIABLES_GET_HELPURL}", + "tooltip": "%{BKY_VARIABLES_GET_TOOLTIP}", + "extensions": ["contextMenu_variableSetterGetter"] }, - contextMenuType_: 'variables_set', + // Block for variable setter. + { + "type": "variables_set", + "message0": "%{BKY_VARIABLES_SET}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + }, + { + "type": "input_value", + "name": "VALUE" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_VARIABLES_HUE}", + "tooltip": "%{BKY_VARIABLES_SET_TOOLTIP}", + "helpUrl": "%{BKY_VARIABLES_SET_HELPURL}", + "extensions": ["contextMenu_variableSetterGetter"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mixin to add context menu items to create getter/setter blocks for this + * setter/getter. + * Used by blocks 'variables_set' and 'variables_get'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { /** * Add menu option to create getter/setter block for this setter/getter. * @param {!Array} options List of menu options to add to. * @this Blockly.Block */ customContextMenu: function(options) { + // Getter blocks have the option to create a setter block, and vice versa. + if (this.type == 'variables_get') { + var opposite_type = 'variables_set'; + var contextMenuMsg = Blockly.Msg.VARIABLES_GET_CREATE_SET; + } else { + var opposite_type = 'variables_get'; + var contextMenuMsg = Blockly.Msg.VARIABLES_SET_CREATE_GET; + } + var option = {enabled: true}; var name = this.getFieldValue('VAR'); - option.text = this.contextMenuMsg_.replace('%1', name); + option.text = contextMenuMsg.replace('%1', name); var xmlField = goog.dom.createDom('field', null, name); xmlField.setAttribute('name', 'VAR'); var xmlBlock = goog.dom.createDom('block', null, xmlField); - xmlBlock.setAttribute('type', this.contextMenuType_); + xmlBlock.setAttribute('type', opposite_type); option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); options.push(option); } }; -Blockly.Blocks['variables_set'] = { - /** - * Block for variable setter. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.VARIABLES_SET, - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variable": Blockly.Msg.VARIABLES_DEFAULT_NAME - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": Blockly.Blocks.variables.HUE, - "tooltip": Blockly.Msg.VARIABLES_SET_TOOLTIP, - "helpUrl": Blockly.Msg.VARIABLES_SET_HELPURL - }); - this.contextMenuMsg_ = Blockly.Msg.VARIABLES_SET_CREATE_GET; - }, - contextMenuType_: 'variables_get', - customContextMenu: Blockly.Blocks['variables_get'].customContextMenu -}; +Blockly.Extensions.registerMixin('contextMenu_variableSetterGetter', + Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN);