summaryrefslogtreecommitdiffstats
path: root/modules-available/roomplanner/js/grid.js
diff options
context:
space:
mode:
authorAndreas Berenz2016-09-06 14:11:02 +0200
committerAndreas Berenz2016-09-06 14:11:02 +0200
commite6573ffd9701740a8c71fbf4bbe5687db7a9ec76 (patch)
treeac4be5c0cc7259eea082b25d1f949be4715464ca /modules-available/roomplanner/js/grid.js
parentscaling orientation now is viewport-center instead of top left position - mag... (diff)
downloadslx-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.js48
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');