add float option

This commit is contained in:
Pavel Reznikov 2014-11-19 20:53:40 -08:00
parent 305dd8edfa
commit 8d8f3a9a60
2 changed files with 61 additions and 23 deletions

File diff suppressed because one or more lines are too long

View file

@ -8,8 +8,9 @@
var id_seq = 0;
var GridStackEngine = function (width, onchange) {
var GridStackEngine = function (width, onchange, float) {
this.width = width;
this.float = float || false;
this.nodes = [];
this.onchange = onchange || function () {};
@ -38,28 +39,47 @@
GridStackEngine.prototype._pack_nodes = function () {
this._sort_nodes();
_.each(this.nodes, function (n, i) {
while (n.y > 0) {
var new_y = n.y - 1;
var can_be_moved = i == 0;
if (this.float) {
_.each(this.nodes, function (n, i) {
if (n._updating || typeof n._orig_y == 'undefined' || n.y == n._orig_y)
return;
if (i > 0) {
var collision_node = _.chain(this.nodes)
.first(i)
.find(function (bn) {
return Utils.is_intercepted({x: n.x, y: new_y, width: n.width, height: n.height}, bn);
})
.value();
can_be_moved = typeof collision_node == 'undefined';
}
var collision_node = _.chain(this.nodes)
.find(function (bn) {
return n != bn && Utils.is_intercepted({x: n.x, y: n._orig_y, width: n.width, height: n.height}, bn);
})
.value();
if (!can_be_moved) {
break;
if (!collision_node) {
n._dirty = true;
n.y = n._orig_y;
}
n._dirty = n.y != new_y;
n.y = new_y;
}
}, this);
}, this);
}
else {
_.each(this.nodes, function (n, i) {
while (n.y > 0) {
var new_y = n.y - 1;
var can_be_moved = i == 0;
if (i > 0) {
var collision_node = _.chain(this.nodes)
.first(i)
.find(function (bn) {
return Utils.is_intercepted({x: n.x, y: new_y, width: n.width, height: n.height}, bn);
})
.value();
can_be_moved = typeof collision_node == 'undefined';
}
if (!can_be_moved) {
break;
}
n._dirty = n.y != new_y;
n.y = new_y;
}
}, this);
}
};
GridStackEngine.prototype._prepare_node = function (node, moving) {
@ -194,6 +214,20 @@
return _.reduce(this.nodes, function (memo, n) { return Math.max(memo, n.y + n.height); }, 0);
};
GridStackEngine.prototype.begin_update = function (node) {
_.each(this.nodes, function (n) {
n._orig_y = n.y;
});
node._updating = true;
};
GridStackEngine.prototype.end_update = function () {
var n = _.find(this.nodes, function (n) { return n._updating; });
if (n) {
n._updating = false;
}
};
var GridStack = function (el, opts) {
var self = this, one_column_mode;
@ -207,7 +241,8 @@
cell_height: 60,
vertical_margin: 20,
auto: true,
min_width: 768
min_width: 768,
float: false
});
this.grid = new GridStackEngine(this.opts.width, function (nodes) {
@ -223,7 +258,7 @@
.attr('data-gs-height', n.height);
}
});
});
}, this.opts.float);
if (this.opts.auto) {
this.container.find('.' + this.opts.item_class).each(function (index, el) {
@ -299,6 +334,7 @@
var on_start_moving = function (event, ui) {
var o = $(this);
self.grid.clean_nodes();
self.grid.begin_update(node);
cell_width = Math.ceil(o.outerWidth() / o.attr('data-gs-width'));
self.placeholder
.attr('data-gs-x', o.attr('data-gs-x'))
@ -322,6 +358,8 @@
self._update_container_height();
self.container.trigger('change', [self.grid.get_dirty_nodes()]);
self.grid.end_update();
self.grid._sort_nodes();
_.each(self.grid.nodes, function (node) {
node.el.detach();