/* Blockly.Blocks['classics_get_all'] = { init: function() { this.setHelpUrl('http://www.example.com/'); this.setColour(WEATHER_HUE); this.appendDummyInput() .appendField("classics.get all books"); this.setInputsInline(false); this.setOutput(true, "Number"); this.setTooltip('Returns all the books'); } }; Blockly.Python['classics_get_all'] = function(block) { Blockly.Python.definitions_['import_classics'] = 'import classics'; var code = 'classics.get_all()'; return [code, Blockly.Python.ORDER_ATOMIC]; }; PythonToBlocks.KNOWN_MODULES['classics'] = { "get_all": ["classics_get_all"] }; */ function newBlock(name) { var block = blockpy.components.editor.blockly.newBlock(name); block.initSvg(); block.render(); } /** * Decode an XML DOM and create blocks on the workspace, clearing out old blocks. * @param {!Element} xml XML DOM. * @param {!Blockly.Workspace} workspace The workspace. */ Blockly.Xml.domToWorkspaceDestructive = function(xml, workspace, errorXml) { if (xml instanceof Blockly.Workspace) { var swap = xml; xml = workspace; workspace = swap; console.warn('Deprecated call to Blockly.Xml.domToWorkspace, ' + 'swap the arguments.'); } var width; // Not used in LTR. if (workspace.RTL) { width = workspace.getWidth(); } Blockly.Field.startCache(); // Safari 7.1.3 is known to provide node lists with extra references to // children beyond the lists' length. Trust the length, do not use the // looping pattern of checking the index for an object. var childCount = xml.childNodes.length; var existingGroup = Blockly.Events.getGroup(); if (!existingGroup) { Blockly.Events.setGroup(true); } Blockly.Events.disable(); while (workspace.topBlocks_.length) { workspace.topBlocks_[0].dispose(); } //workspace.variableList.length = 0; Blockly.Events.enable(); // Disable workspace resizes as an optimization. if (workspace.setResizesEnabled) { workspace.setResizesEnabled(false); } for (var i = 0; i < childCount; i++) { var xmlChild = xml.childNodes[i]; var name = xmlChild.nodeName.toLowerCase(); if (name == 'block' || (name == 'shadow' && !Blockly.Events.recordUndo)) { // Allow top-level shadow blocks if recordUndo is disabled since // that means an undo is in progress. Such a block is expected // to be moved to a nested destination in the next operation. var block = Blockly.Xml.domToBlock(xmlChild, workspace); var blockX = parseInt(xmlChild.getAttribute('x'), 10); var blockY = parseInt(xmlChild.getAttribute('y'), 10); if (!isNaN(blockX) && !isNaN(blockY)) { block.moveBy(workspace.RTL ? width - blockX : blockX, blockY); } } else if (name == 'shadow') { goog.asserts.fail('Shadow block cannot be a top-level block.'); } } if (!existingGroup) { Blockly.Events.setGroup(false); } Blockly.Field.stopCache(); //workspace.updateVariableList(false); // Re-enable workspace resizing. if (workspace.setResizesEnabled) { workspace.setResizesEnabled(true); } } function PLUS_MINUS_updateShape(listItemName, startMessage) { return function() { var that = this; function addField(field, block, e) { var rect = field.fieldGroup_.getBoundingClientRect(); var yPosition = e.clientY; if (yPosition < rect.top+rect.height/2) { var input = that.appendValueInput(listItemName + that.itemCount_); that.itemCount_ += 1; } else { if (that.itemCount_ > 0) { that.itemCount_ -= 1; that.removeInput(listItemName + that.itemCount_) } } } if (!this.getInput('START')) { var clickablePlusMinus = new Blockly.FieldClickImage("images/plus-minus-button.svg", 12, 24, '+', addField, '-2px'); //clickablePlusMinus.imageElement_.style.y = '-2px'; this.appendDummyInput('START') .appendField(startMessage) .appendField(clickablePlusMinus); } // Add new inputs. for (var i = 0; i < this.itemCount_; i++) { if (!this.getInput(listItemName + i)) { var input = this.appendValueInput(listItemName + i); } } // Remove deleted inputs. while (this.getInput(listItemName + i)) { this.removeInput(listItemName + i); i++; } } }