From 23666664fa9ea2ba9864c02e0e9a05409b6c57b2 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Thu, 12 Apr 2018 14:58:11 -0700 Subject: [PATCH] Fix context menus on blocks with variables --- blocks/loops.js | 8 ++++---- blocks/procedures.js | 9 +++++---- blocks/variables.js | 2 +- blocks/variables_dynamic.js | 6 ++---- core/variables.js | 29 ++++++++++++++++++++++------- core/variables_dynamic.js | 4 ++-- tests/jsunit/xml_test.js | 2 +- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/blocks/loops.js b/blocks/loops.js index 667c79cf7..a6db80d11 100644 --- a/blocks/loops.js +++ b/blocks/loops.js @@ -261,13 +261,13 @@ Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = { if (this.isInFlyout){ return; } - var varName = this.getFieldValue('VAR'); + var variable = this.getField('VAR').getVariable(); + var varName = variable.name; if (!this.isCollapsed() && varName != null) { var option = {enabled: true}; option.text = - Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', varName); - var xmlField = goog.dom.createDom('field', null, varName); - xmlField.setAttribute('name', 'VAR'); + Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', varName); + var xmlField = Blockly.Variables.generateVariableFieldDom(variable); var xmlBlock = goog.dom.createDom('block', null, xmlField); xmlBlock.setAttribute('type', 'variables_get'); option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); diff --git a/blocks/procedures.js b/blocks/procedures.js index 9490f486f..4811c1a26 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -371,12 +371,13 @@ Blockly.Blocks['procedures_defnoreturn'] = { // Add options to create getters for each parameter. if (!this.isCollapsed()) { - for (var i = 0; i < this.arguments_.length; i++) { + for (var i = 0; i < this.argumentVarModels_.length; i++) { var option = {enabled: true}; - var name = this.arguments_[i]; + var argVar = this.argumentVarModels_[i]; + var name = argVar.name; option.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace('%1', name); - var xmlField = goog.dom.createDom('field', null, name); - xmlField.setAttribute('name', 'VAR'); + + var xmlField = Blockly.Variables.generateVariableFieldDom(argVar); var xmlBlock = goog.dom.createDom('block', null, xmlField); xmlBlock.setAttribute('type', 'variables_get'); option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); diff --git a/blocks/variables.js b/blocks/variables.js index 64718502e..cf8fa2d96 100644 --- a/blocks/variables.js +++ b/blocks/variables.js @@ -113,7 +113,7 @@ Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { } var option = {enabled: this.workspace.remainingCapacity() > 0}; - var name = this.getFieldValue('VAR'); + var name = this.getField('VAR').getText(); option.text = contextMenuMsg.replace('%1', name); var xmlField = goog.dom.createDom('field', null, name); xmlField.setAttribute('name', 'VAR'); diff --git a/blocks/variables_dynamic.js b/blocks/variables_dynamic.js index 5bc47376a..a9f568a7c 100644 --- a/blocks/variables_dynamic.js +++ b/blocks/variables_dynamic.js @@ -110,13 +110,11 @@ Blockly.Constants.VariablesDynamic.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MI contextMenuMsg = Blockly.Msg.VARIABLES_SET_CREATE_GET; } - var option = { enabled: this.workspace.remainingCapacity() > 0 }; - var name = this.getFieldValue('VAR'); + var option = {enabled: this.workspace.remainingCapacity() > 0}; + var name = this.getField('VAR').getText(); option.text = contextMenuMsg.replace('%1', name); var xmlField = goog.dom.createDom('field', null, name); xmlField.setAttribute('name', 'VAR'); - var variableModel = this.workspace.getVariable(name); - xmlField.setAttribute('variabletype', variableModel.type); var xmlBlock = goog.dom.createDom('block', null, xmlField); xmlBlock.setAttribute('type', opposite_type); option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); diff --git a/core/variables.js b/core/variables.js index 4f1e5939b..4f5474e74 100644 --- a/core/variables.js +++ b/core/variables.js @@ -159,7 +159,7 @@ Blockly.Variables.flyoutCategoryBlocks = function(workspace) { var gap = Blockly.Blocks['math_change'] ? 8 : 24; var blockText = '' + '' + - Blockly.Variables.generateVariableFieldXml_(firstVariable) + + Blockly.Variables.generateVariableFieldXmlString(firstVariable) + '' + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; @@ -169,7 +169,7 @@ Blockly.Variables.flyoutCategoryBlocks = function(workspace) { var gap = Blockly.Blocks['variables_get'] ? 20 : 8; var blockText = '' + '' + - Blockly.Variables.generateVariableFieldXml_(firstVariable) + + Blockly.Variables.generateVariableFieldXmlString(firstVariable) + '' + '' + '1' + @@ -185,7 +185,7 @@ Blockly.Variables.flyoutCategoryBlocks = function(workspace) { if (Blockly.Blocks['variables_get']) { var blockText = '' + '' + - Blockly.Variables.generateVariableFieldXml_(variable) + + Blockly.Variables.generateVariableFieldXmlString(variable) + '' + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; @@ -439,9 +439,9 @@ Blockly.Variables.nameUsedWithAnyType_ = function(name, workspace) { * @param {!Blockly.VariableModel} variableModel The variable model to generate * an XML string from. * @return {string} The generated XML. - * @private + * @package */ -Blockly.Variables.generateVariableFieldXml_ = function(variableModel) { +Blockly.Variables.generateVariableFieldXmlString = function(variableModel) { // The variable name may be user input, so it may contain characters that need // to be escaped to create valid XML. var typeString = variableModel.type; @@ -449,11 +449,26 @@ Blockly.Variables.generateVariableFieldXml_ = function(variableModel) { typeString = '\'\''; } var text = '' + goog.string.htmlEscape(variableModel.name) + ''; + '" variabletype="' + goog.string.htmlEscape(typeString) + + '">' + goog.string.htmlEscape(variableModel.name) + ''; return text; }; +/** + * Generate DOM objects representing a variable field. + * @param {!Blockly.VariableModel} variableModel The variable model represent. + * @return {Element} The generated DOM. + * @package + */ +Blockly.Variables.generateVariableFieldDom = function(variableModel) { + var xmlFieldString = + Blockly.Variables.generateVariableFieldXmlString(variableModel); + var text = '' + xmlFieldString + ''; + var dom = Blockly.Xml.textToDom(text); + var fieldDom = dom.firstChild; + return fieldDom; +}; + /** * Helper function to look up or create a variable on the given workspace. * If no variable exists, creates and returns it. diff --git a/core/variables_dynamic.js b/core/variables_dynamic.js index 1a88e5e34..111e68b09 100644 --- a/core/variables_dynamic.js +++ b/core/variables_dynamic.js @@ -94,7 +94,7 @@ Blockly.VariablesDynamic.flyoutCategoryBlocks = function(workspace) { var gap = 24; var blockText = '' + '' + - Blockly.Variables.generateVariableFieldXml_(firstVariable) + + Blockly.Variables.generateVariableFieldXmlString(firstVariable) + '' + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; @@ -104,7 +104,7 @@ Blockly.VariablesDynamic.flyoutCategoryBlocks = function(workspace) { for (var i = 0, variable; variable = variableModelList[i]; i++) { var blockText = '' + '' + - Blockly.Variables.generateVariableFieldXml_(variable) + + Blockly.Variables.generateVariableFieldXmlString(variable) + '' + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; diff --git a/tests/jsunit/xml_test.js b/tests/jsunit/xml_test.js index 9c3da790b..527854052 100644 --- a/tests/jsunit/xml_test.js +++ b/tests/jsunit/xml_test.js @@ -392,7 +392,7 @@ function test_variableFieldXml_caseSensitive() { }; var generatedXml = - Blockly.Variables.generateVariableFieldXml_(mockVariableModel); + Blockly.Variables.generateVariableFieldXmlString(mockVariableModel); var goldenXml = '