From bfd3834e7de61f0c3c578d0405d0fd68cb70c92f Mon Sep 17 00:00:00 2001 From: carlosperate Date: Sat, 4 Jul 2015 05:34:59 +0100 Subject: [PATCH] Offset pasted block if in range of a snap connection. --- core/workspace_svg.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/core/workspace_svg.js b/core/workspace_svg.js index f57914772..dec9a7bde 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -396,7 +396,8 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { if (this.RTL) { blockX = -blockX; } - // Offset block until not clobbering another block. + // Offset block until not clobbering another block and not in connection + // distance with neighbouring blocks. do { var collide = false; var allBlocks = this.getAllBlocks(); @@ -404,15 +405,29 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { var otherXY = otherBlock.getRelativeToSurfaceXY(); if (Math.abs(blockX - otherXY.x) <= 1 && Math.abs(blockY - otherXY.y) <= 1) { - if (this.RTL) { - blockX -= Blockly.SNAP_RADIUS; - } else { - blockX += Blockly.SNAP_RADIUS; - } - blockY += Blockly.SNAP_RADIUS * 2; collide = true; } } + if (!collide) { + // Check for blocks in snap range to any of its connections + var blockConnections = block.getConnections_(false); + for (var i = 0; i < blockConnections.length; i++) { + var blockConnection = blockConnections[i]; + var neighbour = + blockConnection.closest(Blockly.SNAP_RADIUS, blockX, blockY); + if (neighbour.connection) { + collide = true; + } + } + } + if (collide) { + if (this.RTL) { + blockX -= Blockly.SNAP_RADIUS; + } else { + blockX += Blockly.SNAP_RADIUS; + } + blockY += Blockly.SNAP_RADIUS * 2; + } } while (collide); block.moveBy(blockX, blockY); }