diff --git a/blocks/logic.js b/blocks/logic.js index 857b04259..4b2b54b4c 100644 --- a/blocks/logic.js +++ b/blocks/logic.js @@ -94,17 +94,7 @@ Blockly.Blocks['controls_if'] = { domToMutation: function(xmlElement) { this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; - for (var i = 1; i <= this.elseifCount_; i++) { - this.appendValueInput('IF' + i) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - this.appendStatementInput('DO' + i) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - } - if (this.elseCount_) { - this.appendStatementInput('ELSE') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - } + this.updateShape_(); }, /** * Populate the mutator's dialog with this block's components. @@ -135,44 +125,23 @@ Blockly.Blocks['controls_if'] = { * @this Blockly.Block */ compose: function(containerBlock) { - // Disconnect the else input blocks and remove the inputs. - if (this.elseCount_) { - this.removeInput('ELSE'); - } - this.elseCount_ = 0; - // Disconnect all the elseif input blocks and remove the inputs. - for (var i = this.elseifCount_; i > 0; i--) { - this.removeInput('IF' + i); - this.removeInput('DO' + i); - } - this.elseifCount_ = 0; - // Rebuild the block's optional inputs. var clauseBlock = containerBlock.nextConnection.targetBlock(); + // Count number of inputs. + this.elseifCount_ = 0; + this.elseCount_ = 0; + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; while (clauseBlock) { switch (clauseBlock.type) { case 'controls_if_elseif': this.elseifCount_++; - var ifInput = this.appendValueInput('IF' + this.elseifCount_) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - var doInput = this.appendStatementInput('DO' + this.elseifCount_); - doInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - // Reconnect any child blocks. - if (clauseBlock.valueConnection_) { - ifInput.connection.connect(clauseBlock.valueConnection_); - } - if (clauseBlock.statementConnection_) { - doInput.connection.connect(clauseBlock.statementConnection_); - } + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); break; case 'controls_if_else': this.elseCount_++; - var elseInput = this.appendStatementInput('ELSE'); - elseInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - // Reconnect any child blocks. - if (clauseBlock.statementConnection_) { - elseInput.connection.connect(clauseBlock.statementConnection_); - } + elseStatementConnection = clauseBlock.statementConnection_; break; default: throw 'Unknown block type.'; @@ -180,6 +149,19 @@ Blockly.Blocks['controls_if'] = { clauseBlock = clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); } + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 1; i <= this.elseifCount_; i++) { + if (valueConnections[i]) { + this.getInput('IF' + i).connection.connect(valueConnections[i]); + } + if (statementConnections[i]) { + this.getInput('DO' + i).connection.connect(statementConnections[i]); + } + } + if (elseStatementConnection) { + this.getInput('ELSE').connection.connect(elseStatementConnection); + } }, /** * Store pointers to any connected child blocks. @@ -211,6 +193,35 @@ Blockly.Blocks['controls_if'] = { clauseBlock = clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + // Delete everything. + if (this.getInput('ELSE')) { + this.removeInput('ELSE'); + } + var i = 1; + while (this.getInput('IF' + i)) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + i++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck('Boolean') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); + this.appendStatementInput('DO' + i) + .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); + } } }; diff --git a/core/block.js b/core/block.js index 07fca2678..13012a913 100644 --- a/core/block.js +++ b/core/block.js @@ -1312,6 +1312,7 @@ Blockly.Block.prototype.getRelativeToSurfaceXY = function() { * @param {number} dy Vertical offset. */ Blockly.Block.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); var event = new Blockly.Events.Move(this); this.xy_.translate(dx, dy); event.recordNew(); diff --git a/core/block_svg.js b/core/block_svg.js index b351800c8..e2c2c4877 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -286,6 +286,7 @@ Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { * @param {number} dy Vertical offset. */ Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); var event = new Blockly.Events.Move(this); var xy = this.getRelativeToSurfaceXY(); this.getSvgRoot().setAttribute('transform', diff --git a/core/inject.js b/core/inject.js index 3b829c16c..a4e471b7f 100644 --- a/core/inject.js +++ b/core/inject.js @@ -43,7 +43,7 @@ goog.require('goog.userAgent'); Blockly.inject = function(container, opt_options) { if (goog.isString(container)) { container = document.getElementById(container) || - document.querySelector(selector); + document.querySelector(container); } // Verify that the container is in document. if (!goog.dom.contains(document, container)) { diff --git a/tests/playground.html b/tests/playground.html index e0a225b2b..f48c91d24 100644 --- a/tests/playground.html +++ b/tests/playground.html @@ -224,18 +224,6 @@ h1 { height: 95%; width: 70%; } -#collaborators { - float: right; - width: 30px; - margin-left: 10px; -} -#collaborators > img { - margin-right: 5px; - height: 30px; - padding-bottom: 5px; - width: 30px; - border-radius: 3px; -} #importExport { font-family: monospace; } @@ -243,8 +231,6 @@ h1 {
- -