summaryrefslogtreecommitdiffstats
path: root/modules-available/roomplanner/js/grid.js
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/roomplanner/js/grid.js')
-rw-r--r--modules-available/roomplanner/js/grid.js134
1 files changed, 101 insertions, 33 deletions
diff --git a/modules-available/roomplanner/js/grid.js b/modules-available/roomplanner/js/grid.js
index f0c18316..2cca26cd 100644
--- a/modules-available/roomplanner/js/grid.js
+++ b/modules-available/roomplanner/js/grid.js
@@ -19,8 +19,8 @@ if (!roomplanner) var roomplanner = {
cellsep: 4,
scale: 100,
room: {
- width: 1000,
- height: 1000
+ width: 33,
+ height: 33
}
},
selectFromServer: selectMachine,
@@ -101,33 +101,27 @@ if (!roomplanner) var roomplanner = {
$(this).addClass("obstacle");
}
- if ($(this).attr('itemtype') == "pc_drag") {
- $(this).attr('itemtype','pc');
+ if ($(this).attr('itemtype').indexOf('_drag') > -1) {
+ var itemtype = $(this).attr('itemtype').replace('_drag','');
+ $(this).attr('itemtype',itemtype);
}
-
},
"preventCollision" : true,
"restraint": "#draw-element-area",
- "obstacle" : ".obstacle",
+ "obstacle" : '[itemtype="'+$(el).attr('itemtype')+'"]',
"start": function(ev,ui) {
if (roomplanner.isElementResizable(this)) {
$(this).resizable("option","maxHeight",null);
$(this).resizable("option","maxWidth",null);
}
- if ($(this).attr('itemtype') == "pc") {
- $(this).attr('itemtype','pc_drag');
- }
+ var itemtype = $(this).attr('itemtype');
+ $(this).attr('itemtype',itemtype+'_drag');
$(this).removeClass("obstacle");
}
};
- // pcs can be placed everywhere
- if ($(el).attr('itemtype') == "pc") {
- options.obstacle = '[itemtype="pc"]';
- }
-
for (var o in options) {
$(el).draggable("option",o,options[o]);
}
@@ -137,7 +131,7 @@ if (!roomplanner) var roomplanner = {
$(el).resizable({
containment : "#draw-element-area",
- obstacle: ".obstacle",
+ obstacle: '[itemtype="'+$(el).attr('itemtype')+'"]',
handles: "se",
autoHide: true,
grid: [(roomplanner.settings.scale / 4), (roomplanner.settings.scale / 4)],
@@ -145,7 +139,10 @@ if (!roomplanner) var roomplanner = {
var gridSteps = $(this).resizable("option","grid");
- var collides = $(this).collision(".obstacle");
+ var collides = $(this).collision('[itemtype="'+$(el).attr('itemtype').replace('_drag','')+'"]');
+
+
+
var pos = $(this).offset();
var self = this;
@@ -187,6 +184,10 @@ if (!roomplanner) var roomplanner = {
},
start: function(ev,ui) {
$(this).removeClass("obstacle");
+
+ var itemtype = $(this).attr('itemtype');
+ $(this).attr('itemtype',itemtype+'_drag');
+
$(this).css('opacity',0.8);
var gridSteps = $(this).resizable("option","grid");
@@ -219,6 +220,11 @@ if (!roomplanner) var roomplanner = {
$(this).addClass("obstacle");
}
+ if ($(this).attr('itemtype').indexOf('_drag') > -1) {
+ var itemtype = $(this).attr('itemtype').replace('_drag','');
+ $(this).attr('itemtype',itemtype);
+ }
+
var gridSteps = $(this).resizable("option","grid");
var mw = $(this).resizable("option","maxWidth");
if (mw) {
@@ -280,11 +286,15 @@ if (!roomplanner) var roomplanner = {
return JSON.stringify(objects);
},
load: function(object) {
- try {
- var objects = JSON.parse(object);
- } catch(e) {
- alert('invalid JSON format');
- return false;
+ if (typeof object === 'string') {
+ try {
+ var objects = JSON.parse(object);
+ } catch (e) {
+ alert('invalid JSON format');
+ return false;
+ }
+ } else {
+ var objects = object;
}
$('#draw-element-area').html('');
@@ -347,6 +357,18 @@ roomplanner.grid = (function() {
$('#drawarea').height(h);
},
scale: function(num) {
+
+ var area_left = parseInt($('#drawarea').css('left')) - $('#drawpanel .panel-body').width()/2 ;
+ var area_top = parseInt($('#drawarea').css('top')) - $('#drawpanel .panel-body').height()/2;
+
+ var opts = {
+ left: ((parseInt(area_left) * num / roomplanner.settings.scale ) + $('#drawpanel .panel-body').width()/2)+ "px" ,
+ top: ((parseInt(area_top) * num / roomplanner.settings.scale ) + $('#drawpanel .panel-body').height()/2)+ "px"
+ };
+
+ $('#drawarea').css(opts);
+
+
$('#drawarea').css('background-size',num);
roomplanner.settings.scale = num;
$('#draw-element-area .ui-draggable').each(function(idx,item) {
@@ -382,16 +404,19 @@ roomplanner.grid = (function() {
$(document).ready(function(){
roomplanner.grid.init();
+
+ var update = function(event,ui) {
+ roomplanner.grid.scale(ui.value);
+ };
- $('#scaleslider').slider({
+ roomplanner.slider = $('#scaleslider').slider({
orientation: "horizontal",
range: "min",
- min: 20,
- max: 200,
+ min: 40,
+ max: 150,
value: 100,
- slide: function(event,ui) {
- roomplanner.grid.scale(ui.value);
- },
+ change: update,
+ slide: update,
stop: function(e, ui) {
$('#drawarea').trigger('checkposition');
}
@@ -427,10 +452,54 @@ $(document).ready(function(){
// the element is already in drawing area
var el = (ui.helper == ui.draggable) ? ui.draggable : $(ui.helper.clone());
- var collidingSelector = ($(el).attr('itemtype') =="pc_drag") ? '[itemtype="pc"]' : '.obstacle';
- if ($(el).collision(collidingSelector).length) {
- return;
+ 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; }
+
+
+ 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];
+
+ } 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');
@@ -504,9 +573,8 @@ $(document).ready(function(){
var type = $(ui.helper).attr('itemtype');
$(ui.helper).attr('itemtype',type+"_drag");
},
- drag: function(ev,ui) {
- var collidingSelector = ($(ui.helper).attr('itemtype') =="pc_drag") ? '[itemtype="pc"]' : '.obstacle';
- if ($(ui.helper).collision(collidingSelector).length) {
+ drag: function(ev,ui) {
+ if ($(ui.helper).collision('[itemtype="'+$(ui.helper).attr('itemtype').replace('_drag','')+'"]').length) {
$(ui.helper).addClass('collides');
} else {
$(ui.helper).removeClass('collides');