From ad1d1261c8ab903cde15a0e91bcf29577db3b499 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Fri, 18 Sep 2015 18:46:19 -0700 Subject: [PATCH] Duplicate should spread blocks out like copy and paste do. --- core/block.js | 24 ------------------------ core/block_svg.js | 2 +- core/blockly.js | 19 +++++++++++++++++++ 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/core/block.js b/core/block.js index ce8b8ef38..b0ff7a598 100644 --- a/core/block.js +++ b/core/block.js @@ -260,30 +260,6 @@ Blockly.Block.prototype.unplug = function(healStack, bump) { } }; -/** - * Duplicate this block and its children. - * @return {!Blockly.Block} The duplicate. - * @private - */ -Blockly.Block.prototype.duplicate_ = function() { - // Create a duplicate via XML. - var xmlBlock = Blockly.Xml.blockToDom_(this); - Blockly.Xml.deleteNext(xmlBlock); - var newBlock = Blockly.Xml.domToBlock( - /** @type {!Blockly.Workspace} */ (this.workspace), xmlBlock); - // Move the duplicate next to the old block. - var xy = this.getRelativeToSurfaceXY(); - if (this.RTL) { - xy.x -= Blockly.SNAP_RADIUS; - } else { - xy.x += Blockly.SNAP_RADIUS; - } - xy.y += Blockly.SNAP_RADIUS * 2; - newBlock.moveBy(xy.x, xy.y); - newBlock.select(); - return newBlock; -}; - /** * Returns all connections originating from this block. * @param {boolean} all If true, return all connections even hidden ones. diff --git a/core/block_svg.js b/core/block_svg.js index de837d6f6..7afb52169 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -508,7 +508,7 @@ Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { text: Blockly.Msg.DUPLICATE_BLOCK, enabled: true, callback: function() { - block.duplicate_(); + Blockly.duplicate_(block); } }; if (this.getDescendants().length > this.workspace.remainingCapacity()) { diff --git a/core/blockly.js b/core/blockly.js index 0c81b57c3..8f3d574b3 100644 --- a/core/blockly.js +++ b/core/blockly.js @@ -434,6 +434,25 @@ Blockly.copy_ = function(block) { Blockly.clipboardSource_ = block.workspace; }; +/** + * Duplicate this block and its children. + * @param {!Blockly.Block} block Block to be copied. + * @private + */ +Blockly.duplicate_ = function(block) { + // Save the clipboard. + var clipboardXml = Blockly.clipboardXml_; + var clipboardSource = Blockly.clipboardSource_; + + // Create a duplicate via a copy/paste operation. + Blockly.copy_(block); + block.workspace.paste(Blockly.clipboardXml_); + + // Restore the clipboard. + Blockly.clipboardXml_ = clipboardXml; + Blockly.clipboardSource_ = clipboardSource; +}; + /** * Cancel the native context menu, unless the focus is on an HTML input widget. * @param {!Event} e Mouse down event.