diff options
author | Andreas Berenz | 2016-09-06 14:11:02 +0200 |
---|---|---|
committer | Andreas Berenz | 2016-09-06 14:11:02 +0200 |
commit | e6573ffd9701740a8c71fbf4bbe5687db7a9ec76 (patch) | |
tree | ac4be5c0cc7259eea082b25d1f949be4715464ca /modules-available/roomplanner/js/grid.js | |
parent | scaling orientation now is viewport-center instead of top left position - mag... (diff) | |
download | slx-admin-e6573ffd9701740a8c71fbf4bbe5687db7a9ec76.tar.gz slx-admin-e6573ffd9701740a8c71fbf4bbe5687db7a9ec76.tar.xz slx-admin-e6573ffd9701740a8c71fbf4bbe5687db7a9ec76.zip |
find near available position and place item there if minimal collision was detected
Diffstat (limited to 'modules-available/roomplanner/js/grid.js')
-rw-r--r-- | modules-available/roomplanner/js/grid.js | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/modules-available/roomplanner/js/grid.js b/modules-available/roomplanner/js/grid.js index 9fdd99e4..eb845f9f 100644 --- a/modules-available/roomplanner/js/grid.js +++ b/modules-available/roomplanner/js/grid.js @@ -445,12 +445,54 @@ $(document).ready(function(){ // the element is already in drawing area var el = (ui.helper == ui.draggable) ? ui.draggable : $(ui.helper.clone()); - if ($(el).collision('[itemtype="'+$(el).attr('itemtype').replace('_drag','')+'"]').length) { + + var collidingElements = $(el).collision('[itemtype="'+$(el).attr('itemtype').replace('_drag','')+'"]'); + + var i = 0; + while (collidingElements.length > 0) { + // too much tries - abort + if (i > 5) { return; } - // pathfinding zu besserer position + if (ui.helper != ui.draggable) { + var leftPos = parseInt($(el).css('left'))-parseInt($('#drawarea').css('left'))-$('#drawpanel').offset().left; + var topPos = parseInt($(el).css('top'))-parseInt($('#drawarea').css('top'))-($('#drawpanel').offset().top + $('#drawpanel .panel-heading').height()); + var cp = roomplanner.getCellPositionFromPixels(leftPos,topPos); + leftPos = cp[0]; + topPos = cp[1]; - return; + } else { + var leftPos = parseInt($(el).css('left')); + var topPos = parseInt($(el).css('top')); + } + + var collider = $(collidingElements[0]); + var colliderTop = parseInt(collider.css('top')); + var colliderLeft = parseInt(collider.css('left')); + + var overlap = { + x: Math.min(colliderLeft+collider.outerWidth(),leftPos+$(el).outerWidth()) - Math.max(leftPos,colliderLeft), + y: Math.min(colliderTop+collider.outerHeight(),topPos+$(el).outerHeight()) - Math.max(topPos,colliderTop) + }; + + if (overlap.x <= overlap.y) { + var lpos = parseInt($(el).css('left')); + if (colliderLeft + overlap.x == leftPos + $(el).width()) { + $(el).css('left',(lpos - (overlap.x+2))+"px"); + } else { + $(el).css('left',(lpos + overlap.x+2)+"px"); + } + } else { + var tpos = parseInt($(el).css('top')); + if (colliderTop + overlap.y == topPos + $(el).height()) { + $(el).css('top',(tpos - (overlap.y+2))+"px"); + } else { + $(el).css('top',(tpos + overlap.y+2)+"px"); + } + } + collidingElements = $(el).collision('[itemtype="'+$(el).attr('itemtype').replace('_drag','')+'"]'); + + i++; } var itemtype = $(el).attr('itemtype'); |