From 039f536cf3c8865636dd3cad8037ade4006184c7 Mon Sep 17 00:00:00 2001 From: RoboErikG Date: Wed, 31 May 2017 10:22:44 -0700 Subject: [PATCH] Convert text_join block to JSON + mutator format (#1140) --- blocks/text.js | 286 ++++++++++++++++++++++++++----------------------- 1 file changed, 151 insertions(+), 135 deletions(-) diff --git a/blocks/text.js b/blocks/text.js index c25d1a434..e64493aee 100644 --- a/blocks/text.js +++ b/blocks/text.js @@ -57,144 +57,19 @@ Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT "text_quotes", "parent_tooltip_when_inline" ] + }, + { + "type": "text_join", + "message0": "", + "output": "String", + "colour": "%{BKY_TEXTS_HUE}", + "helpUrl": "%{BKY_TEXT_JOIN_HELPURL}", + "tooltip": "%{BKY_TEXT_JOIN_TOOLTIP}", + "mutator": "text_join_mutator" + } ]); // END JSON EXTRACT (Do not delete this comment.) -/** Wraps TEXT field with images of double quote characters. */ -Blockly.Constants.Text.textQuotesExtension = function() { - this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); - this.quoteField_('TEXT'); -}; - -Blockly.Extensions.register('text_quotes', - Blockly.Constants.Text.textQuotesExtension); - -Blockly.Blocks['text_join'] = { - /** - * Block for creating a string made up of any number of elements of any type. - * @this Blockly.Block - */ - init: function() { - this.setHelpUrl(Blockly.Msg.TEXT_JOIN_HELPURL); - this.setColour(Blockly.Blocks.texts.HUE); - this.itemCount_ = 2; - this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); - this.updateShape_(); - this.setOutput(true, 'String'); - this.setMutator(new Blockly.Mutator(['text_create_join_item'])); - this.setTooltip(Blockly.Msg.TEXT_JOIN_TOOLTIP); - }, - /** - * Create XML to represent number of text inputs. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('items', this.itemCount_); - return container; - }, - /** - * Parse XML to restore the text inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function(xmlElement) { - this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); - this.updateShape_(); - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function(workspace) { - var containerBlock = workspace.newBlock('text_create_join_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var i = 0; i < this.itemCount_; i++) { - var itemBlock = workspace.newBlock('text_create_join_item'); - itemBlock.initSvg(); - connection.connect(itemBlock.previousConnection); - connection = itemBlock.nextConnection; - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - // Count number of inputs. - var connections = []; - while (itemBlock) { - connections.push(itemBlock.valueConnection_); - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - // Disconnect any children that don't belong. - for (var i = 0; i < this.itemCount_; i++) { - var connection = this.getInput('ADD' + i).connection.targetConnection; - if (connection && connections.indexOf(connection) == -1) { - connection.disconnect(); - } - } - this.itemCount_ = connections.length; - this.updateShape_(); - // Reconnect any child blocks. - for (var i = 0; i < this.itemCount_; i++) { - Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); - } - }, - /** - * Store pointers to any connected child blocks. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - saveConnections: function(containerBlock) { - var itemBlock = containerBlock.getInputTargetBlock('STACK'); - var i = 0; - while (itemBlock) { - var input = this.getInput('ADD' + i); - itemBlock.valueConnection_ = input && input.connection.targetConnection; - i++; - itemBlock = itemBlock.nextConnection && - itemBlock.nextConnection.targetBlock(); - } - }, - /** - * Modify this block to have the correct number of inputs. - * @private - * @this Blockly.Block - */ - updateShape_: function() { - if (this.itemCount_ && this.getInput('EMPTY')) { - this.removeInput('EMPTY'); - } else if (!this.itemCount_ && !this.getInput('EMPTY')) { - this.appendDummyInput('EMPTY') - .appendField(this.newQuote_(true)) - .appendField(this.newQuote_(false)); - } - // Add new inputs. - for (var i = 0; i < this.itemCount_; i++) { - if (!this.getInput('ADD' + i)) { - var input = this.appendValueInput('ADD' + i); - if (i == 0) { - input.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); - } - } - } - // Remove deleted inputs. - while (this.getInput('ADD' + i)) { - this.removeInput('ADD' + i); - i++; - } - } -}; - Blockly.Blocks['text_create_join_container'] = { /** * Mutator block for container. @@ -849,3 +724,144 @@ Blockly.Constants.Text.QUOTE_IMAGE_MIXIN = { } }; +/** Wraps TEXT field with images of double quote characters. */ +Blockly.Constants.Text.TEXT_QUOTES_EXTENSION = function() { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.quoteField_('TEXT'); +}; + +/** + * Mixin for mutator functions in the 'text_join_mutator' extension. + * @mixin + * @augments Blockly.Block + * @package + */ +Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN = { + /** + * Create XML to represent number of text inputs. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function() { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the text inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('text_create_join_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('text_create_join_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('ADD' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } + this.itemCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + if (this.itemCount_ && this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { + this.appendDummyInput('EMPTY') + .appendField(this.newQuote_(true)) + .appendField(this.newQuote_(false)); + } + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('ADD' + i)) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); + } + } + } + // Remove deleted inputs. + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } +} + +// Performs final setup of a text_join block. +Blockly.Constants.Text.TEXT_JOIN_EXTENSION = function() { + // Add the quote mixin for the itemCount_ = 0 case. + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + // initialize the mutator values + this.itemCount_ = 2; + this.updateShape_(); + // Configure the mutator ui + this.setMutator(new Blockly.Mutator(['text_create_join_item'])); +}; + +Blockly.Extensions.register('text_quotes', + Blockly.Constants.Text.TEXT_QUOTES_EXTENSION); + +Blockly.Extensions.registerMutator('text_join_mutator', + Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN, + Blockly.Constants.Text.TEXT_JOIN_EXTENSION);